Dagger2
是Google出的依赖注入框架。该框架是基于square
开发的dagger
基础上开发的。
Dagger2
的原理是在编译期生成相应的依赖注入代码。这也是和其他依赖注入框架不同的地方,其他框架是在运行时期反射获取注解内容,影响了运行效率。
Dagger起初square公司开发,后来谷歌对它进行修改及维护。是一款基于java注解来实现的编译期生成的依赖注入开源库,主要用于模块间解耦,提高代码的健壮性和可维护性
我们为什么要使用依赖注入?我们之所以是用是因为依赖注入最重要的就是解耦,达到高聚合低耦合的目的,保证代码的健壮性,灵活性,可维护性。
三种实现方法:
构造方法
setter方法
接口注入
使用过程中出现的注解:
@Module
:作为实例对象的容器。
@Provides
:标注能够提供实例化对象的方法。
@Component
:作为桥梁,注入对象的通道。
@Inject
:需要注入的方法
//Dagger2需要配置的东西
最外层的build里面配置插件
buildscript {
....
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
// 添加android-apt 插件
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
//在里层build里面配置插件与权限
apply plugin: 'com.android.application'
// 应用插件
apply plugin: 'com.neenbedankt.android-apt'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.mahao.alex.architecture"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.3.0'
// dagger 2 的配置
compile 'com.google.dagger:dagger:2.4'
apt 'com.google.dagger:dagger-compiler:2.4'
compile 'org.glassfish:javax.annotation:10.0-b28'// 添加java 注解库
}
先看实例化部分(容器),在此处是Module
。
@Module //提供依赖对象的实例
public class MainModule {
@Provides // 关键字,标明该方法提供依赖对象
Person providerPerson(){
//提供Person对象
return new Person();
}
}
沟通部分Component
@Component(modules = MainModule.class) // 作为桥梁,沟通调用者和依赖对象库
public interface MainComponent {
//定义注入的方法
void inject(MainActivity activity);
}
使用者Actvity
中调用。public class MainActivity extends AppCompatActivity{
@Inject //标明需要注入的对象
Person person;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 构造桥梁对象
MainComponent component = DaggerMainComponent.builder().mainModule(new MainModule()).build();
//注入
component.inject(this);
}
}
创建Component
(桥梁),并调用注入方法。 // 构造桥梁对象
MainComponent component = DaggerMainComponent.builder().mainModule(new MainModule()).build();
//注入
component.inject(this);
需要参数的实例化对象
Person的构造方法发生了变化,需要传入一个Context,代码如下:
//添加
public class Person {
private Context mContext;
public Person(Context context){
mContext = context;
Log.i("dagger","create");
}
}
//这样的话,我们需要修改MainModule
@Module //提供依赖对象的实例
public class MainModule {
private Context mContext;
public MainModule(Context context){
mContext = context;
}
@Provides
Context providesContext(){
// 提供上下文对象
return mContext;
}
@Provides // 关键字,标明该方法提供依赖对象
@Singleton
Person providerPerson(Context context){
return new Person(context);
}
}
//修改providerPerson
方法,传入Context
对象。//添加
providesContext()
,用以提供Context
对象。// 构造桥梁对象
MainComponent component = DaggerMainComponent.builder().mainModule(new MainModule(this)).build();
//注入
component.inject(this);