[英]Using Guice with Play: Injection possible for static fields only
我是Play的忠實擁護者,如今我幾乎在任何我的項目中都使用它。 但是,隨着我的項目之一變得更大,我決定包括一個DI解決方案。 在Spring和Guice之間進行了短暫的考慮之后,我停下了Guice並添加了Play的Guice模塊( http://www.playframework.com/modules/guice-1.0/home )。
它的問題似乎是注入僅適用於靜態場的事實。 這意味着我將必須執行以下操作:
@InjectSupport
public class MyService {
@Inject
static MyBean myBean;
}
來自( http://java.dzone.com/articles/dependency-injection-play )
這讓我有些害怕,尤其是在測試方面。 我的意思是,確實,大多數DI解決方案總是嘗試注入單例,例如,Spring為每個bean創建一個實例並注入它,最后還是一樣。 我應該擔心這些嗎?
您絕對可以通過Play執行Guice注入。
您不應使用舊的Guice模塊(1.0版)。 您所指的教程還使用了舊版Guice和舊版Play(1.2版!)
請看一下新的Guice模塊(3.0版)和Play(2.1.1版)
http://www.playframework.com/documentation/2.1.1/JavaInjection
注入實例變量時,需要動態創建控制器
在您的路線文件中:
GET / @controllers.Application.index()
在您的Global.java中,您需要重寫getControllerInstance:
@Override public <A> A getControllerInstance(Class<A> controllerClass) throws Exception { return INJECTOR.getInstance(controllerClass); }
在Play 1中,您可以輕松地將正常的Guice單例與靜態注入的控制器字段組合在一起,其竅門是使批注導入正確。
在您的播放控制器中,需要靜態注入的作業和測試類使用JSR330注釋版本:
import javax.inject.Inject;
public class Application extends Controller {
@Inject private static MyService myService;
....
}
對於需要@InjectSupport的其他類,請使用JSR330 / module導入:
import play.modules.guice.InjectSupport;
import javax.inject.Inject;
@InjectSupport
public class AnotherClass {
@Inject private static MyService myService;
}
對於Guice庫實例化的實際(非靜態)服務,您需要使用Guice批注版本(請注意com.google.inject包):
import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
public class MyService {
@Inject private AnotherService anotherService; // note non-static injection
}
您還需要一個空模塊來開始工作:
import com.google.inject.AbstractModule;
public class MainModule extends AbstractModule {
@Override
protected void configure() {}
}
這也應該適用於以@Singleton以外的其他方式創建的Guice類,例如@Provides,盡管我還沒有嘗試過。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.