@Inject
1.注解構造器
2.注解非private的類成員變量
3.注解方法,該方法在所在類的構造方法結束后立即調(diào)用,可用于安全的注入this
@Component
提供兩種方式定義方法,編譯后生成DaggerXXXComponent這個類,在目標類中使用,就可以實現(xiàn)依賴注入了
1.void inject(目標類 obj);
Dagger2會從目標類開始查找@Inject注解,自動生成依賴注入的代碼,調(diào)用inject可完成依賴的注入。
2.Object getObj(); 如: Pot getPot();
Dagger2會到Pot類中找被@Inject注解標注的構造器,自動生成提供Pot依賴的代碼,這種方式一般為其他Component提供依賴。(一個Component可以依賴另一個Component)
另外:
1.@Component可以指定多個@Module的,如果需要提供多個依賴的話。
2.Component可以依賴于其他Component,可以使用@Component的dependence,也可以使用@SubComponent,這樣就可以獲取其他Component的依賴了(即獲取其他Component指定的Module)。我們Component不需要重復的指定Module,可以直接依賴其它Component獲得。
@Scope
1.@Scope的作用:
它的作用只是保證依賴在@Component中是唯一的,可以理解為“局部單例”。
@Scope是需要成對存在的,在Module的Provide方法中使用了@Scope,那么對應的Component中也必須使用@Scope注解,當兩邊的@Scope名字一樣時(比如同為@Singleton), 那么該Provide方法提供的依賴將會在Component中保持“局部單例”。
而在Component中標注@Scope,provide方法沒有標注,那么這個Scope就不會起作用,而Component上的Scope的作用也只是為了能順利通過編譯,就像我剛剛定義的ActivityScope一樣。
2.如何使用Dagger2實現(xiàn)單例呢?
很簡單,做到以下兩點即可。
依賴在Component中是單例的(供該依賴的provide方法和對應的Component類使用同一個Scope注解。)
對應的Component在App中只初始化一次,每次注入依賴都使用這個Component對象。(在Application中創(chuàng)建該Component)