安卓学习笔记(二)-Dagger2

Dagger2是一个依赖注入框架,依赖注入是面向对象编程的一种设计模式,其目的是为了降低程序耦合,这个耦合就是类之间的依赖引起的.当场景复杂时,通过构造方法调用一个类,当需求改动的时候会发现类与类之间的耦合性太高了,尤其是类在多处调用.

Dagger2的使用

1.导入

compile"com.google.dagger:dagger:2.15"
annotationProcessor"com.google.dagger:dagger-compiler:2.15"

2.定义一个注解Scope

@Scope
@Documented
@Retention(RUNTIME)
public @interface ActivityScope {}

Scope 规定类或方法的使用范围

3.创建一个Module

@Module
public class UserModule {

    @ActivityScope
    @Provides
    RecyclerView.LayoutManager provideLayoutManager() {
        return new GridLayoutManager(view.getActivity(), 2);
    }
    ...
}

Module类提供那些没有构造函数的类的依赖,如第三方类库,系统类,接口类,类需要@Module注解,方法需要@Provides注解

4.创建一个Component

@ActivityScope
@Component(modules = UserModule.class)
public interface UserComponent {
    void inject(UserActivity activity);
}

Component 注解修饰的接口或抽象类,负责在@Inject和@Module之间建立连接,当实例化@Inject注解的类时,遇到没有构造函数的成员变量依赖,则该依赖由@Module修饰的类提供。inject方法用于获取对象的实例。

5.简单使用例子

@Inject
RecyclerView.LayoutManager mLayoutManager;
...
DaggerUserComponent
                .builder()
                .build()
                .inject(this);
...

在UserActivity中通过@Inject注解,把Module中提供的RecyclerView.LayoutManager注入进来

6.使用构造方法注入

@Inject
UserPresenter mPresenter;
...

@Inject
public UserPresenter() {
        
}

Dagger2遇到@Inject标记的成员属性,就会去查看该成员类的构造函数,如果构造函数也被@Inject标记,则会自动初始化,完成依赖注入。

7.@Module和@Inject注入区别

1.查找Module中是否存在创建该类型的方法(前提是@Conponent标记的接口中包含了@Module标记的Module类,如果没有则直接找@Inject对应的构造方法)
 1.2 若存在方法,查看该方法是否有参数
        若不存在参数,直接初始化该类的实例,一次依赖注入到此结束。
        若存在参数,则从步骤1开始初始化每个参数
 1.3 若不存在创建类方法,则查找该类型的类中有@Inject标记的构造方法,查看构造方法中是否有参数
        若构造方法中无参数,则直接初始化该类实例,一次依赖注入到此结束。
        若构造方法中有参数,从步骤1依次开始初始化每个参数。

8.更多注解

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2018/0102/90
https://www.jianshu.com/p/47c7306b299447.html

你可能感兴趣的:(安卓学习笔记(二)-Dagger2)