使用 Dagger 2,我试图在单个范围内的多个位置注入一个单例对象。但是,似乎我的解决方案每次都会创建一个新实例。
在这个测试项目中,我有一个初始化 DaggerModule 的 MainActivity。DaggerModule 提供了 Box 和 Cat 对象,Box 以 Cat 为参数。我还在我的 MainActivity 中加入了 Cat。最后,我检查了注入的两个 Cat 变量的引用(分别在 Box 和 MainActivity 中),但它们不是同一个实例。
如果我在 MainActivity 中调用 provideCat() 两次,则会提供相同的实例。
主要活动:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerModule daggerModule = new DaggerModule();
DaggerComponent daggerComponent = Dagger_DaggerComponent.builder()
.daggerModule(daggerModule).build();
// Same Cat instance returned.
Cat cat1 = daggerComponent.provideCat();
Cat cat2 = daggerComponent.provideCat();
Log.d("=== cat1: ", cat1.toString());
Log.d("=== cat2: ", cat2.toString());
// Different Cat instance returned. Why?
Box box = daggerComponent.provideBox();
Log.d("=== box cat: ", box.getCat().toString());
}
}
@Module
public class DaggerModule {
@Provides
@Singleton
public Cat provideCat() {
return new Cat();
}
@Provides
@Singleton
public Box provideBox() {
return new Box(provideCat());
}
}
@Singleton
@Component(modules = { DaggerModule.class })
public interface DaggerComponent {
Cat provideCat();
Box provideBox();
}
public class Cat {
@Inject
public Cat() {
}
}
public class Box {
private Cat mCat;
@Inject
public Box(Cat cat) {
mCat = cat;
}
public Cat getCat() {
return mCat;
}
}
提前致谢!
编辑: 如果provideBox 接受一个Cat 参数并使用它来创建Box,而不是直接从provideBox 中调用provideCat,它就可以工作。
// Doesn't work, new Cat instance created.
@Provides
@Singleton
public Box provideBox() {
return new Box(provideCat());
}
对比
// Works, same singleton injected.
@Provides
@Singleton
public Box provideBox(Cat cat) {
return new Box(cat);
}
在 MainActivity 中调用 provideCat 和在 DaggerModule 的 provideBox 中调用有什么区别?难道 Dagger 编译器没有像处理外部类一样处理 DaggerModule 并且如果我在那里调用 provideCat 注释不会被应用?