Используя Dagger 2, я пытаюсь внедрить одноэлементный объект в нескольких местах в одной области. Однако кажется, что мое решение вместо этого создает новый экземпляр каждый раз.
В этом тестовом проекте у меня есть MainActivity, который инициализирует DaggerModule. DaggerModule предоставляет объекты Box и Cat, при этом Box принимает параметр Cat. Я также принимаю участие в Cat in my MainActivity. Наконец, я проверяю ссылки на вложенные переменные Cat (в поле и в MainActivity соответственно), но они не являются одним и тем же экземпляром.
Если я сначала вызову функцию enableCat() в моей MainActivity, будет предоставлен тот же самый экземпляр.
MainActivity:
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;
}
}
Спасибо заранее!
Edit: Он работает, если функция allowBox принимает аргумент Cat и использует это для создания поля, вместо того, чтобы вызывать функцию allowCat непосредственно из allowBox.
// 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);
}
Какая разница между вызовом функции enableCat в MainActivity и его выполнением изнутри createBox в DaggerModule? Может быть, компилятор Dagger не обрабатывает DaggerModule так же, как это делает с внешними классами, и аннотации не применяются, если я вызываю там securityCat?