如何使用Dagger將對象注入Servlet?如何用匕首注入Servlet?
由於servlet容器實例化Servlet本身,它們不是用Dagger創建的。因此,我能看到注入的唯一機制是通過靜態注入,匕首主頁警告不要這樣做。是否有另一種(最佳實踐)的方式來做到這一點?
具體來說,我使用Jetty和GWT(我的servlets擴展了RemoteServiceServlet),但我不認爲這些細節很重要。
如何使用Dagger將對象注入Servlet?如何用匕首注入Servlet?
由於servlet容器實例化Servlet本身,它們不是用Dagger創建的。因此,我能看到注入的唯一機制是通過靜態注入,匕首主頁警告不要這樣做。是否有另一種(最佳實踐)的方式來做到這一點?
具體來說,我使用Jetty和GWT(我的servlets擴展了RemoteServiceServlet),但我不認爲這些細節很重要。
目前還沒有任何股票基礎架構代碼支持Dagger的Java EE servlet堆棧。
也就是說,有很多方法可以在家裏釀造它,直到我們找到它。如果你只使用它的單身人士,那麼你可以反映一些人在android上做的事情,並且在應用程序啓動時使用上下文監聽器初始化你的圖形,然後使用Servlet的init()方法自我注入
它當你嘗試向請求添加範圍時,會變得更加棘手 - 這不是不可能的,但它需要更多的腳手架。
雖然沒有現貨基礎設施對於這一點,我做了以下內容:
我把ObjectGraph
到Web服務器的ServletContext
。然後,對於每個Servlet中,我能做到以下幾點,
@Inject
SomeDependency dependency;
@Inject
SomeOtherDependency otherDependency;
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
((ObjectGraph) filterConfig.getServletContext().getAttribute(DaggerConstants.DAGGER_OBJECT_GRAPH)).inject(this);
}
,我以前定義的DaggerConstants
自己。
根據您的應用程序的不同,可能有多種方法可將ObjectGraph
加入ServletContext
。我們使用嵌入式碼頭服務器,因此我們在啓動期間控制所有內容。不知道你將如何在一個普通的容器中做到這一點,但假設你通過一些init servlet初始化你的主ObjecGraph
,你會在那裏做到這一點。我們的應用程序使用單個ObjectGraph爲整個應用程序,這可能不是你的情況
servletContext.setAttribute(DaggerConstants.DAGGER_OBJECT_GRAPH, objectGraph);
注意。
「與上下文監聽器」是什麼意思?你的意思是通過一個靜態變量將ObjectGraph傳遞給servlet,然後調用get或inject方法? – Ben 2013-04-24 02:13:39
不,從ServletContextListener中將其設置爲servlet上下文中的一個屬性,以便您可以從servlet的init中檢索它。 – 2013-04-24 19:17:35
我討厭上課!這樣做,我得到一個ClassCastException:java.lang.ClassCastException:ca.nanometrics.apollo.server.MissionControlApolloServer不能轉換爲ca.nanometrics.apollo.server.MissionControlApolloServer(即,不能將一個相同類型的對象轉換爲相同的類型 - servlet中的類加載問題!我正在使用Jetty,並使用WebAppContext自己啓動它。是否有解決方法? – Ben 2013-04-25 14:52:42