Dagger2 - 漸入二(提高)

背景

在前一篇 Daager2-初認識一 中咱們認識了簡單的Dagger2的使用和依賴注入的優勢,這章繼續深刻的研究和學習Dagger2的使用,後續會結合mvp主流框架給你們一步步講解如何運用dagger2封裝大項目的開發框架!html

Daager2-初認識一java


Component提供依賴

上一節咱們講解了moudel的依賴方法,其實Component也能夠提供依賴實現以下:緩存


實現

1.建立一個新的數據對象,提供Component以來演示

public class Info {
    private String msg;
}複製代碼

2.經過傳值建立對應的module對象

@Module
public class InfoModule {
    private String name;

    public InfoModule(String name) {
        this.name = name;
    }

    @Provides
    Info provideInfo(){
        return new Info(name);
    }
}複製代碼

3.實現依賴的InfoComponent

由於InfoComponent 不須要注入activity使用,因此不用寫對應的inject方法,直接提供Info 回調便可框架

@Component(modules = {InfoModule.class})
public interface InfoComponent {
    Info infoMoudule();
}複製代碼

對比ide

@Component(modules = UserModule.class)
public interface UserComponent {
    void inject(MainActivity mainActivity);
}複製代碼

4.將InfoComponent 提供依賴給UserComponent

使用dependencies 標識依賴Component 對象post

@Component(modules = UserModule.class,dependencies = InfoComponent.class)
public interface UserComponent {

    void inject(MainActivity mainActivity);
}複製代碼

5.activity中實現依賴注入

和以前注入方法同樣,不過這裏多出了infoComponent方法(自動生成)提供component依賴,成功之後咱們能夠@Inject獲得一個Info 對象學習

public class MainActivity extends AppCompatActivity {
    @Inject
    User user;
    @Inject
    Info info;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        InfoComponent infoComponent= DaggerInfoComponent.builder().infoModule(new InfoModule("AAAAA")).build();
        UserComponent  component= DaggerUserComponent.builder().userModule(new UserModule()).infoComponent(infoComponent).build();
        component.inject(this);
        TextView textView=(TextView)findViewById(R.id.tv);
        textView.setText("name:"+user.getName()+"\nsex:"+user.getSex()+"\nads:"+user.getAds()+"\ninfo->>>"+info.getMsg());
    }
}複製代碼

效果

這裏寫圖片描述


提高

到目前爲止咱們已經學習了兩種依賴方式一種是moudel一種是component,基本已經知足了平常的使用,接下來咱們提高學習一些更加有用的註解方法ui


@Scope用法

Scopes但是很是的有用,Dagger2能夠經過自定義註解限定註解做用域;其實這裏就是生命週期的 意思,咱們能夠經過@Scopes類定義一個componet或者module的生命週期,好比咱們須要讓依賴的對象和咱們的activity生命週期同樣,自動銷燬this

使用

經過@Scope咱們定義了一個@interface PerApp註解,經過這個註解咱們能夠標示一個對象的生命週期!spa

@Scope
@Documented
@Retention(RUNTIME)
public @interface PerApp {
}複製代碼

運用:

@PerApp
@Component(modules = UserModule.class,dependencies = InfoComponent.class)
public interface UserComponent {
    void inject(MainActivity mainActivity);
}複製代碼

@Singleton

@Singleton標示當前方法和對象是單利模式

@PerApp
@Singleton
@Component(modules = UserModule.class,dependencies = InfoComponent.class)
public interface UserComponent {
    void inject(MainActivity mainActivity);
}複製代碼
@Module
public class UserModule {

    @Provides
    @Singleton
    User provideUser(){
        return new User("xxxx","SEX","XXX@Gmail.com");
    }
}複製代碼

經過兩章基礎學習,咱們已經掌握了dagger2的基本用法,在此基礎上已經能夠自由擴展咱們的框架了;好比如今要封裝一個這樣的框架:咱們經過dagger2依賴去構建一個component依賴,提供了全局的開發中的公用對象:圖片管理器;緩存;服務;http請求..............
咱們能夠經過component依賴注入到須要使用的activity中,實現dagger2全局依賴的效果!

大體結構

@Singleton
@Component(modules = {AppModule.class, ClientModule.class, ServiceModule.class, ImageModule.class, CacheModule.class})
public interface AppComponent {
    Application Application();

    //服務管理器,retrofitApi
    ServiceManager serviceManager();

    //緩存管理器
    CacheManager cacheManager();

    //Rxjava錯誤處理管理類
    RxErrorHandler rxErrorHandler();

    //用於請求權限,適配6.0的權限管理
    RxPermissions rxPermissions();

    OkHttpClient okHttpClient();

    //圖片管理器,用於加載圖片的管理類,默認使用glide,使用策略模式,可替換框架
    ImageLoader imageLoader();

    //gson
    Gson gson();
}複製代碼

你們能夠自由想象,自由設計,趕忙將dagger2運用到你的項目中吧!裝逼開始了


專欄

註解專欄


源碼

源碼傳送門


建議

若是你有任何的問題和建議歡迎加入QQ羣告訴我!

相關文章
相關標籤/搜索