Dagger2 是一个Android依赖注入框架,由谷歌开发,最早的版本Dagger1 由Square公司开发。依赖注入框架主要用于模块间解耦,提高代码的健壮性和可维护性。
//
添加依赖
compile
'com.google.dagger:dagger:2.9'
annotationProcessor
'com.google.dagger:dagger-compiler:2.9'
然后就是写出需要注入的类,里面写上方法,例如:
/**
*
类描述:用来注入的类
*
姓名 :
*/
public class
Genlei {
private int
a
;
//
无参方法
public void
getin(){
Log.
e
(
"---------"
,
"
通过依赖注入调用的方法
"
);
}
//
有参方法
public void
setin(
@NonNull
String str){
Log.
e
(
"=========="
,str+
"::"
);
}
}
然后就是在创建一个类,用来实例化注入的类,并不在调用的类里面实例化,这样就可以进行一个解耦,但是注意的是,这个类要用
@Module
修饰,里面的方法也要用
@Provides
修饰,例:
/**
*
类描述:注入中间类
*
姓名 :
*/
@Module
public class
Zhurulei {
@Provides
Genlei getgenlei(){
//
实例化根类
return new
Genlei();
}
}
然后就是写一个接口,通过注解将关联类导入,通过抽象方法传入this
/**
*
类描述:
*
姓名 :刘希鑫
*/
@Component
(modules = Zhurulei.
class
)
public interface
Zhurujiekou {
void
inject(MainActivity mainActivity);
}
然后,只要在调用类里通过注解将注入类的对象创建出来
@Inject
然后在Build中解析一下就可以了
随后,就是调用接口,传入this,就可以直接用上面的注入类对象来调用它的方法了。
public class
MainActivity
extends
AppCompatActivity {
//
通过注解找到注入的类
@Inject
Genlei
genlei
;
@Override
protected void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.
activity_main
);
DaggerZhurujiekou.
create
().inject(
this
);
genlei
.getin();
genlei
.setin(
"
这是调用的有参方法
"
);
}
}
以上就是一个最简单的依赖注入,不过一样可以进行解耦操作,只要在和MVP关联上,一个解耦的MVP就完成了,当然,你也可以在添加一些其他方式,比如,MVP+Rxjava+Retroffit+Dagger2。
下面就是对于依赖注入的讲解,也就是Dagger2
我们平时使用MVP框架的时候,还是会在View层里new出P层,这样就进行了一个绑定,违反了android的单一职责和解耦性,而且也会因为View层销毁而P层生命周周期还没有走完造成的生命周期不一致的内存泄漏。
而Dagger2就是为了解除绑定,避免内存泄漏的一种方法,通过第三方类或者接口,来实例化P层然后注入到View层,而View层只管调用注入的数据,并不去管P曾德生命周期,这样两者之间并没有具体的关联,全都有第三方来管理,而这时如果View层销毁了,那么因为没有关联,那么P层自然也不会因为生命周期不一致而造成内存泄漏。
依赖注入的过程:
- @Inject 带有此注解的属性或构造方法将参与到依赖注入中,Dagger2会实例化有此注解的类
- @Module 带有此注解的类,用来提供依赖,里面定义一些用@Provides注解的以provide开头的方法,这些方法就是所提供的依赖,Dagger2会在该类中寻找实例化某个类所需要的依赖。
- @Component 用来将@Inject和@Module联系起来的桥梁,从@Module中获取依赖并将依赖注入给@Inject
原理我没屡明白,想要了解的童鞋去看看下面的网址