解析Dagger2

一:Dagger2是什么?

是一个依赖注入框架,butterknife也是一个依赖注入框架。不过butterknife,最多叫奶油刀,Dagger2被叫做利器啊,他的主要作用,就是对象的管理,其目的是为了降低程序耦合。

二:为什么要有Dagger2

public class A{
	public void eat(){
	System.out.print("吃饭了")
	}
}

使用的时候我们就要

A a  = new A();
a.eat();

如果现在改了,早A的构造方法中必须传入B对象

public class A {
    private B b;
    public A(B b) {
        this.b = b;
    }
    public void eat() {
        System.out.print("吃饭了");
    }
}

那么使用的时候

A a = new A(new B());
a.eat();

三:Dagger2如何使用

上来给你说,怎么玩,肯定懵逼,这里我简单说一下几个概念,想有个认知,在往下看,会好很多,Dagger 是通过@Inject使用具体的某个对象,这个对象呢,是由@Provides注解提供,但是呢,这个@Provides只能在固定的模块中,也就是@Module注解,我们查找的时候,不是直接去找模块,而是去找@Component

解析Dagger2

想要获取a对象的示例的时候,Dagger2 会先去找,当前Activity或者Fragment所连接的桥梁,例如上图中,连接的只有一个桥梁,实际上可以有多个,这个桥梁,会去寻找他所依赖的模块,如图中,依赖了模块A,和模块B,然后在模块中,会去寻找@Providers注解,去寻找A的实例化对象。

2. 如何使用Dagger2

https://www.jianshu.com/p/2cd491f0da01

四: MVP + Dagger2

这是现在主流的设计架构
MVP,这个我会在后面的文章介绍,这里不做太多解释
当你了解MVP 的时候,你就知道,所有的业务逻辑全在Presenter,

换句话, presenter 持有的对象,控制着你程序的全部逻辑,这在dagger 中,讲白了 我们只要将所有的presetner 对象控制就可以了
下面附上目录结构,当然仅仅作为参考。dagger 强大的用法还是需要各位自己去体会,下面的项目 是我刚刚学会dagger 时候 写的一个项目
可以看到 ,我是 将所有的activity 或者 fragment 全部添加在同一个Component中,当然现在的话 不推荐,比如Utils 你可以专门做一个Component,
首先放上我的Module,公司项目,很多东西没敢放上来,体谅,可以看到 我这里提供了一个SplashPresenter,也就是启动页的Presneter,业务逻辑

@Module
public class ApiModule {

    public ApiModule() {

    }

    @Provides
    @Singleton
    Handler provideHandler() {
        return new Handler();
    }

    @Provides
    @Singleton
    SQLiteDatabase provideSQLiteDatabase() {
        return new DataBaseHelper(MyApp.context, Config.SqlName, null, Config.SqlVersion).getWritableDatabase();
    }

    /**
     * @ User :  allens
     * @ 创建日期 :  2017/7/13 下午3:24
     * @模块作用 :
     * <p>
     * ====================================================================================================================================
     * ====================================================================================================================================
     */
    private SplashPresenter splashPresenter;

    public ApiModule(SplashAct splashAct) {
        splashPresenter = new SplashPresenter(splashAct, new SplashModel());
    }

    @Provides
    @Singleton
    SplashPresenter provideSplashPresenter() {
        return splashPresenter;
    }

    .....
}
public class SplashAct extends BaseActivity implements SplashContract.View {


    @Inject
    SplashPresenter presenter;

    @Inject
    Handler handler;

    @Inject
    ApiService apiService;

    @Override
    protected void onCreate() {
        setContentView(R.layout.activity_splash);
    }

    @Override
    protected void initInject() {
        DaggerApiComponent.builder()
                .apiModule(new ApiModule(this))
                .build()
                .inject(this);
    }

    @Override
    protected void initListener() {
        presenter.getWordsInfo(true, apiService);
    }

    @Override
    public void gotoLogInAct() {
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                startActivity(new Intent(SplashAct.this, LogInAct.class));
                finish();
            }
        }, 1500);
    }
}
上一篇:Dagger是什么


下一篇:Coroutine 协程