使用Guice与自定义类?

时间:2013-04-10 20:39:47

标签: java guice

我正在使用启用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;
}

并且悲惨地失败了。

1 个答案:

答案 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/

这是关于辅助注射的,但是它提供了足够的信息和简单的理解,以便采取下一步非常容易。