簡體   English   中英

用 Java 玩 2.6 - 添加環境依賴注入

[英]Play 2.6 with Java - Adding Environment Dependency Injection

我需要在我的 java class 之一中使用 Play.Environment,如下所示。 我正在使用 Play 2.6.x。 你能幫我理解一下,如何在這里添加依賴注入。 我嘗試如下使用,但環境 object 是 NULL。

MyFile.java

public final class MyFinalClass  {

 @Inject
 static Environment env;

public static String getFilePath(String fileName)  {
        return env.rootPath().getAbsolutePath();
}
static {
//It has a static block and some code here. I dont have any constructor.
}
}

謝謝

/************************************************* ******************************/ 我已經修改了上面的代碼,使其成為 Singleton 如下:

MyFinalClass.java
public class MyFinalClass   implements IConfigurationManager {

    @Inject Environment env;
    private static MyFinalClass   INSTANCE;

    //Pvt Constructor
    private MyFinalClass  () {

    }

    //Create Singleton Instance
    public static MyFinalClass instance() {
        if(INSTANCE == null) {
            INSTANCE = new MyFinalClass();
        }
        return INSTANCE;
    }
}

//Module.java
class Module extends AbstractModule {
    @Override 
    protected void configure( {

        bind(MyFinalClass.class).asEagerSingleton();
      }

在這里我得到錯誤:類必須有一個(並且只有一個)用@Inject 注釋的構造函數或一個非私有的零參數構造函數。

然后我修改如下:

Environment env;
//Pvt Constructor
@Inject private MyFinalClass  (Environment env) {
    this.env = env;
}

在這里,我遇到了新的 MyFinalClass 期望參數的編譯問題。 你能幫忙嗎?

謝謝

不推薦Static 現場注入。 如果你真的需要你的 class 和方法 static 你應該使用 Guice 的requestStaticInjection(..) 您還可以將 MyFinalClass 設為 Singleton,在構造函數中注入 Environment,然后在需要使用 getFilePath(..) 的任何地方注入 MyFinalClass。

編輯:我看到你對 requestStaticInjection 的評論,所以這里是關於如何使用它的簡短描述。 老實說,我認為將 class 設為 Singleton 會更整潔。 如果您在 MyFinalClass 中有不想包含在 Singleton 中的東西,也許您應該創建一個新的 class。

要使用 requestStaticInjection() 你必須從一個模塊發出請求,並且這個模塊需要被加載

public class InjectorModule extends AbstractModule {
    @Override
    protected void configure() {
        requestStaticInjection(MyFinalClass.class);
    }
}

編輯 2 :您現在已將問題更改為使用 Singleton,但您做錯了。 檢查Play Docs ,您只需將 @Singleton 注釋添加到您的 class 中。

我們創建注入它的 singleton 和 controller class 的示例(我直接在編輯器中編寫此代碼,未測試代碼,但您明白了):

@Singleton
public class MyFinalClass {
    private Environment env;

    @Inject
    public MyFinalClass(Environment env) {
        this.env = env;
    }

    public String getFilePath(String fileName) {
        return env.rootPath().getAbsolutePath();
    }
}

public class TestController extends Controller {
    @Inject
    private MyFinalClass myFinalClass;

    public Result index() {
        String fileName = "test.tst";
        String filePath = myFinalClass.getFilePath(fileName);

        return ok(filePath);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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