#看了就会用的dagger2教程
之前学习过一段时间dagger2,因为没做笔记过了一段时间又模糊了,现在打算重新复习一遍,顺便写个博客,以免下次又忘记了。
###什么是dagger
dagger2是一个依赖注入框架,dagger是由Square公司维护,后来dagger2由Google来维护了,使用dagger的好处在于我们能够降低代码的耦合性,提升代码的可维护性。
环境搭建
GitHub地址:https://github.com/google/dagger
然后在build.gradle(app)中添加
compile ‘com.google.dagger?2.16’
annotationProcessor ‘com.google.dagger:dagger-compiler:2.16’
这个时候直接编译项目,会出现以下报错,在我个人的开发环境下是出现了,这里顺便做个记录,和解决方法
解决办法
添加如下两行:
javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true } }
multiDexEnabled true
使用
首先先简单介绍一下几个基本的注解
@Inject:
通常在需要依赖的地方使用这个注解。用来告诉Dagger这个类或者字段需要依赖注入。这样Dagger就会构造这个类的实例。
@Module:
Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里找需要的依赖。
@Provide:
在modules中,我们定义的方法是用这个注解,用来告诉Dagger我们想要构造的对象并提供这些依赖。
@Component:
Component从根本上来说就是一个注入器,也可以说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。
以上这四个注解是最基本的,我们先来写一段简单的代码测试使用一下
//TestBean
public class TestBean1 {
public TestBean1 () {
}
public void sayHello() {
Log.e("Dagger2Test", "Hello World");
}
}
//MainActivity
public class MainActivity extends AppCompatActivity {
@Inject
TestBean1 testBean1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DaggerTestComponent.create().inject(this);
setContentView(R.layout.activity_main);
testBean1.sayHello();
}
}
//TestModule
@Module
public class TestModule {
@Provides
public TestBean1 provideApiService() {
return new TestBean1 ();
}
}
//TestComponent
@Component(modules = TestModule.class)
public interface TestComponent {
void inject(MainActivity activity);
}
运行项目可以看到控制台打印出了log ,如下图所示:
到此我们已经掌握了Dagger2的简单基本使用。
现在假设一种情况,如果我们的TestBean1 的构造是需要参数的怎么办,如果我们的TestBean1的构造依赖于TestBean2我们应该如何实现,对于这个情况,一般有两种实现方法:
1. 在Module中使用 @Provides注解提供实现方法。
2. 在构造方法上使用@Inject注解。
接下来我们修改一下代码,测试一下刚刚上面的两种方法。
//修改TestModule如下
@Module
public class TestModule {
@Provides
public TestBean2 provideTestBean2(){
return new TestBean2();
}
@Provides
public TestBean1 provideTestBean1(TestBean2 testBean2) {
return new TestBean1(testBean2);
}
}
或者
//TestBean2
public class TestBean2 {
@Inject
public TestBean2() {
}
}
以上两种方法都是可行的。
Component在使用时的区别
DaggerTestComponent.create().inject(this);
DaggerTestComponent.builder().testModule(new
TestModule(this)).build().inject(this);
我们知道在使用的时候,需要通过Component来联系Module和Inject的,那上面这两种方法有什么不同呢,简单来说,当Module的构造函数需要参数时,使用第二种;没有的话就可以直接使用 create() 来实现,代码上也更加简洁。