结构注射器使用roboguice进入无限循环

时间:2013-08-26 16:14:43

标签: java android roboguice

我来自C#/ .NET的后台并且已经学会了使用一些Android.Now我开始构建一个小应用程序以获得乐趣,我想学习一个IoC框架。经过一些googeling我找到了roboguice。但我无法弄清楚如何整合它。等。

NET我曾与Ninject和Unity合作,我希望创建一种类似的构造函数注入形式,我从这些框架中获取。

这是我到目前为止所拥有的以及我认为我已经想到的内容:

这个类代表app bootstrapper,这里我将注册我的依赖配置类:

public class IOCApplication extends Application{

@Override
public void onCreate(){
    super.onCreate();
    RoboGuice.setBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE, RoboGuice.newDefaultRoboModule(this), new IOCModule());
}

}

这是Dependency配置类:

 public class IOCModule implements Module{

        @Override
        public void configure(com.google.inject.Binder binder) {
            binder.bind(ITest.class).to(Test.class);
        }
    }

在我的AndroidManifest中,我添加了这个:

<application ... android:name="com.example.project2.IOCApplication">

这一部分我并未真正理解为什么我必须添加,但我认为有必要告诉Android IOCApplication应首先进行实例化。

这是我的MainActivily类的clas,我为它添加了一个构造函数:

public ITest test;
public MainActivity(ITest test){
    this.test = test;
}

当我尝试在我的Android设备上运行时,看起来应用程序正在进入无限循环,我认为ITest不会被实例化。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

使用Android可以了解的一点是您没有实例化自己的活动,它就是系统。

因此,您无法对活动使用构造函数注入。 但是,您可以使用属性注入,这是更清洁的IMO。

扩展RoboActivity类是使用Activity注入的最简单方法。 RoboGuice为其他Android组件提供了类似的类(RoboFragmentRoboService等。)

public class MyActivity extends RoboActivity {

    @Inject
    ITest test;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // You can now use your test instance
    }

}

调用@Inject后,将super.onCreate(savedInstanceState);的所有属性都会被实例化。


使用 POJO (普通旧Java对象),您有更多选择:

属性注入

public class Test {
    @Inject
    private Service1 service1;
    @Inject
    private Service2 service2;

    public Test() {
    }
}

构造函数注入

public class Test {

    private Service1 service1;
    private Service2 service2;

    @Inject
    public Test(Service1 service1, Service2 service2) {
        this.service1 = service1;
        this.service2 = service2;
    }
}

请注意,如果构造函数具有参数,则必须具有@Inject注释。


您需要此行<application ... android:name="com.example.project2.IOCApplication">告诉系统您正在使用扩展的Application类。没有它,Android将使用基类。

我建议您阅读official documentation以获取更多信息。