学习Dagger2笔记:【6】Provider & Lazy

本文详细介绍了Dagger2中的Provider和Lazy特性,通过实际需求探讨了如何避免内存浪费和实现懒加载。分析了@Component接口中定义的方法,包括成员注入类方法和数据提供类方法,并探讨了它们的实现原理。文章最后总结了Dagger2的注入方式,并预告了如何在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

再看@Component

我们之前使用@Component都仅仅是在其注解的接口中添加一个inject方法,作为进行依赖注入的入口,但@Component的作用远不止如此

新需求

为了深入研究@Component,我们新增两个需求

需求1

Activity显示Computer信息时,我们要求根据当前时间(System.currentTimeMillis())单双作为区别,如果单数就显示windows,如果双数就显示linux

我们先考虑第一个需求,每次Activity.onCreate()中都会调用inject()方法注入windowslinux实例,但我们其实只用得上其中一个,这样岂不是造成了内存的浪费?不过不用担心,dagger为我们准备了Lazy接口:

class CaseActivity : BaseActivity() {
   
    @field:[Inject ComputerModule.WindowsComputerQualifier]
    lateinit var windows: dagger.Lazy<Computer> // 注意这里是dagger.Lazy,因为Kotlin中也有Lazy接口,通常用于lazy标准委托,不是本篇的重点...
    @field:[Inject ComputerModule.LinuxComputerQualifier]
    lateinit var linux: dagger.Lazy<Computer>
    @set:Inject
    lateinit var timestamp: Date
    /* ... */
    private fun show() {
   
        val builder = StringBuilder(timestamp.toString()).append("\n")
        if (System.currentTimeMillis() % 2 == 0L) {
    // 双数时显示linux
            linux.get().execute(builder)
        } else {
    // 单数时显示windows
            windows.get().execute(builder)
        }
        text_view.text = builder.toString()
    }
}

我们可以在WindowsComputerLinuxComputer初始化块中添加Log以验证是否有被实例化:

class WindowsComputer(price: Int) : Computer("Windows", price) {
   
    init {
    Log.i("Computer", "WindowsComputer: init") }
}

class LinuxComputer(price: Int) : Computer("Linux", price) {
   
    init {
    Log.i("Computer", "LinuxComputer: init") }
}

这里就不贴出实验结果了,相信大家都能猜到,也就是说dagger的@Component是支持懒加载(Lazy)的形式提供依赖注入的

接下来就是源码分析了,我们先看下用到的Lazy接口和dagger生成的DaggerCaseActivityComponent有什么变化:

/* dagger.Lazy */
public interface Lazy<T> {
   
  T get(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值