注意事项(重要)
- @Component 的 inject 方法接收父类型参数,而调用时传入的是子类型对象,则无法注入(继承类是无效,只认当前注入的类)。
- @Component 关联的 @Module 中不能有重复的 Provide (关联对象是使用返回值匹配的,如果有重复就不知道使用那个,此时要使用修饰符 @Qualifier 或 @Named 注解,进行区分。)。
- @Module 的 provide 方法使用了 @Scope ,那么 @Component 就必须使用同一个注解(都要有域,即生命周期。)。
- @Module 的 provide 方法没有使用 @Scope ,那么 @Component 和 @Module 是否注解都无关紧要,可以通过编译。
- @Component 的 dependencies 的 @Scope 与 @Component 自身的 @Scope 不能相同,即组件之间的 @Scope 不同。
- @Singleton 的组件不能依赖其他 @Scope 的组件,只能其他 @Scope 的组件依赖 @Singleton 的组件(@Singleton 范围是 Application级别的,只能依赖比其范围小的 @Scope , 范围只能缩小 )。
- 没有 @Scope 的 @Component 不能依赖有 @Scope 的 @Component。
- 一个 @Component 不能同时有多个 @Scope (@Subcomponent除外)。
- @Singleton 的生命周期依附于 @Component ,同一 Module、Provide、Singleton 不同, Component也是不一样的。
概念
- @Inject 带有此注解的属性或构造方法将参与到依赖注入中,Dagger2会实例化有此注解的类
- @Module 带有此注解的类,用来提供依赖,里面定义一些用@Provides注解的以provide开头的方法,这些方法就是所提供的依赖,Dagger2会在该类中寻找实例化某个类所需要的依赖。
- @Component 用来将@Inject和@Module联系起来的桥梁,从@Module中获取依赖并将依赖注入给@Inject
MVP + Dagger2 当看到某个类被@Inject标记时,就会到他的构造方法中,如果这个构造方法也被@Inject标记的话,就会自动初始化这个类,从而完成依赖注入。
理解这句话:通过new MainModule(this)将view传递到MainModule里,然后MainModule里的provideMainView()方法返回这个View,当去实例化MainPresenter时,发现构造函数有个参数,此时会在Module里查找提供这个依赖的方法,将该View传递进去,这样就完成了presenter里View的注入。