# Dagger2Demo **Repository Path**: harukong/Dagger2Demo ## Basic Information - **Project Name**: Dagger2Demo - **Description**: No description available - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-08-06 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## Dagger2的基本使用 ### Dagger2是什么? Dagger2是一个**依赖注入**框架,我们常用的依赖注入框架还有ButterKnife。想要理解依赖注入,这边我们需要了解一个概念:控制反转。 ### 什么是控制反转? 控制反转(又叫IOC:Inversion Of Control):是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统的所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。 ### 我们为什么要使用Dagger2? Dagger2是用来使代码解耦的,一个类的new代码是非常可能充斥在app的多个类中的,假如该类的构造函数发生变化,那这些涉及到的类都得进行修改。 如果使用Dagger2的Inject注解构造函数,即使构造函数发生较大的变化,我们基本上都不需要修改任何代码。 ### 命名规约 + @Provides方法用provide前缀命名 + @Module 用Module后缀命名 + @Component 以Component作为后缀 ### Dagger2使用过程 + Dagger2是通过依赖注入完成类的初始化。这个过程需要三部分,见图1: > 1. 依赖提供方(生产者)@Module && @Provides | @Inject构造方法 > 2. 依赖注入容器(桥梁)@Component > 3. 依赖需求方(消费者)@Inject Object ``` graph LR A(依赖提供方)-->B(依赖注入容器) B-->C(依赖需求方) ```
图1
+ Dagger2选择依赖提供的规则如下: > 步骤1:查找Module模块中是否存在创建该类的方法 > > 步骤2:若存在创建类的方法,查看该方法是否存在参数 >> 步骤2.1:若存在参数,则按从步骤1开始依次初始化每个参数 >> >>步骤2.2:若不存在参数,则直接初始化该类实例,一次依赖注入到此结束 > > 步骤3:若不存在创建类方法,则查找Inject注解的构造函数,看构造函数是否存在参数 >> 步骤3.1:若存在参数,则从步骤1开始依次初始化每个参数 >> >> 步骤3.2:若不存在参数,则直接初始化该类实例,一次依赖注入到此结束 + 在使用@Component的时候必须要提供scope范围,标准范围是@Singleton + @Component在使用@Module的时候必须匹配相同的scope + 能使用Signleton的时候,要注意标注,否则默认多例 --- + @Inject注解类,主要有如下两个作用: > 1. 作为**依赖提供方**: > >> 使用@Inject注解构造方法。 >> >>注解类的**构造函数**,让Dagger2帮我们实例化该类,并注入。添加到类的构造函数上 > 2. 作为**依赖需求方**: > >> 使用@Inject注解成员。 >> >> 如果一个**成员变量被**@Inject注解修饰,并且**成员类**的**构造函数**也被@Inject注解,那么Dagger2帮我们实例化该**成员类**,并注入。 + @Module注解类,负责管理依赖: > 1. Module其实是一个简单工厂模式,Module里面的方法都是创建相应类实例的方法。 > 2. 通过@Module获得第三方类库的对象。 > 3. @Module是一个依赖提供方的合集。 + @Provides注解类,注解@Module类中的方法: > 1. 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger2我们想要构造对象并提供这些依赖。 + @Component注解类,一般用来注解接口: > 1. 负责在@Inject和@Module之间建立连接。也可以说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。 > 2. 实例化@Inject注解的类时,遇到没有构造函数的类依赖,则该依赖由@Module修饰的类提供。 > 3. 依赖注入容器只是一个接口interface。