美文网首页
依赖注入 1

依赖注入 1

作者: ivotai | 来源:发表于2020-03-25 19:26 被阅读0次

为什么使用依赖注入

A 依赖 B,B 依赖 C,C 依赖 D...
使用依赖注入后,只需要关注 B 。

为什么使用 Dagger2

大家都在用。

Inject 和 Component

最简单的例子。

// @Inject 放在 constructor 前表示将 Person 声明为依赖
class Person @Inject constructor() {

    fun drink() {
        Logger.d("drink")
    }

}
// Component 按我的理解就是依赖注入器
@Component
interface AComponent {

    // 方法名随意
    fun giveMeAPerson(): Person

}
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        val aComponent = DaggerAComponent.create()
        val person = aComponent.giveMeAPerson()  // 从可用依赖中找到了 Person
        person.drink()
    }

}

2020-03-25 20:11:50.428 31571-31571/com.example.myapplication D/PRETTY_LOGGER: ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2020-03-25 20:11:50.428 31571-31571/com.example.myapplication D/PRETTY_LOGGER: │ Thread: main
2020-03-25 20:11:50.428 31571-31571/com.example.myapplication D/PRETTY_LOGGER: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
2020-03-25 20:11:50.429 31571-31571/com.example.myapplication D/PRETTY_LOGGER: │ MainActivity.onCreate  (MainActivity.kt:15)
2020-03-25 20:11:50.430 31571-31571/com.example.myapplication D/PRETTY_LOGGER: │    Person.drink  (Person.kt:9)
2020-03-25 20:11:50.430 31571-31571/com.example.myapplication D/PRETTY_LOGGER: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
2020-03-25 20:11:50.431 31571-31571/com.example.myapplication D/PRETTY_LOGGER: │ drink
2020-03-25 20:11:50.431 31571-31571/com.example.myapplication D/PRETTY_LOGGER: └────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Inject 和 Component 的第二种用法

Inject 还能表明属性需要注入,修改代码如下。

@Component
interface AComponent {

    // 方法名随意
    fun iCanInject(a: MainActivity)

    fun giveMeAPerson(): Person

}
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val aComponent = DaggerAComponent.create()
        aComponent.iCanInject(this) // 依赖注入
        person.drink()
    }

    @Inject
    lateinit var person: Person

}

日志一样。

Drink What ?

那个人在喝什么,茶吗,红茶还是绿茶,修改代码如下。

interface Tea 
class Person @Inject constructor(private val tea: Tea) {

    fun drink() {
        Logger.d("drink $tea")
    }

}

运行程序,报错。

Tea cannot be provided without an @Provides-annotated method.

意思就是依赖中找不到 Tea,而接口又没有构造函数,无法声明为依赖。

Module 和 Provides

修改代码。

class RedTea : Tea 
@Module
class AModule {

    @Provides
    fun provideATea(): Tea {
        return RedTea()
    }

}
// 表明还可以从 AModule 中寻找依赖。
@Component(modules = [AModule::class])
interface AComponent {

    fun iCanInject(a: MainActivity)

    fun giveMeAPerson(): Person

}
2020-03-25 20:53:40.038 32333-32333/com.example.myapplication D/PRETTY_LOGGER: ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────
2020-03-25 20:53:40.038 32333-32333/com.example.myapplication D/PRETTY_LOGGER: │ Thread: main
2020-03-25 20:53:40.038 32333-32333/com.example.myapplication D/PRETTY_LOGGER: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
2020-03-25 20:53:40.039 32333-32333/com.example.myapplication D/PRETTY_LOGGER: │ MainActivity.onCreate  (MainActivity.kt:15)
2020-03-25 20:53:40.040 32333-32333/com.example.myapplication D/PRETTY_LOGGER: │    Person.drink  (Person.kt:9)
2020-03-25 20:53:40.040 32333-32333/com.example.myapplication D/PRETTY_LOGGER: ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
2020-03-25 20:53:40.040 32333-32333/com.example.myapplication D/PRETTY_LOGGER: │ drink com.example.myapplication.RedTea@8e6fb69
2020-03-25 20:53:40.040 32333-32333/com.example.myapplication D/PRETTY_LOGGER: └────────────────────────────────────────────────────────────────────────────────────────────────────────────────

相关文章

  • Jetpack - Hilt

    Jetpack - Hilt依赖注入、依赖注入框架Android 常用的依赖注入框架Hilt 的简单使用 1. 依...

  • 依赖注入 1

    为什么使用依赖注入 A 依赖 B,B 依赖 C,C 依赖 D...使用依赖注入后,只需要关注 B 。 为什么使用 ...

  • Dagger2使用简析——序章

    在具体使用前,首先来了解一个概念——依赖注入 1. 依赖注入 什么是依赖注入依赖注入是由于类之间的依赖关系产生的,...

  • 开源项目的依赖注入

    开源项目的依赖注入 依赖注入概念 依赖注入(DI:Dependency Injection): 依赖注入方式: B...

  • Android第三方の依赖注入【Dagger/ButterKni

    1. 依赖注入 1.1. 概念 依赖注入是一种 “设计模式” 。最早出现在Spring中。依赖注入:【DI:Dep...

  • Spring学习笔记:依赖注入

    定义 所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。 依赖注入的几种方式 1.构造器注入 ...

  • 【北京第一百零四期】angularjs中的依赖注入

    1.背景介绍 今天给大家讲的是angular的依赖注入,首先,我们要介绍一下什么是依赖注入 依赖注入,我们打个比喻...

  • 资料收集

    依赖注入 AngularJs依赖注入的研究 (已读) 依赖注入(已读)

  • Dagger学习笔记

    1.理解依赖注入 依赖注入(Dependency Injection,简称 DI) 是用于实现控制反转(Inver...

  • Dagger2常用注解诠释

    依赖注入 控制反转(IoC)与依赖注入(DI)浅谈依赖注入理解依赖注入(IOC)和学习Unity Gradle配置...

网友评论

      本文标题:依赖注入 1

      本文链接:https://www.haomeiwen.com/subject/qlgxuhtx.html