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