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来提供构造器。
上一篇:Python+OpenCV图像处理学习笔记
下一篇:SpringBoot学习之入门学习笔记