Android使用Dagger2学习笔记

Dagger2是一个依赖注入框架。IoC(控制反转),DI(依赖注入)这些概念在JAVA EE开发中经常会使用到,同样的原理,使用到Android的开发中,也会使业务开发更加简单。

一. 引入依赖库:

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

二. 最简单的应用:

1.一个普通的实体类A,包含一个成员变量name,构造方法和get方法,唯一的不同点是构造方法上加了@Inject注解。

1
2
3
4
5
6
7
8
9
10
11
12
class A {
private String name;

@Inject
public A() {
name = "I am A";
}

public String getName() {
return name;
}
}

2.一个AComponent接口,不同的是带有@Component注解。

1
2
3
4
@Component
interface AComponent {
void inject(DemoActivity activity);
}

3.MainActivity类,它依赖实体类A,但是并没有手动构造一个A的对象,而是加入了这个语句:DaggerAComponent.builder().build().inject(this);
也可以用DaggerAComponent.create().inject(this);

1
2
3
4
5
6
7
8
9
10
11
12
public class DemoActivity extends Activity {

@Inject
A mA;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DaggerAComponent.builder().build().inject(this);
Toast.makeText(this, mA.getName(), Toast.LENGTH_SHORT).show();
}
}

这样就完成了最简单的依赖注入,程序正常执行,不会因为没有实例化mA而发生空指针异常。如果使用过ButterKnife,便会对Dagger2有似曾相识的感觉,在使用ButterKnife时,框架编译会帮我们生成若干findViewById(…)代码,我们只需调用ButterKnife.bind(this)一句,便可将带有@BindView(…)注解的视图对象实例化。类似的,我们在Dagger2使用中只需执行inject(this),框架便会帮我们实例化@Inject注解的依赖对象。说简单点就是一个Component把需要依赖的两个类关联起来。

三.使用Provider:

对于复杂的对象构造,我们就需要加入Provider,一些第三方的类,我们无法去给它加上@Inject,所以使用Provider,功能如其名,即实例化一些对象并提供出来给我们使用。

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
class A {
private String name;

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

public String getName() {
return name;
}
}

@Component(modules = AModule.class)
interface AComponent {
void inject(DemoActivity activity);
}

@Module
class AModule {
@Provides
A provideA() {
return new A("Hello World!!");
}
}

public class DemoActivity extends Activity {

@Inject
A mA;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DaggerAComponent.create().inject(this);
Toast.makeText(this, mA.getName(), Toast.LENGTH_SHORT).show();
}
}

代码中加入了一个Module类,其中的Provider方法用于提供实体类的构造器,在Component中也要通过注解来关联起来:@Component(modules = AModule.class),Provider来提供构造器。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器