Android Dagger
前言:学习Dagger首先要了解什么是依赖注入(Dependency Injection),为什么需要依赖注入,了解这些以后就可以进入Dagger的学习,现在大部分的项目都在使用Dagger2,我们先就Dagger2进行学习,慢慢了解注入的机制。
what and why(Dependency Injection)
what:
依赖注入(DI):就好比一个人去淘宝买一件衣服,他不需要找到这个做衣服的工厂,也不需要考虑这个衣服是怎么做出来的,只需要在手机上发送一个请求:我需要购买这件衣服。这时,衣服就可以通过快递发到这个人的手里。用程序的话解释就是程序在运行过程中,如果需要调用另一个对象帮助时,不需要在代码中创建被调用者,而是依赖于外部的注入,这就是所谓的依赖注入。
传统方法:
被依赖的对象(被调用者)
public class Book {
public Book(){
}
}
需要(依赖)这个对象,需要我们 new 一个对象(调用者)
public class MainActivity extends AppCompatActivity {
Book mBook;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBook=new Book();
}
}
why:
我们之所以需要依赖注入,最重要的就是为了解耦,达到高内聚低耦合的目的,保证代码的健壮性、灵活性和后期可维护性,根据业务需求也可以进行更好的变更。
how:
了解了什么是依赖注入后接下来正式进入主题,开始学习Dagger2。
在Gradle中添加依赖
compile 'com.google.dagger:dagger:2.11' annotationProcessor 'com.google.dagger:dagger-compiler:2.11'
在被依赖的类的构造函数上添加 @Inject 注解,表示我可以提供这个对象,你们可以用。
public class Xxx { @Inject public Xxx(){ } }
- 既然有了可以使用的对象,那么就需要有人去用他,这时XxxActivity出现了,表示我需要他,快给我,我是需求者,需要用@Module表示。
@Module
public class XxxActivity extends AppCompatActivity {
@Inject
Xxx mXxx;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
但是加进去了,需求者和提供者都有了,还没有用啊,该怎么用啊。这时就轮到@Component发挥作用了。然后,Dagger 预编译器会根据这个接口自动加上 Dagger- 前缀,生成一个实现类 DaggerXXXActivityComponent。
@Component public interface XxxActivityComponent { void inject(XxxActivity xxxActivity); }
这时提供者、需求者以及传递者都有,最后进行需要手动输入,决定注入的时机。这里就在 onCreate 注入 Xxx 对象,再次修改 XxxActivity,添加DaggerMainActivityComponent.create().inject(this):
@Module public class XxxActivity extends AppCompatActivity { @Inject Xxx mXxx; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DaggerXxxActivityComponent.create().inject(this); } }
如上就是采用 Dagger 2最基本的方式创建并注入。涉及的知识点包括:@Inject 注解、@Module 类 和@Component 接口,下图可以更好的显示其关系。
最基本写完了,接下就是一些Dagger2中比较常用到的注解。
- @Provides:就是写在Module中我们定义的方法上,表示这个方法提供依赖,并且对外开放,必须写在Module中。
- @SingleTon:这里说明是单例的对象,对象只会被初始化一次,之后每次都会直接注入相同的对象。
@Module
public class MainActivity extends AppCompatActivity {
@Inject
Book mBook;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerMainActivityComponent.create().inject(this);
}
@Provides
@Singleton
Book providesBook() {
mBook.setId(111);
mBook.setName("xxx");
return mBook;
}
}
- @SubComponent:它是子Component,完全继承父Component的所有依赖注入对象。
- @Named:其别名,做标记。
总结
这就是Dagger2的一些基本用法,但具体的还得根据自己的项目进行分析研究,还有好多注解没有完善,在日后的学习中不断的完善总结。