Dagger2 相关概念:
- Spring 是一个java”分层”框架,是为了解决企业应用程序开发复杂性,由Rod Johnson创建的。
依赖注入就是:Spring设计思想中重要的一部分,它是指Ioc或DI,是一个重要的面向对象编程的法则来削减计算机程序的耦合问题.控制反转还有一个名字叫做依赖注入(Dependency Injection).简称DI. - 应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注 入到3对象中。所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。
- 依赖注入的作用:
把对象生成放在了XML里定义,所以换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以。这样甚至可以实现对象的热插拨。
- Spring 是一个java”分层”框架,是为了解决企业应用程序开发复杂性,由Rod Johnson创建的。
Dagger2 特点:
- Dagger2与其他依赖注入框架不同,它是通过apt插件在编译阶段生成相应的注入代码,所以需要build才能生成注解;主要用于模块间解耦,提高代码的健壮性和可维护性。
- Dagger 是一个基于有向无环图结构的依赖注入库,因此Dagger的使用过程中不能出现循环依赖。
Dagger2 通过注解来生成代码,定义不同的角色,主要的注解有:@Inject、@Module 、@Component 、@Provides 、@Scope 、@SubComponent 等。
@Inject: 在需要依赖的地方使用这个注解。用它告诉Dagger这个类或者字段需要依赖注入,注意这个类或者字段不能用private修饰,因为 @inject 采用 new 的方式注入对象的,若创建该对象需要参数,它会到所有 @provides 中去寻找匹配的数据来完成对象的创建。
@Module: Modules类里面的方法专门生产和整合依赖(新对象),并通过@Provides告诉Dagger,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的依赖。modules的一个重要特征是它们设计为分区并组合在一起(比如说,在我们的app中可以有多个组成在一起的modules)。总之:@Module 是很多对象的集中营,目的是为通过@Provides 提供各种对象;
@Provides:在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖,方法中的返回参数和入参必须是继承关系才可以,否则它查不到子类,就会进入无限循环错误;
@Component:Components从根本上来说就是一个注入器,也可以说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。 Components可以提供所有Modules中定义了的类型的(非void)”实例”,比如:我们必须用@Component注解一个接口,并绑定需要的 @Modules 组成该组件,如果缺失了任何一块都会在编译的时候报错。所有的组件都可以通过它的modules知道依赖的范围。总之:@Component 用于获取各种对象,若接口/抽象类中方法有返回值,则还可以进行对象功能操作等;并且子、父Component的作用域不能相同。
@Scope: 用于自定义注解限定注解作用域。这是一个非常强大的特点,没必要让每个对象都去了解如何管理他们的实例。
Dagger2的运行流程:
手动编写Activity中presenter注入inject、在presenter构造中标记inject、编写提供presenter构造中参数的module,并标记出获取参数的provides、编写inject和Module链接接口/抽象类component,执行rebuild生成出Dragger的类和必要的工厂,在Activity中添加component设置,示例如下:
DaggerMainComponent.builder() //创建DaggerMainComponent中的builder对象 .mainModule(new MainModule(this)) //builder中方法,传入module对象地址 .build() // 创建Component对象,并将Module中所有在presenter对象中所需要的参数,传给presenter .inject(this); // 创建represent对象,并关联注入到本Activity中
其他注解说明:
@Singleton : 代表各个注入对象为单例。
@Subcomponent :在需要父组件全部的提供对象,这时我们可以用包含方式而不是用依赖方式:
@AScope @Subcomponent(modules = AModule.class) public interface AComponent { void inject(AActivity activity); } @Singleton @Component(modules = ApplicationModule.class) public interface ApplicationComponent { Gson getGson();// 暴露Gson对象接口 //AComponent plus(); AComponent plus(AModule module);//添加声明 }
@Qualifier: 实例资格限定:用于得到两个不同的实例:
@Qualifier @Documented @Retention(RetentionPolicy.RUNTIME) public @interface PoetryQualifier { String value() default ""; } @Module public class AModule { @PoetryQualifier("A") @AScope @Provides public Poetry getPoetry(){ return new Poetry("万物美好"); } @PoetryQualifier("B") @AScope @Provides public Poetry getOtherPoetry(){ return new Poetry("我在中间"); } } //在Activity中使用方式: @PoetryQualifier("B") // 匹配Module中同样注解的方法 @Inject Poetry mPoetryB;
额外补充:
架构(Architecture)和 框架(Framework)是不一样的,框架是软件,架构不是软件。框架落脚在“架”字上,可以理解成名词性的,是一个客观性的名词存在,如.Net Framework;而架构体现在“构”字上,理解成构造,是一个动词性的,是一系列动作发生的策略性体现。
个人理解 —— Dagger2中注解
最新推荐文章于 2021-06-22 14:43:01 发布