个人理解 —— Dagger2中注解

  • Dagger2 相关概念:

    1. ​Spring 是一个java”分层”框架,是为了解决企业应用程序开发复杂性,由Rod Johnson创建的。
      依赖注入就是:Spring设计思想中重要的一部分,它是指Ioc或DI,是一个重要的面向对象编程的法则来削减计算机程序的耦合问题.控制反转还有一个名字叫做依赖注入(Dependency Injection).简称DI.
    2. 应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注 入到3对象中。所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。
    3. 依赖注入的作用:
      把对象生成放在了XML里定义,所以换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以。这样甚至可以实现对象的热插拨。

  • Dagger2 特点:

    1. Dagger2与其他依赖注入框架不同,它是通过apt插件在编译阶段生成相应的注入代码,所以需要build才能生成注解;主要用于模块间解耦,提高代码的健壮性和可维护性。
    2. Dagger 是一个基于有向无环图结构的依赖注入库,因此Dagger的使用过程中不能出现循环依赖。
    3. 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中
    


  • 其他注解说明:

    1. @Singleton : 代表各个注入对象为单例。

    2. @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);//添加声明
      }
      


    3. @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;而架构体现在“构”字上,理解成构造,是一个动词性的,是一系列动作发生的策略性体现。

你可能感兴趣的:(Android)