Dagger2介绍
Dagger2 是一个Android依赖注入框架,由谷歌开发,最早的版本Dagger1 由Square公司开发。依赖注入框架主要用于模块间解耦,提高代码的健壮性和可维护性。Dagger 这个库的取名不仅仅来自它的本意“匕首”,同时也暗示了它的原理。Jake Wharton 在对 Dagger 的介绍中指出,Dagger 即 DAG-er,这里的 DAG 即数据结构中的 DAG——有向无环图(Directed Acyclic Graph)。也就是说,Dagger 是一个基于有向无环图结构的依赖注入库,因此Dagger的使用过程中不能出现循环依赖。
通过注解实现
Dagger2 通过注解来生成代码,定义不同的角色,主要的注解有:@Inject、@Module 、@Component 、@Provides 、@Scope 、@SubComponent 等。
大致方法:
- 首先进行配置信息
1)使用Android Studio 创建一个新的项目,在Project的 build.gradle文件添加以下内容:
buildscript {
dependencies {
classpath 'me.tatarka:gradle-retrolambda:3.2.4'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
2)并在Module下的build.gradle添加以下内容:
apply plugin: 'com.neenbedankt.android-apt' //一定要设置,下面的apt依赖才能实现
apply plugin: 'me.tatarka.retrolambda'
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
apt 'com.google.dagger:dagger-compiler:2.4'
compile 'com.google.dagger:dagger:2.4'
provided 'org.glassfish:javax.annotation:10.0-b28'
}
# @inject
通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。这样,Dagger就会构造一个这个类的实例并满足他们的依赖。
基本使用实例:
1.需要用来注入的类
public class Poetry {
private String mPemo;
// 用Inject标记构造函数,表示用它来注入到目标对象中去
@Inject
public Poetry() {
mPemo = "生活就像海洋";
}
public String getPemo() {
return mPemo;
}
}
2.连接器 Component
//用@Component表示这个接口是一个连接器,能用@Component注解的只
//能是interface或者抽象类
@Component
public interface MainComponent {
/**
* 需要用到这个连接器的对象,就是这个对象里面有需要注入的属性
* (被标记为@Inject的属性)
* 这里inject表示注入的意思,这个方法名可以随意更改,但建议就
* 用inject即可。
*/
void inject(MainActivity activity);
}
3.注入使用
public class MainActivity extends Activity {
//添加@Inject注解,表示这个mPoetry是需要注入的
@Inject
Poetry mPoetry;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 使用Dagger2生成的类 生成组件进行构造,并注入
DaggerMainComponent.builder()
.build()
.inject(this);
Toast.makeText(getApplicationContext(),mPoetry.getPemo(),Toast.LENGTH_SHORT).show();
}
}
结果:
弹Toast:生活就像海洋。
注意点:
一定要有连接器 ,利用@Component来标注,否则会DaggerMainComponent.builder()
报错找不到类。
.build()
.inject(this);