Android 学习笔记(7)之Dagger2注解分析

1,依赖注入
依赖是类与类之间的连接
2,依赖倒置 设计原则
不依赖具体,依赖抽象(接口)
实质是面向接口编程的体现

单一职责原则  应该有且仅有一个原因引起类的变更
里氏替换原则  子类完美替换基类
依赖倒置原则  依赖抽象
接口隔离原则  类间的依赖关系应该建立在最小的接口上
迪米特法则     类间解耦
开放封闭原则  修改关闭,扩展开放
组合复用原则  一个类中有另一个类的对象

3,控制反转 (IoC)
把内部依赖的创建权力移交给了外部(例如构造函数,构造函数参数是抽象,实现时具体)

控制反转的意思是反转了上层模块对于底层模块的依赖控制。 

4,依赖注入(Dependency injection)
Person 无法实例化依赖了,它就需要在外部(IoC 容器)赋值给它,这个赋值的动作有个专门的术语叫做注入(injection)
通俗讲  我不想自己实例化依赖,你(injector)创建它们,然后在合适的时候注入给我

3种注入方式
1. 构造函数中注入 
2. setter 方式注入 
3. 接口注入
依赖是类型而不是实例/对象; 在程序中(运行时), 需要的是依赖的实例.

@Inject  注解 @Inject
Provider<T>
 接口 Provider 用于提供类型 T 的实列
get()  用于提供一个完全构造的类型 T 的实例
@Qualifier 用于标识限定器注解
@Named  基于 String 的[限定器]
@Scope  用于标识作用域注解
@Singleton  标识了注入器只实例化一次的类型。该注解不能被继承

5,dagger2 
Dagger2在编译阶段通过apt利用Java注解自动生成Java代码

@Inject, 依赖的变量 ,构造函数
@Module,  @Module用于标注提供依赖的类 第三方或者带参数
@Provides,  @Provides用于标注Module所标注的类中的方法  (需要预先提供对象)
@Component,  @Component用于标注接口,是依赖需求方和依赖提供方之间的桥梁
@Qulifier, @Qulifier用于自定义注解  当类型不足以鉴别一个依赖的时候,我们就可以使用这个注解标示;
@Scope, @Scope同样用于自定义注解 实现局部的单例
@Singleten   @Singleton其实就是一个通过@Scope定义的注解

@Inject和@Module都可以提供依赖  先Module后Inject
6,dagger2使用入门
@Module 提供实例对象
AppComponent 全局注射器 
@Singleton
@Component(modules = {AppModule.class, ClientModule.class, GlobalConfigModule.class})
局部注射器
@ActivityScope
@Component(modules = MainModule.class, dependencies = AppComponent.class)
public interface MainComponent {

@Binds 关联,参数必须是具体实现的实体

Dagger2怎么知道这个方法是为谁提供依赖呢?答案就是返回值的类型
Dagger2使用三种情况
A,无参构造   提供方  @Inject 构造函数,需求方 @Inject 变量  通过@Component(无参)标注的接口 注入到需求方  apt会生成DaggerCarComponent.builder().build().inject(this); 注入实例
B,有参构造或者第三方
提供方  @Module和@Provide  Module中提供具体的实例。通过@Provides 提供  ;需求方 @Inject 变量  
@Component(有参)
@Component(modules = XModule.class) 注入。
 apt 会生成多一个方法。   DaggerCarComponent.builder().markCarModule(new MarkCarModule())
C, @Qulifier 定义多个注解
定义两个QualifierA QualifierB注解  提供方 @Engine.QualifierA 注释provideA 依次添加多个实例  ;需求方也需要   @Engine.QualifierA 修饰变量A

D,  @Scope作用域  用于自定义注解
注解作用域,实现局部的单例  
提供方  Module中修饰provide ,  需求方变量不需要此修饰,只需修饰@Component
@Singleton 通过@Scope定义的注解  全局单例与否看Component是否一个全局对象
@Name 就是一个@Qulifier修饰的注解

7,APT处理注释的工具
注解处理器(AbstractProcess)+代码处理(javaPoet)+处理器注册(AutoService)+apt                     (annotationProcessor)

APT处理annotation流程
1,定义注解(如@automain)
2,定义注解处理器 自定义需要生成的代码
3,使用处理器
4,APT自动完成1,扫描代码中注释,2,根据定义好的注解处理器进行操作,3,编译处理生成java文件
注册
@AutoService(Processor.class)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值