Dagger2依赖注入框架
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dagger2依赖注入框架相关的知识,希望对你有一定的参考价值。
Dagger2简介:
- Dagger: “A fast dependency injector for android and Java“,其最大的好处就是莫跨界见解耦,这个耦合是由类之间的以来引起的,依赖注入的配置独立于初始化出,配置更改方便,可提高代码的健壮性和可维护性
Dagger2相较于Dagger1的优势:
(1)更好的性能:相较于Dagger1,Dagger2使用的预编译期间生成代码来完成依赖注入,而不是用的反射。反射对手机应用开发影响比较大,因为反射是在程序运行时加载类来进行处理所以会比较耗时,而手机硬件资源有限,所以相对来说会对性能产生一定的影响。
(2)容易跟踪调试:因为Dagger2是使用生成代码来实现完整依赖注入,所以完全可以在相关代码处下断点进行运行调试。
Dagger2最大的好处就是模块间解耦,依赖注入的配置独立于初始化地方,更改配置方便,提高代码的健壮性和可维护性。依赖注入是面向对象编程的一种设计模式,其目的是为了降低程序耦合,这个耦合就是类之间的依赖引起的 。
什么是依赖注入:
- 依赖注入是目标类(需要进行以来初始化的类)中所依赖的其他的类的初始化过程,他不是通过手动编码的方式创建的,而是通过技术手段把其他类中已经初始化的实例自动注入目标类中
依赖注入的方式:面向对象的对吗中会用到 组合,即在一个类中引用另一个类,从而可以调用引用类中的方法完成某些功能
- eg:A依赖B
public class A
B b;
public A()
b = new B();
public void do()
b.doSomething();
- 问题:A中的方法需要借助B来执行,违背了单一职责原则,耦合度增加,扩展性差,所以需要依赖注入:
通过接口注入:
public interface BI
void setB(B b);
public class A implements BI
B b;
@Override
void setB(B b)
this.b = b;
通过set方法注入:
public class A
B b;
public void setB(B b)
this.b = b;
通过构造方法注入:
public class A
B b;
public A(B b)
this.b = b;
通过Java注解注入:
public class A
@inject B b;
public A()
- 注意: Dagger2使用的是Java注解的方式,将注解注入到目标类中
- 将Dagger2引入MVP的意义:
- 传统的MVP模式将Activity拆解成三层并产生了大量的类,也产生了类与类之间的依赖,表现的方面:
1. Presenter在Activity的耦合:
传统的MVP中Present是在Activity中初始化的,即系统显示新增了一个对象,那么这个Activity中就有了耦合。
2.model在Presenter中的耦合:
传统的MVP中的model也是在Presenter中初始化的,及系统显示新增了一个对象,同样引入耦合
Dagger2在AndroidStudio中的配置
- 在app下的build.gradle中添加:
dependencies
implementation com.google.dagger:dagger:2.5
annotationProcessor com.google.dagger:dagger-compiler:2.5
注解:
- 第一次真正了解注解,是在汪云飞老师那本《JavaEE开发的颠覆者: Spring Boot实战》中了解的,建议入手springboot的话,可以去看一看,收获还是蛮多的
- 回来说Dagger2的注解:
- @Inject
- @Component
- @Module
- @Provide
Inject
- 作用:
- 在构造函数上使用,通过标记构造函数让Dagger2来使用它,Dagger2通过Inject标记可以在使用时通过标记找到这个构造函数并把相关的实例new出来。
- 标记在需要依赖的变量上,让Dagger2为其提供依赖
public class MainActivity extends AppCompatActivity
@Inject
public Presenter()
public class MainActivity extends AppCompatActivity
@Inject
Presenter presenter;
Component
- 作用:
- 一般用来标注接口,被标注了Component的接口在编译时会产生相应的类的实例来提供依赖方和需要依赖方之间的桥梁,并把相关依赖注入其中
@Component
public interface PresenterComponent
void inject(MainActivity mainActivity);
- 工作原理:Component需要引用目标类的实例,并查找目标类中用Inject注解标注的属性,查找到相应的属性后,会接着查找该属性对应的被Inject标注的构造函数,这时候就会产生联系,最后初始化该属性的实例,并把实例赋值,就可以将Component比作注入器
Module:
- 被Module注解标住的类是专门提供依赖的,Module可以给不能修改源码的类提供依赖,可以使用Inject的地方就可以使用Module,而且Module的优先级高于Inject,Module本质是一个简单工厂模式
@Module
public vlass PresenterMOdule
@Provides
Presenter providePresenter()
return new Presenter();
Provides
- Provides可以在需要提供依赖的时候进行调用,从而可以把预先提供好的对象当作依赖给标注了@Inject的变量赋值,provide被用于标注Module里的方法,上述代码中providePresenter()返回了一个Presenter对象,并使用@Provides标注,所以可以提供给@Inject标注的Presenter变量
以上是关于Dagger2依赖注入框架的主要内容,如果未能解决你的问题,请参考以下文章