在一般情况下使用@Inject和@Component就能实现注入
但是在以父类为抽象类引用指向子类的时候,只用@Inject编译会报错
这时候需要用到@Module和@Provides注解了
1、与之前一样导依赖jar包。
2、创建 xxx实体类名+Module的Module类
Module中
@Module
public class PersonModule {
@Provides
public Person providePerson() {
return new Student();
}
}
Component中(需要指定modules)
@Component(modules = PersonModule.class)
public interface MainActivityComponent {
void inject(MainActivity activity);
}
3、在多个Provides的情况下(要用到@Qualifier 来限定)
-@Qualifier用来定义注解
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface ParentPerson {}
-该注解用于区别不同的Provides (即抽象父类的不同子类)
@Module
public class PersonModule {
@Provides
@StudentPerson ①
public Person providePerson() {
return new Student();
}
@Provides
@ParentPerson ①
public Person provideParent() {
return new Parent();
}
}
-需要以该抽象类对象为传入对象的构造方法的 类的注入
@Module
public class ClassesModule {
@Provides
public ClassMates provideClassesMate(@StudentPerson ② Person person) {
return new ClassMates(person);
}
}
-最后Component中还要另外添加一个ClassesModule.class
@Component(modules = {PersonModule.class, ClassesModule.class})
public interface MainActivityComponent {
void inject(MainActivity activity);
}
上面三个过程的代码的作用可以理解为:需要创建一个ClassMates类的对象,这个类的构造方法需要传入一个其他对象,那么这个其他对象也要通过依赖注入的方式,而这个传入的参数是一个父类的引用,其指向的子类类型有多种,这时候就涉及到多个不同的子类注入时的Provides的区分了,这里用的是@Qualifier生命一个注解,再用该注解在子类的Module中进行区分指定(①),那么在ClassMates类注入用的Module中传入参数就可以用该自定义注解来进行区分(②)。
备注:
1、@Inject注解有三个作用:写在实体类的构造方法上 用于 指定改方法可用于得到该对象;写在需要被注入类的成员变量上 用于 将对象注入该成员变量;写在需要被注入类的方法上,如setXXX()方法等,这样的方法一般在构造方法执行后执行。