本系列博客主要用於本身學習積累,順便幫助新手入門,若有問題,多多包涵。更詳細的一些使用能夠看看其餘更加詳細的博客。android
dagger android 學習(一):dagger基礎使用
dagger android 學習(二):AndroidInjector的使用
dagger android 學習(三):ContributesAndroidInjector的進一步優化
dagger android 學習(四):基於dagger2的mvp架構git
implementation 'com.google.dagger:dagger:2.21'
annotationProcessor 'com.google.dagger:dagger-compiler:2.21'
複製代碼
用來標記構造函數,以及標記實例,這樣使用被標記的對象的時候,會自動調用所標記的構造函數來建立對象。github
用於標記提供對象的類,這個類負責提供一些咱們須要的對象,好比SharedPreferences是經過構造函數沒法直接提供的,這時候就能夠經過一個有@Module的類,這個類負責提供內容架構
Module標記了提供對象的類,而Provides則標記了這個類裏面提供對象的方法,例如:app
@Module
public class ABParamModule {
A a;
B b;
public ABParamModule(A a, B b) {
this.a = a;
this.b = b;
}
@Provides
public A provideA2() {
return a;
}
@Provides
public B provideB2() {
return b;
}
@Provides
public C provideC() {
return new C(a,b);
}
}
複製代碼
Component用於標記接口,這個接口把提供依賴的類,和使用依賴的類串聯起來ide
用於標記類,在同時被標記的類的範圍裏,對象建立回是單例的函數
Bean類:post
public class A {
@Inject
public A(){
}
public void someThingA(){
Log.e("DAGGER", "someThingA");
}
}
public class B {
@Inject
public B(){
}
public void someThingB(){
Log.e("DAGGER", "someThingB");
}
}
public class C {
private A a;
private B b;
@Inject
public C(A a, B b) {
this.a = a;
this.b = b;
}
public void doSomethingC(){
a.someThingA();
b.someThingB();
}
}
@Singleton
public class UserInfo {
@Inject
public UserInfo(){
}
private String userName;
private String age;
private int id;
public int getId() {
return id;
}
public String getAge() {
return age;
}
public String getUserName() {
return userName;
}
public void setAge(String age) {
this.age = age;
}
public void setId(int id) {
this.id = id;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
複製代碼
Module類:學習
@Module
public class ABParamModule {
A a;
B b;
public ABParamModule(A a, B b) {
this.a = a;
this.b = b;
}
@Provides
public A provideA2() {
return a;
}
@Provides
public B provideB2() {
return b;
}
@Provides
public C provideC() {
return new C(a,b);
}
}
複製代碼
Component類:優化
@Singleton
@Component
public interface MyAppComponent {
void inject(MainActivity activity);
}
複製代碼
Activity使用:
public class MainActivity extends AppCompatActivity {
@Inject
A a;
@Inject
C c;
@Inject
UserInfo userInfo;
@Inject
UserInfo userInfo2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerMyAppComponent.builder().build().inject(this);
a.someThingA();
c.doSomethingC();
userInfo.setAge("111");
Log.e("DAGGER", userInfo.toString());
Log.e("DAGGER", userInfo2.toString());
}
}
複製代碼
打印結果: 由於UserInfo被Singleton標記了,因此這是一個單例。這樣最簡單的一個dagger2使用就完成了。
9-04-19 17:37:42.986 23362-23362/? E/DAGGER: someThingA
2019-04-19 17:37:42.986 23362-23362/? E/DAGGER: someThingA
2019-04-19 17:37:42.986 23362-23362/? E/DAGGER: someThingB
2019-04-19 17:37:42.986 23362-23362/? E/DAGGER: com.xiaoqi.daggerandroid.UserInfo@9c4fd37
2019-04-19 17:37:42.986 23362-23362/? E/DAGGER: com.xiaoqi.daggerandroid.UserInfo@9c4fd37
複製代碼
demo地址:查看項目中的app-simple