簡體   English   中英

Guice Inject Field中的字段不是由Guice創建的

[英]Guice Inject Field in class not created by Guice

我有一個這樣的類,我在我的代碼中創建自己:

class StarryEyes {
   @Inject MyValidator validator;

   public StarryEyes(String name) {
      //..
   }

   public doSomething() {
      // validator is NULL
   }
}

我希望Guice注入一個驗證器實例,它有一個@Singleton注釋。 我有一個在啟動時加載的模塊,它包含以下行:

bind(MyValidator.class);

但是,它似乎不起作用,因為“驗證器”始終為空。 我試過了很多變化,比如:

bind(MyValidator.class)toInstance(new MyValidator());

或其他類似的事情。 這不是Guice應該如何運作的嗎?

通常Guice需要創建對象來注入它們。 如果您只是調用new StarryEyes(name) ,Guice將永遠不會看到該對象,因此它無法注入它。 您可以做的一件事是在創建對象后調用injector.injectMembers(obj) 但是,我不建議您這樣做,因為您應該避免在代碼中引用注入器。

你真正想要的是Assisted Inject 使用Assisted Inject,您將為您的類聲明構造函數,如下所示:

@Inject public StarryEyes(MyValidator validator, @Assisted String name)

這意味着validator是Guice應該注入的參數,而name必須是“輔助的”(即,在創建實例時提供)。

然后,您創建一個這樣的界面:

public interface StarryEyesFactory {
  StarryEyes create(String name);
}

通過Assisted Inject,Guice可以為您實現該工廠。 你像這樣綁定它:

bind(StarryEyesFactory.class).toProvider(
    FactoryProvider.newFactory(StarryEyesFactory.class, StarryEyes.class));

然后,您可以在任何想要創建它的實例的地方注入StarryEyesFactory 如果您以前調用過new StarryEyes(name) ,現在調用starryEyesFactory.create(name) 在工廠中調用create(name)時,它將獲取名稱並將其傳遞給構造函數並提供綁定的驗證器本身。

從Guice 3開始 ,您可以使用FactoryModuleBuilder執行此操作:

install(new FactoryModuleBuilder().build(StarryEyesFactory.class));

暫無
暫無

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

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