Dagger2(初步探索一)

第一步:配置
1.

 dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
apply plugin: 'com.neenbedankt.android-apt'

2.

apply plugin: 'com.neenbedankt.android-apt'

3.

  //Required by Dagger2
    apt 'com.google.dagger:dagger-compiler:2.0.2'
    compile 'com.google.dagger:dagger:2.0.2'
    // Dagger 2 中会用到 @Generated 注解,而 Android SDK 中没有 javax.anotation.Generated.class,所以在 Android 项目要添加此句
    provided 'org.glassfish:javax.annotation:10.0-b28'

第二步:demo
1.创建要注入的类

public class AClass {
    public String name;

    @Inject
    public AClass(String name){
        this.name=name;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class BClass {
    public String name;

    @Inject
    public BClass(String name){
        this.name=name;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

2.创建Module

@Module
public class Model {

    private String name;

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

    @Provides
    public AClass provideAClass(){
        return new AClass(name);
    }

    /*参数必须得提供,否则生成不了dagger+component*/
    @Provides
    public BClass provideBClass(String name){
        return new BClass(name);
    }

    /*提供B类的字符串,在同一类中,provideBClass默认会自动寻找需要的返回类型,故不能重复*/
    @Provides
    public String provideString(){
        return "B";
    }

3.构造Component,负责注入

@Component(modules = Model.class)
public interface MyComponent {
    void inject(MainActivity activity);
}

4.进行注入

public class MainActivity extends AppCompatActivity {

    @Inject
    AClass aClass;
    @Inject
    BClass bClass;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /*注入到activity中*/
        DaggerMyComponent.builder().model(new Model("A")).build().inject(this);
        Log.e("yan", aClass.getName()+","+bClass.getName());
    }

}

注:如果找不到DaggerMyComponent,请编译下项目。

打印: A,B

OK,最简单的一套流程已经走完,下面进行简单的拓展。

1.关于@Qualifier限定符的使用
@Qualifier:限定符,当类的类型不足以鉴别一个依赖的时候,我们就可以使用这个注解来区分。例如:在 Android 中,我们会需要不同类型的 Context,所以我们可以定义 @Qualifier 注解 @ForApplication 和 @ForActivity,这样当注入一个 Context 的时候,我们就可以告诉 Dagger 我们想要哪种类型的 Context。
下面列举一个其他的示例(初入研究,如有问题,请指正)

需求分析:倘若我要在Model中

     @Provides
    public BClass provideBClass(String name){
        return new BClass(name);
    }
     @Provides
    public String provideString(){
        return "B";
    }

不止一个这样的提供,还有可能加上下面的

    @Provides
    public AClass provideAClass(String name){
        return new AClass(name);
    }
    @Provides
    public String provideString(){
        return "A";
    }

这样就会报错了,提示provideString已经定义过,那么我们可以通过引入自定义@Qualifier来解决这种冲突。

1.首先定义操作符

@Qualifier

public @interface StringQuali {
    String value() default "";
}

2.

 @Provides
    public AClass provideQualiAClass(@StringQuali("a") String name) {
        return new AClass(name);
    }

    //参数必须得提供,否则生成不了dagger+component
    @Provides
    public BClass provideQualiBClass(@StringQuali("b") String name) {
        return new BClass(name);
    }

    @Provides
    @StringQuali("a")
    public String provideAString() {
        return "小红A";
    }

    //提供B类的字符串,在同一类中,provideBClass默认会自动寻找需要的返回类型,故不能重复
    @Provides
    @StringQuali("b")
    public String provideBString() {
        return "小红B";
    }

本期就介绍那么多,还有一些操作符,以后遇到再总结。
附 源码地址

你可能感兴趣的:(android)