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