学习Dagger2笔记:【4】@Component

目录

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

目标

上一篇说到我们想要dagger自动生成出类似于我们手写的Bridge桥接类,本文就是对实现此功能的@Component做一个简介分析,来看看dagger中怎样使用@Component

依赖图

在介绍本篇主角@Component之前,我们先根据已有代码画一个依赖图:(个人认为使用dagger就必须要弄清楚自己的依赖图,无论是画在纸上还是在脑海中,一定要想清楚再编写dagger)

Dagger Dependencies

如上图所示:

  • 实线箭头表示依赖关系,虚线箭头表示提供数据,直角框表示对象,圆角框表示数据仓库
  • @Inject注解的构造函数中的参数,也算做这个对象的依赖,比如Computerosprice
  • @Inject一样,被@Provides注解的方法中的参数也是一个依赖,不过这个依赖是被@Module注解的数据仓库的依赖,比如provideMemory()中的size

从上面依赖图中可以看到,ospricesize这三个依赖是没有数据来源的,回想下我们自己写的Bridge,这三个依赖其实都是我们手写(hardcode)传入工厂方法中的,如果想dagger帮我们生成这个Bridge,就要让dagger去调用工厂方法,那么怎样让dagger知道工厂方法中需要传入Windos66668192这三个参数呢?这里有两个思路:

  1. 为上述三个依赖都创建数据仓库,比如OsModulePriceModuleSizeModule。但PriceModuleSizeModule都是提供Int型数据,怎样让dagger知道PriceModule提供的Int实例是给Computerprice依赖,而SizeModule提供的Int实例是个MemoryModulesize依赖?怎样解决这种问题以后会说到,这里先留个悬念
  2. 既然被@Inject注解的构造函数中的参数和被@Provides注解的方法中的参数都算依赖,那么我们直接将构造函数和provide方法变成无参的不就好了?比如在Computerinit{}中去给osprice赋值,或者将size作为Module的成员变量而不是provide方法的参数。前者修改Computer类很明显降低了类的灵活性,而且之前也说过@Inject无法用于三方库或系统中对象的构造函数,所以我们采取后者来解决提供依赖的问题

首先将Computer构造函数上的@Inject去掉,并为Computer新建数据仓库ComputerModule类,之后修改MemoryModule添加成员变量并使@Provides注解的方法变为无参:

@Module
class ComputerModule(private val os: String, private val price: Int) {
   
    @Provides
    fun provideComputer() = Computer(os, price)
}

@Module
class MemoryModule(private val size: Int) {
   
    @Provides
    fun provideMemory() = Memory(size)
}

编译一下,你会发现现在生成的工厂类,就和上一篇中无参的@Provides生成的工厂类一模一样了,这里可以思考下为什么dagger生成的工厂类是对数据仓库(Module)的代理工厂,而不是直接创建数据仓库实例,一切都是为了解耦提高灵活性(下面仅贴出MemoryModule_ProvideMemoryFactory作为对比,ComputerModule_ProvideMemoryFactory整体上大同小异就不再贴出来了)

public final class MemoryModule_ProvideMemoryFactory implements Factory<Memory> {
   
  private final MemoryModule module;

  public MemoryModule_ProvideMemoryFactory(MemoryModule module) {
   
    this.module = module;
  }

  @Override
  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值