Dagger2及Dagger.Android簡(jiǎn)單使用

本文針對(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容