[英]Play framework 2.6 java websockets akka dependency injection
[英]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.