2010-01-02 55 views
7

由於Servlet 3.0可以以編程方式向javax.servlet.ServletContext#addServlet註冊Servlet實例。這個類還有一個createServlet方法,它分析一些註釋並執行依賴注入。我不知道如果我不需要註釋處理,是否需要這種方法。我想有一個通常的構造函數通過依賴注入來設置所需的依賴關係的servlet。Servlet 3.0的構造函數依賴注入?

@Inject 
public MyServlet(SomeDependency sd) { // Constructor 
    ... 
} 

問題:

  • 是否有可能建立一個servlet實例 「手動」 無createServlet? (new MyServlet()
  • 是否可以使用Java EE服務器的依賴注入機制來執行構造函數注入?怎麼做?還是像Guice一樣需要單獨的DI框架?

回答

5

最近的Java EE 6標準現在支持servlet的依賴注入,相關部分稱爲JSR-299或CDI。 JSR-299參考實現JBoss weld可以部署到像Tomcat或Jetty這樣的servlet容器中,如果你不想使用完整的Java EE 6應用服務器如glassfish v3例如

順便說一下,使用嵌入式Jetty服務器,您可以使用其自定義API添加預配置的servlet實例。

+0

謝謝,JSR-299是我正在尋找的。 Weld文檔說:「我們可以通過將其注入到構造函數,bean的方法或字段,或者Java EE組件類(如servlet)的字段或方法中來獲取TextTranslator的實例。」 http://docs.jboss.org/weld/reference/1.0.0/en-US/html/intro.html這似乎是構造函數注入不可能與servlet。 – deamon 2010-01-04 12:24:38

+0

請注意,Weld的早期版本相當......如果您沒有使配置100%正確,則無益。這可能自那以來有所改善。 – 2017-02-20 11:28:49

3

Guice不需要Java EE服務器即可實現此功能。

http://code.google.com/p/google-guice/wiki/ServletModule

+3

Guice在servlet上添加一個圖層。這在Java EE 6之前很有用。今天,依賴注入是Java EE的一部分,如果可能,我寧願在沒有額外框架的情況下使用它。 – deamon 2010-01-03 10:57:34