用匕首2,我試圖注入在一個範圍內的多個位置的單個對象。但是,似乎我的解決方案每次都會創建一個新實例。匕首2單身不工作
在這個測試項目中,我有一個初始化DaggerModule一個MainActivity。 DaggerModule提供Box和Cat對象,Box以Cat作爲參數。我也在主動活動中接受貓。最後,我檢查注入的兩個Cat變量(分別在Box和MainActivity中)的引用,但它們不是同一個實例。
如果我在我的MainActivity中調用兩次provideCat(),則會提供相同的實例。
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;
}
}
在此先感謝!
編輯: 它的工作原理,如果provideBox發生在貓參數,並使用它來創建箱,而不是從內provideBox直接調用provideCat。
// Doesn't work, new Cat instance created.
@Provides
@Singleton
public Box provideBox() {
return new Box(provideCat());
}
VS
// Works, same singleton injected.
@Provides
@Singleton
public Box provideBox(Cat cat) {
return new Box(cat);
}
什麼叫provideCat在MainActivity並在DaggerModule內provideBox從這樣做有什麼區別?難道Dagger編譯器不會像處理外部類一樣處理DaggerModule,如果我在那裏調用provideCat,則註釋不會被應用?
行爲不同的原因是實例管理由組件實現處理,而不是模塊。當你直接調用方法時,它只會像調用其他任何Java方法一樣調用它,但是當你讓組件連接依賴時,它將使用'dagger.internal.ScopedProvider'來確保只有一個實例。 – gk5885 2015-04-08 22:50:07
此外,對於'@Inject'ed類型,您可以直接使用'@ Singleton'註釋類(本例中爲Cat和Box),並避免使用@ @提供方法。 – gk5885 2015-04-08 22:51:41
感謝您的信息和提示! – Johe 2015-04-10 20:39:13