gpt4 book ai didi

java - 使用 roboguice 进行构造函数注入(inject)进入无限循环

转载 作者:行者123 更新时间:2023-12-01 14:12:00 24 4
gpt4 key购买 nike

嗨,我来自 C#/.NET 背景,已经学会了使用一些 Android。现在我想开始构建一个有趣的小应用程序,并且我尝试学习 IoC 框架。经过一番谷歌搜索后我找到了 roboguice。但我不知道如何集成它。上。

NET 我曾使用过 Ninject 和 Unity,并且希望创建与我从这些框架获得的类似形式的构造函数注入(inject)。

这是我到目前为止所拥有的以及我认为我已经弄清楚的:

此类代表应用程序 Bootstrap ,我将在此处注册我的依赖项配置类:

public class IOCApplication extends Application{

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

}

这是依赖项配置类:

 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 类,我为它添加了一个构造函数:

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

当我尝试在 Android 设备上运行此程序时,该应用程序似乎正在进入无限循环,并且我认为 ITest 并未实例化。

我做错了什么?

最佳答案

对于 Android 需要了解的一件事是,您不会实例化自己的 Activity,而是系统会实例化。

因此,您不能对 Activity 使用构造函数注入(inject)。但是,您可以使用属性注入(inject),在我看来这更干净。

扩展RoboActivity class 是使用 Activity 进行注入(inject)的最简单方法。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 对象),您有更多选择:

属性注入(inject)

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

public Test() {
}
}

构造函数注入(inject)

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类(class)。如果没有它,Android 将使用基类。

我鼓励您阅读official documentation了解更多信息。

关于java - 使用 roboguice 进行构造函数注入(inject)进入无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18448453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com