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

如果我按如下方式使用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。

07-24 19:53