学习Dagger2笔记:【2】@Inject

本文详细介绍了Dagger2中的@Inject注解,包括在构造函数、变量和方法上的应用,以及注解处理器如何生成工厂类和注入器。通过示例展示了Dagger2如何处理依赖注入,强调了不能在有参数默认值的构造函数上使用@Inject。最后,讨论了Dagger2的桥接模式,解释了其如何连接不同的抽象和实现。
摘要由CSDN通过智能技术生成

目录

0. 前言
1. 依赖与注入
2. @Inject
3. @Module & @Provides
4. @Component
5. @Qualifier
6. Provider & Lazy
7. @Scope
8. 注入到Set和Map容器
9. Bind系列注解
10. dagger中依赖关系与继承关系
11. dagger.android

Kotlin中的注解

在开始讲解注解之前,先看下kotlin中的注解有何不同

我们知道以下kotlin代码:

class Test(var temp: Int)

转换为Java代码后是:

public final class Test {
   
   private int temp;

   public final int getTemp() {
   
      return this.temp;
   }

   public final void setTemp(int var1) {
   
      this.temp = var1;
   }

   public Test(int temp) {
   
      this.temp = temp;
   }
}

那么问题来了:

  • 如何给构造函数添加注解?
  • 如果代码为class Test(@Ann var temp: Int),那么@Ann这个注解是作用于哪里?(构造函数中的参数、变量、get或是set方法等)
  • 如何在kotlin中指定注解的目标?

构造函数添加注解

这个问题其实不难,研究过kotlin语法的应该都知道kotlin有constructor关键字,上述写法是省略掉此关键字之后的主构造函数的写法,如果要使用注解,则需要显示写出constructor关键字,如下:

class Test @Ann constructor(var temp: Int)

注解的默认目标

修改一下代码如下:

class Test constructor(@Ann var temp: Int) {
   
    @Ann var foo = "Cmd"
}

猜猜这两个@Ann注解分别在什么地方?

public final class Test {
   
   @NotNull
   private String foo;
   private int temp;

   /** @deprecated */
   // $FF: synthetic method
   @Ann
   public static void foo$annotations() {
   
   }
    
   /* 省略掉get/set方法 */

   public Test(@Ann int temp) {
   
      this.temp = temp;
      this.foo = "Cmd";
   }
}

kotlin中注解首先根据@Target选择目标,如果有多个指定目标都符合时,有如下优先级:

  1. param:即方法中的参数
  2. property:一个对java不可见的属性(如上foo$annotations
  3. filed:变量

所以在上述代码在构造函数中@Ann的目标时构造函数的入参,而foo前的@Ann目标则是属性

指定注解目标

对于自定义的注解,也许我们可以指定@Target限制注解目标范围,但对于三方提供的注解(例如javax.inject中的@Inject),怎样指定注解的目标呢?kotlin给出了一系列关键字来辅助:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值