4种依赖注入方式
1. 通过接口注入
- 创建接口
ClassBInterface,并在方法setB中传入接口参数 - 类
ClassAInterface实现接口ClassBInterface,重写setB方法,通过setB完成接口注入
2. 通过set方法注入
3.通过构造方法注入
4.通过Java注解注入
Dagger2总结
Dagger2的用法
- 添加依赖库(这里的版本为2.4)
- 注解
- @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传入依赖属性的工厂实例
- 类MembersInjector是一个查找成员属性注入类,通过
@Inject依赖注入的例子
不使用依赖注入
使用依赖注入
- 用@Inject标注需要注入的成员变量Student
- 用@Inject标注构造注入的成员变量Student的构造方法
- 创建用@Component标记的接口
- 在College类构造方法中使用DaggerCollegeComponent实现依赖注入
注意:
- DaggerCollegeComponent类是在make project后Dagger2自动生成的类
- 在
DaggerCollegeComponent.builder().build()中最后调用的是成员注入器College_MembersInjector的create方法,生成成员注入器collegeMembersInjector inject方法的实现 --进入injectMembers --这里get()的最终实现在工厂类的get()方法中生产(new)Student对象
@Module和@Provides
例子1
- 创建CarModule并用@Module标注,
provideCar()用@Provides标注后,在需要提供依赖的时候就会被调用 - 接口上要指明@Component具体的Module是modules=CarModule.class
- make project后生成的工厂类中的
get()调用的是CarModule中的provideCar()(自定义的)去创建Car对象
例子2
- Module类
- DaggerCollegeComponent会相应自动生成产生Classroom对象的provideClassRoomProvider和产生Student对象的provideStudentProvider
- DaggerCollegeComponent会相应自动生成产生Classroom对象的provideClassRoomProvider和产生Student对象的provideStudentProvider
- College类
- College类中调用了
collegeModule()和build()完成collegeModule对象的创建 --进入DaggerCollegeComponent,发现工厂类生成了provideClassRoomProvider和provideStudentProvider --进入工厂类CollegeModule_ProviderClassRoomFactory的get() - 这里的
provideClassRoom()就是在CollegeModule类中自定义的,说明通过@Provides注解会找到它标记的方法,再调用其中的构造方法完成对象的创建。
- College类中调用了