Dagger2依赖注入框架源码解析

227 阅读2分钟

4种依赖注入方式

1. 通过接口注入

  1. 创建接口ClassBInterface,并在方法setB中传入接口参数
  2. ClassAInterface实现接口ClassBInterface,重写setB方法,通过setB完成接口注入

2. 通过set方法注入

3.通过构造方法注入

4.通过Java注解注入

Dagger2总结

注解注入的好处: 将需要依赖的类和提供依赖的类分割开来,降低代码的耦合性。

Dagger2的用法

  1. 添加依赖库(这里的版本为2.4)
  2. 注解
  • @Inject
    • 第1种使用方法 --标记在成员变量上
      • @Inject标注的成员变量不能声明为private(内部用public get()方法获得变量)。
    • 第2种使用方法 --标记在构造函数上
      • 标记在构造函数上,Dagger2会自动生成实例(内部生成工厂类去new Instance)。
  1. @Component
    例子:
    注:
  • 传入的一定是需要依赖注入的Car类,不能是Car的子类或父类。返回值一定是void。
  • 使用@Component后,会自动生成类DaggerCarComponent(桥接类)。
  • 调用自动生成的桥接类DaggerCarComponent就可以注入Car的这个属性Tyre。 -- 进入类DaggerCarComponent
    • 类MembersInjector是一个查找成员属性注入类,通过Car_MembersInjector.create传入依赖属性的工厂实例

@Inject依赖注入的例子

不使用依赖注入

使用依赖注入

  1. 用@Inject标注需要注入的成员变量Student
  2. 用@Inject标注构造注入的成员变量Student的构造方法
  3. 创建用@Component标记的接口
  4. 在College类构造方法中使用DaggerCollegeComponent实现依赖注入
    注意:
  • DaggerCollegeComponent类是在make project后Dagger2自动生成的类
  • DaggerCollegeComponent.builder().build()中最后调用的是成员注入器College_MembersInjector的create方法,生成成员注入器collegeMembersInjector
  • inject方法的实现
    --进入injectMembers
    --这里get()的最终实现在工厂类的get()方法中生产(new)Student对象

@Module和@Provides

例子1

  1. 创建CarModule并用@Module标注,provideCar()用@Provides标注后,在需要提供依赖的时候就会被调用
  2. 接口上要指明@Component具体的Module是modules=CarModule.class
  3. make project后生成的工厂类中的get()调用的是CarModule中的provideCar()(自定义的)去创建Car对象

例子2

  • Module类
    • DaggerCollegeComponent会相应自动生成产生Classroom对象的provideClassRoomProvider和产生Student对象的provideStudentProvider
  • College类
    • College类中调用了collegeModule()build()完成collegeModule对象的创建
      --进入DaggerCollegeComponent,发现工厂类生成了provideClassRoomProvider和provideStudentProvider
      --进入工厂类CollegeModule_ProviderClassRoomFactory的get()
    • 这里的provideClassRoom()就是在CollegeModule类中自定义的,说明通过@Provides注解会找到它标记的方法,再调用其中的构造方法完成对象的创建。