簡體   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