2010-01-18 50 views
9

有兩種方法,我知道的,以獲得EJB實例:通過Context.lookup EJB3 - 通過注入和查找獲取bean - 有什麼區別,含義,陷阱?

  • JNDI查找任何地方
  • 什麼是通過@EJB註釋

    • 依賴注入的servlet和EJB使用這兩種方法的區別,含義和陷阱?他們是一樣的嗎?依賴注入比查找更快嗎?關於事務處理和對象生命週期管理呢?

      事情我知道的包括:

      註釋

      • 用servlet和和EJB只
      • 語法方便
      • 容器獨立

      查找

      作品
      • 可以在運行時以編程方式實例化EJB接口的不同實現。
      • 從任何地方 - 例如,的POJO。
      • 取決於命名容器的約定

    回答

    2

    查找取決於JNDI實現的存在,那就是你必須配置才能運行單元測試JNDI實現,然後註釋字段可以手動配置。

    6

    兩者都達到相同的結果。這更多的是聯軸器。通過註釋,您可以實現鬆耦合,並且更容易進行模擬和測試。通過直接查找,您取決於有時可能不方便的初始上下文。

    恕我直言lookup does not work everywhere。例如在Glassfish中,只有在使用POJO的其中一個會話bean上使用@EJBs(...)先前「導入」了POJO中的本地EJB查找。見this discussion。您需要了解本地全球 JNDI之間的區別。

    我的建議是:儘可能多地使用註釋。如果POJO需要對EJB的引用,則將其作爲參數傳遞(例如在構造函數中)。這就是所謂的依賴倒置,無論如何都是一個好的做法。

    0

    我認爲這很難模擬帶註釋的EJB。當使用查找時,您可以根據您的環境構建一些開關(測試 - > LoginMockBean,生產 - > LoginBean)。

    +2

    這只是錯誤的。如果它是由容器注入的,這意味着你可以在測試中更容易注入它,例如'MyBean bean = new MyBean(); bean.injectedBean = new Mock()'。掛鉤查找更復雜,特別是如果代碼依賴於'New InitialContext()'。你如何爲測試返回特殊版本的上下文? – ewernli 2012-10-02 12:44:39

    相關問題