文章目录
  1. 1. Dagger2简单介绍
  2. 2. Dagger2实例
    1. 2.1. Dagger2环境搭建
    2. 2.2. 代码实现

Dagger2是首个使用生成代码实现完整依赖注入的框架,极大减少了使用者的编码负担,本文主要介绍如何使用Dagger2进行依赖注入。

Dagger2简单介绍

Dagger2,起源于Square的Dagger,是一个完全在编译期间进行的依赖注入框架,完全去除了反射。Dagger2是通过依赖注入让你少写很多公式化代码,更容易测试,降低耦合,创建可复用可互换的模块。

Dagger2实例

Dagger2环境搭建

project的build.gradle添加

1
2
3
4
dependencies {
... // 其他classpath
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //添加apt命令
}

module的build.gradle添加

1
2
3
4
5
6
7
apply plugin: 'com.neenbedankt.android-apt'//添加apt命令

dependencies {
apt 'com.google.dagger:dagger-compiler:2.0.2' //指定注解处理器
compile 'com.google.dagger:dagger:2.0.2' //dagger公用api
provided 'org.glassfish:javax.annotation:10.0-b28' //添加android缺失的部分javax注解
}

代码实现

Usermodele 是一些基本消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class UserModel {

private String id;
private String name;
private String gender;

public UserModel() {
}

public UserModel(String id, String name, String gender) {
this.id = id;
this.name = name;
this.gender = gender;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

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

public String getGender() {
return gender;
}

public void setGender(String gender) {
this.gender = gender;
}
}

Module其实就是一个依赖的制造工厂。我们只需要为其添加制造依赖的方法即可。

@Module
public class ActivityModule {

    @Provides
    public UserModel provideUserModel() {
        return new UserModel("1", "hjx", "man");
    }
}

注解@Module注明本类属于Module ,注解@Provides注明该方法是用来提供依赖对象的特殊方法 。
一个完整的Module必须拥有@Module与@Provides注解 。

Component就是一个将Module生成的实例注入Container中的注入器

@Component(modules = ActivityModule.class)
public interface ActivityComponent {
    void inject(MainActivity mainActivity);
}

@Component使用modules指向使用的Module的集合。 所有的Component都必须以接口形式定义。Dagger2框架将自动生成Component的实现类,对应的类名是Dagger×××××,这个例子中对应的实现类是DaggerActivityComponent,添加注入方法,一般使用inject做为方法名,方法参数为对应的Container。

Container就是可以被注入依赖关系的容器,这里的容器为Activity。具体实现如下

public class MainActivity extends AppCompatActivity {

    private ActivityComponent mActivityComponent;

    @Inject
    UserModel mUserModel;   //不能为private

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mActivityComponent = DaggerActivityComponent.builder().
                activityModule(new ActivityModule()).build();
        mActivityComponent.inject(this);
        ((TextView) findViewById(R.id.textView)).
                setText("ID:" + mUserModel.getId() + " Name: " + mUserModel.getName()
                 + "  Gender: " + mUserModel.getGender());
    }
}

Container中@Inject标记需要被注入的对象,mActivityComponent.inject(this)表示将调用Component的实现类将Module的生成的对象注入到mUserModel中。

到这为止,怎样使用Dagger2进行依赖注入的小demo已经完成了,代码已经上传到Github

欢迎大家关注我的微信公众号,我会不定期的分享些Android开发的技巧

文章目录
  1. 1. Dagger2简单介绍
  2. 2. Dagger2实例
    1. 2.1. Dagger2环境搭建
    2. 2.2. 代码实现