我正在使用启用Guice的框架。
当使用由框架(或覆盖现有绑定的子类)创建的类时,我可以非常容易地实例化框架提供的变量。无论我需要什么,这只是一个问题
@Inject
FrameworkProvidedType variable;
但是,在我自定义创建的类中,这不起作用。所有注入的变量都为空。
这是我的理解,为了使用注入,我的课必须有一个绑定。
如果我是现有框架类的子类,我可以覆盖模块类中的绑定。这非常简单。
但我有一个新类,我不知道如何将它绑定到底层框架。
public Class myCustomClass {
private String iNeedthis;
private Context thisToo;
@Inject
FrameWorkThing magic;
public myCustomClass(String iNeedThis, Context thisToo){
this.iNeedThis = iNeedThis;
this.thisToo = thisToo;
}
public void DoMagic(){
//null pointer error because magic was not injected
magic.doMagic(this.iNeedthis);
}
}
我如何启用这个新班级?
我在运行时模块中试过这个
public Class<myCustomClass> bindMyCustomClass(){
return MyCustomClass.class;
}
并且悲惨地失败了。
答案 0 :(得分:1)
不,谢谢@ bmorris591将问题从大门中解散出来,我找到了答案。
@将一个字段注入一个类意味着该类实例需要由Guice创建。
第1步是为班级创建工厂。这可能没有必要,但它对我有用。
public interface MyCustomClassFactory {
public MyCustomClass create(String iNeedThis, Context thisToo);
}
第2步是将工厂安装到Guice
@Override
public void configure(Binder binder) {
super.configure(binder);
binder.install(new FactoryModuleBuilder().build(MyCustomClass.class));
}
在我的特定情况下 - 我正在使用的框架提供了一个Module类,它是com.google.inject.Module的一个实现。
在该类中,是一个在启动时调用的“configure(Binder binder)”函数。
第3步实际上是注释构造函数
@Inject
public myCustomClass(String iNeedThis, Context thisToo){
this.iNeedThis = iNeedThis;
this.thisToo = thisToo;
}
使我走上正轨的有用和相关网页:
http://beust.com/weblog/2012/08/21/advanced-dependency-injection-with-guice/
这是关于辅助注射的,但是它提供了足够的信息和简单的理解,以便采取下一步非常容易。