@Inject
1.注解构造器
2.注解非private的类成员变量
3.注解方法,该方法在所在类的构造方法结束后立即调用,可用于安全的注入this
@Component
提供两种方式定义方法,编译后生成DaggerXXXComponent这个类,在目标类中使用,就可以实现依赖注入了
1.void inject(目标类 obj);
Dagger2会从目标类开始查找@Inject注解,自动生成依赖注入的代码,调用inject可完成依赖的注入。
2.Object getObj(); 如: Pot getPot();
Dagger2会到Pot类中找被@Inject注解标注的构造器,自动生成提供Pot依赖的代码,这种方式一般为其他Component提供依赖。(一个Component可以依赖另一个Component)
另外:
1.@Component可以指定多个@Module的,如果需要提供多个依赖的话。
2.Component可以依赖于其他Component,可以使用@Component的dependence,也可以使用@SubComponent,这样就可以获取其他Component的依赖了(即获取其他Component指定的Module)。我们Component不需要重复的指定Module,可以直接依赖其它Component获得。
@Scope
1.@Scope的作用:
它的作用只是保证依赖在@Component中是唯一的,可以理解为“局部单例”。
@Scope是需要成对存在的,在Module的Provide方法中使用了@Scope,那么对应的Component中也必须使用@Scope注解,当两边的@Scope名字一样时(比如同为@Singleton), 那么该Provide方法提供的依赖将会在Component中保持“局部单例”。
而在Component中标注@Scope,provide方法没有标注,那么这个Scope就不会起作用,而Component上的Scope的作用也只是为了能顺利通过编译,就像我刚刚定义的ActivityScope一样。
2.如何使用Dagger2实现单例呢?
很简单,做到以下两点即可。
依赖在Component中是单例的(供该依赖的provide方法和对应的Component类使用同一个Scope注解。)
对应的Component在App中只初始化一次,每次注入依赖都使用这个Component对象。(在Application中创建该Component)