@Inject
构造器注入,@Inject标注在构造器上其实有两层意思。
①告诉Dagger2可以使用这个构造器构建对象。如Rose类
②注入构造器所需要的参数的依赖。 如Pot类,构造上的Rose会被注入。
构造器注入的局限:如果有多个构造器,我们只能标注其中一个,无法标注多个。
属性注入
如MainActivity类,标注在属性上。被标注的属性不能使用private修饰,否则无法注入。
属性注入也是Dagger2中使用最多的一个注入方式。
方法注入 // 添加监听
标注在public方法上,Dagger2会在构造器执行之后立即调用这个方法。
方法注入和属性注入基本上没有区别, 那么什么时候应该使用方法注入呢?
比如该依赖需要this对象的时候,使用方法注入可以提供安全的this对象,因为方法注入是在构造器之后执行的。
比如google mvp dagger2中,给View设置Presenter的时候可以这样使用方法注入。
/**
* Method injection is used here to safely reference {@code this} after the object is created.
* For more information, see Java Concurrency in Practice.
*/
@Inject
void setupListeners() {
mTasksView.setPresenter(this);
}
Component中一般使用两种方式定义方法。
void inject(目标类 obj);Dagger2会从目标类开始查找@Inject注解,自动生成依赖注入的代码,调用inject可完成依赖的注入。
Object getObj();如:Pot getPot(); // 类似初始化一些类,提供其他component使用
Dagger2会到Pot类中找被@Inject注解标注的构造器,自动生成提供Pot依赖的代码,这种方式一般为其他Component提供依赖。(一个Component可以依赖另一个Component,后面会说)