Dagger2学习笔记3(各个注解学习)

Dagger2学习笔记1(基础概念学习)
Dagger2学习笔记2(学习Dagger2的简单使用)
上篇中学习了如何使用 Dagger2, 很多小伙伴可能一脸懵, 现在我们将学习 dagger2中各个注解的含义以及使用的注意事项.


Dagger2中的注解

4个基础注解,经常使用

  • @Inject
  • @Module
  • @Provides
  • @Component

  • @Named
  • @Qualifier
  • @Singleton
  • @Scope
    ...

@inject

作用:
1 依赖注入类中的依赖变量声明,让 dagger2为其提供依赖
2 被依赖的类的构造方法上申明, 通过标记构造函数让 Dagger2 来使用, 可以在需要这个类实例的时候来找到这个构造函数并把相关实例new出来
eg.

@Inject 
BuyCarSuccessPresenterImpl  mPresenter;
    @Inject
    public Dogs(Dog dog){
        this.dog = dog;
    }

@Module

作用:
1 修饰类, 与@Inject作用相同,用来提供依赖,区别在于Module为那些没有构造方法的类如工具类等提供依赖比如,系统工具类, 第三方 Jar 包等, 能用 @Inject 提供工具类的

@Provides

作用:
用于注解被@ Module 修饰的类中的方法, 当需要该类的依赖时会去找返回值为该类的方法

@Module
public class MainModule {

    @Provides
    Dog provideDog(){
        Dog dog = new Dog();
        dog.setColor("yellow");
        return dog;
    }

@Component

作用:
1 注解一个接口或者抽象类,
2 为inject和module之间建立联系,可以理解为不赚差价的中间商
eg. 在编译时会产生对应的类的实例, 为依赖方和被依赖方提供桥梁,把相关的依赖注入到其中.

@Component(modules = MainModule.class)
public interface MainComponent{
      void inject(MainActivity activity);}

抽象方法inject参数为注入的activity类, build之后会生成一个以dagger开头mainComponent结尾的类。

public class MainActivity extends AppCompatActivity {

    @Inject
    Dogs dogs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DaggerMainComponent
        .builder()
        .mainModule(new MainModule())
        .build()
        .inject(this);
    }
}

在activity中调用生成dagger的inject方法, 完成依赖注入


以上为四个常用的基本注解类, 除此之外还有很多非基本的注解

@Named

作用: 用于区分我们获取依赖的方法
Dagger2寻找依赖是根据我们提供方法的返回值进行匹配的, 当我们遇到不同提供依赖的方法但是返回值类型是相同的应该怎么办呢? Dagger2提供了 Named 注解,用于区分相同返回值类型的不同方法.

定义提供依赖的方法:
@Module
public class MainModule {

    @Named("yellow")
    @Provides
    Dog provideYellowDog(){
        Dog dog = new Dog();
        dog.setColor("yellow");
        return dog;
    }
    
    @Named("black")
    @Provides
    Dog provideBlackDog(){
        Dog dog = new Dog();
        dog.setColor("black");
        return dog;
    }

两个提供依赖的方法返回值都是 Dog, 但是用 Named加以区分

使用:
public class SecondActivity extends BaseAcitivity {
    @Inject
    @Named("black")
    Dog dog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        ((TextView)findViewById(R.id.tv)).setText(dog.toString());
       ...
    }

此时拿到的对象是 BlackDog

@Qulifier

作用: 与 Named一致, Named是继承Qulifier的, 相当于 Dagger2为我们提供的标准化的区分器, 我们也可以进行自定义:

public class MainModule {
    @Provides
    @YellowDog
    Dog provideYellowDog(){
        Dog dog = new Dog();
        dog.setColor("yellow");
        return dog;
    }
....
}

public class MainActivity extends BaseAcitivity {

    @Inject
    @YellowDog
    Dog dog;
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        ((TextView)findViewById(R.id.tv)).setText(dog.toString());
       ...
    }

输出结果为 YellowDog, 与 @Named("yellow")效果一致

@Singleton

作用: 声明单例模式, Dagger2的机制是需要某个对象是回去找对应提供的实例化方法, 多次寻找就会创建多个对象, 当我们需要让对象保持单例模式时, 要使用@Singleton修饰提供依赖的方法
使用: 修饰Module 中需要使用单例的方法上, 保证实例全局都是单例

@Module
public class MainModule {
    @Singleton
    @Provides
    Dog provideDog(){
        Dog dog = new Dog();
        dog.setColor("yellow");
        return dog;
    }
....
}

注意: 1.module 中有方法使用Singleton修饰时, 引用 module 的 component 也要使用@Singleton修饰, 否则编译会报错. 2.想要使用 Singleton 保持全局单例,需要配合Component 使用@Depencies注解以及配合Applicaition 的全局单例性质才可以实现, 后文中会进行详细介绍.

@Singleton
@Component(modules = MainModule.class)
public interface MainComponent {
}

通过构造方法提供依赖要保证单例时, 我们需要在该类的类名上使用@ Singleton 修饰, 切记不是构造方法上!

@Scope

查看源码可以发现@Singleton是使用注解@Scope 修饰的, 而@Scope是用来声明作用域的, Dagger2的机制:在同一作用域下,provides 提供的依赖对象会保持单例, 脱离这一作用域, 单例作用就会失效, 可以说 @Singleton 是@Scope 注解的一个标准, 我们还可以去自定义一些 Scope 注解.

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

Scope注解需要我们进行自定义, 自定义方法和 Singleton作用一致, 当我们使用 @Dependies 进行 Component间的依赖的时候, 如果有提供单例的依赖, 根据 dagger2的机制, 这时我们依赖的Component不能使用同一 scope 进行修饰, 否则会报错, 所以就用到了自定义的scope, 从而区分 Component 之间的层级关系.

下一篇中我们将学习Singleton如何实现全局单例.
Dagger2学习笔记4(@Singleton 与@ Scope 实现全局单例与作用域单例)
Dagger2学习笔记5(关于Lazy,Provide的使用)
End~
特别谢明:Dagger2 入门,以初学者角度

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • 参考资料:https://www.jianshu.com/p/1d84ba23f4d2https://mp.wei...
    薛之涛阅读 633评论 0 1
  • 首先:进行运行环境的配置step1:导入build.grable闭包配置在需要使用Dagger2模块的build....
    笔云客阅读 695评论 0 0
  • 1.Dagger2简介 1.1 Dagger2的描述 Github地址:Dagger2 Dagger2官网上介绍是...
    橙子只涩不酸阅读 743评论 0 1
  • 现在的公司项目用到了Dagger2,之前只是稍微了解一些,没有用过,然后查了查资料,整理如下,方便快速上手 四个基...
    o动感超人o阅读 1,807评论 1 51
  • 一、首先你要知道什么是依赖? 想要理解Dagger2,首先你要理解一个概念,就是什么是依赖,懂的同学可以省过此段。...
    为梦想战斗阅读 409评论 0 0