繁体   English   中英

为什么EJB中不需要初始化?

[英]Why Initialization is not required in EJB?

我是Struts2框架和EJB的新手。 我有一个LoginDAO类,它实现了checkUser接口的LoginDAOLocal方法。 我不明白为什么我会看到以下情况的不同行为:

如果我使用EJB( LoginDAO是无状态会话bean),如下所示,方法调用完美地运行而没有任何错误。

@EJB
private LoginDAOLocal loginDao;
loginDao.checkUser(userName,password);

如果我按如下方式使用Struts2,它会为方法调用提供Null指针异常。

public class LoginAction extends ActionSupport {

    // Getters setters for userName and password)
    private LoginDAOLocal loginDao;
    loginDao.checkUser(this.userName,this.password);
}

如果我使用一个简单的Java应用程序(没有EJB或Struts2),方法调用会创建一个编译时错误,说明loginDao未初始化

public static void main(String[] args) {

    LoginDAOLocal loginDao;
    loginDao.checkUser(userName,password);
}

有人能解释为什么这种不同的行为?

没有太多了解Java EE规范:EJB由J2EE服务器(JBoss \\ Websphere等)中存在的EJB容器管理。 容器控制bean生命周期,并负责根据应用程序需要创建\\销毁bean。

当用完容器(简单的java应用程序)时,即使将@EJB注释添加到字段成员,也不会初始化bean并且没有JNDI上下文来获取bean。

我们可以说有两种方法可以管理bean,使用容器(由容器管理),或者由另一个组件(由servlet,监听器或过滤器管理)。

使用容器管理的组件,容器注入引用。 例如:

@WebServlet("/test")
public class MyServlet extends HttpServlet {

    @Resource(lookup = "jdbc/TestDS")
    private DataSource testDS;

}

相比之下,由bean管理的组件,例如:

@Namespace("/User")
@ResultPath(value = "/")
@Result(name = "success", location = "pages/login.jsp")
public class LoginAction extends ActionSupport {

}

由过滤器org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter管理。 后者应该负责执行依赖注入 例如, Spring负责注入所有必需的依赖项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM