簡體   English   中英

將Guice與Play一起使用:只能對靜態字段進行注入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM