看啥推荐读物
专栏名称: 龙衣袭
我就是我,做自己。 偶尔写写产品想法,和开发...
今天看啥  ›  专栏  ›  龙衣袭

Dagger2 @Qualifier、 @Named、@Scope、@Singleton的简单使用

龙衣袭  · 简书  ·  · 2018-12-19 22:27

@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 );
截图1

@Scope、@Singleton

  • @Singleton

在对象的的上边添加上 @Singleton 注解即可。

如果 moudule 所依赖的 Comonent 中有被单例的对象,那么Conponnent也必须是单例的,否则会报这个错误:


截图2

在 Conponnent 中加上单例后不报错,而且对象也是同一个,通过打印可以看出:


截图3
  • @Scope,是通过自定义注解限定注解作用域。

@Singleton则是@Scope的默认实现。查看如下源码可知:

@Scope
@Documented
@Retention(RUNTIME)
public @interface Singleton {}

@Scope 具体使用会在之后结合项目的时候讲解。

本文完~,欢迎你留言和我一起讨论。




原文地址:访问原文地址
快照地址: 访问文章快照