本文針對(duì)的是dagger-2.22.1的簡(jiǎn)單使用
一、Dagger2使用
1. gradle引入dagger2依賴
implementation 'com.google.dagger:dagger:2.22.1'?
annotationProcessor 'com.google.dagger:dagger-compiler:2.22.1'
2. 定義可以被注入的實(shí)體類
@Singleton
public class ClassA ?{
? ? @Inject
? ? public?ClassA() { ?//... ? ? }
}
3. 定義需要注入的類
public class ClassB {
@Inject ClassA a;
}
4. 定義需要注入的類與被注入類之間的接口
@Singleton
@Component
public interface ClassBComponent {
? ??void inject(ClassB b);
}
4. 使用Dagger生成的Component在ClassB中注入ClassA,這里選擇在ClassB的構(gòu)造函數(shù)中注入
public class ClassB {?
? ? @Inject ClassA a;
? ? public ClassB() {
? ? ? ? DaggerClassBComponent.create().inject(this); //?DaggerClassBComponent由Dagger根據(jù)之前定義的component自動(dòng)生成,如果沒(méi)有生成rebuild
? ? }
}
至此Dagger2注入完成,這種注解方法需要編寫(xiě)和設(shè)計(jì)的類較多。
二、Dagger.Android
dagger.android對(duì)于Android開(kāi)發(fā)中的Activity和Fragment更加友好,接入更簡(jiǎn)單。
1.gradle引入Dagger.Android依賴
implementation 'com.google.dagger:dagger-android:2.22.1'
implementation 'com.google.dagger:dagger-android-support:2.22.1' ?//項(xiàng)目中使用了支持包時(shí)需要引入
annotationProcessor 'com.google.dagger:dagger-android-processor:2.22.1'
2. 創(chuàng)建自定義Application,BaseActivity, BaseFragment(如有Fragment)
public class BaseActivity extends AppCompatActivity {
? ??@Override
? ?protected void onCreate(@Nullable Bundle savedInstanceState) {
? ??????super.onCreate(savedInstanceState);
? ??????AndroidInjection.inject(this); // 在Activity中注入
? ? }
}
BaseFragment參照修改
3. 創(chuàng)建需要注入到具體Activity對(duì)應(yīng)的Module類
@Module
public abstract class TestActivityModule {
? ??@Provides
????static HelloBean provideABC() { ?// 這里的方法名必須provide開(kāi)頭,注入只認(rèn)類型
????????return new HelloBean();?
????}?
}
4. 創(chuàng)建全局Module,綁定具體的Activity/Fragment和Module的關(guān)聯(lián)
@Module
public abstract class AppModule {
????@ContributesAndroidInjector(modules = TestActivityModule.class)
????abstract TestActivity contributeTestActivityInjector();
? ? // 可以綁定多個(gè)
}
5. 創(chuàng)建全局Component,引入全局Module和Dagger.Android關(guān)聯(lián)Module
@Singleton
@Component(modules = {
? ??AppModule.class, //全局的Module,要確保提供的對(duì)象是全局唯一的
????AndroidInjectionModule.class, //在應(yīng)用程序的MainComponent(applocation 中inject了)中,注入AndroidInjectionModule,
? ??// 以確保Android的類(Activity、Fragment、Service、BroadcastReceiver及ContentProvider等)可以綁定。
????// 一般把AndroidInjectionModule放在ApplicationComponent中,其他的Component依賴Application即可
? ??AndroidSupportInjectionModule.class, //使用的Fragment 是V4 包中的?不然就只需要AndroidInjectionModule
)}
public interface AppComponent {
????void inject(TestApplication application);
}
6. 在自定義Application中添加注入,Activity有注入的需讓Application實(shí)現(xiàn)HasActivityInjector接口,F(xiàn)ragment需實(shí)現(xiàn)HasSupportFragmentInjector接口
public class KioskApplication extends Application implements HasActivityInjector, HasSupportFragmentInjector {
????@Override
????public void onCreate() {
? ??????DaggerAppComponent.create().inject(this); // 注入,DaggerAppComponent由Dagger根據(jù)AppComponent自動(dòng)生成
????}
????// BaseActivity注入實(shí)現(xiàn)
????@Inject DispatchingAndroidInjector<Activity> dispatchingActivityInjector;
????@Override
????public AndroidInjector<Activity> activityInjector() { return dispatchingActivityInjector;}
????// BaseFragment注入實(shí)現(xiàn)
????@Inject DispatchingAndroidInjector<Fragment> dispatchingFragmentInjector;
????@Override
????public AndroidInjector<Fragment> supportFragmentInjector() { return dispatchingFragmentInjector;}
}
7.在具體的Activity或Fragment要注入某個(gè)Bean或其他屬性直接在參數(shù)前加上@Inject即可,比如這里要在TestActivity中能自動(dòng)注入HelloBean,寫(xiě)法如下:
public class TestActivity extends BaseActivity {
????@Inject HelloBean helloBean; // 這樣寫(xiě)就可以自動(dòng)初始化完成了
}
Dagger.Android相對(duì)與單純的Dagger更適合Android使用,只要先完成對(duì)Base的實(shí)現(xiàn),后面添加新的Activity或Fragment時(shí)就會(huì)變的簡(jiǎn)單,也不需要對(duì)被注入的類進(jìn)行改造。
以上就是我對(duì)Dagger2接觸的一點(diǎn)理解,這里只是實(shí)戰(zhàn)的快速入門(mén),詳細(xì)的原理和示例參照官方文檔http://google.github.io/dagger