@Named 、@Qualifier
在同一个 Module 中 通过 @Provides 标记多个提供相同类的不同实现对象,程序可能会报错,提示对象被绑定多次,那么 @Name 和 @Qualifier 就是用来解决这个问题的。
@Named 则是基于 String 的限定符,用于 Module 中生成类实例的方法;@Qualifier 也是限定符,是通过自定义注解来完成;
- @Name 使用
定义:
@Named("one")
@Provides
ThridBean providerThridBean(){
return new ThridBean();
}
@Named("two")
@Provides
ThridBean providerThridBean2(){
return new ThridBean();
}
使用
@Named("one")
@Inject
public ThridBean thridBean;
@Named("two")
@Inject
public ThridBean thridBean2;
DaggerMatchComponent.create().mainActivityInject(MainActivity.this);
// 通过打印日志可以看出是两个对象
Log.e(TAG, "onClick: thridBean-------> "+ thridBean);
Log.e(TAG, "onClick: thridBean2-------> "+ thridBean2 );
- @Qualifier 使用
参考这篇文章 : Dagger 2 系列(四) -- 基础篇:@Named 和 @Qualifier
@Scope、@Singleton
- @Singleton
在对象的的上边添加上 @Singleton 注解即可。
如果 moudule 所依赖的 Comonent 中有被单例的对象,那么Conponnent也必须是单例的,否则会报这个错误:
在 Conponnent 中加上单例后不报错,而且对象也是同一个,通过打印可以看出:
- @Scope,是通过自定义注解限定注解作用域。
@Singleton则是@Scope的默认实现。查看如下源码可知:
@Scope
@Documented
@Retention(RUNTIME)
public @interface Singleton {}
@Scope 具体使用会在之后结合项目的时候讲解。
本文完~,欢迎你留言和我一起讨论。
网友评论