首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

dagger2的学习

注意,控制反转不等同于依赖注入,控制反转还有一种实现方式叫“依赖查找” Dagger2 Dagger2的作用目的:提供对象实例 1、使用@Inject标注构造函数来提供依赖的对象实例的方法 @Inject...有三种情况不能使用 A、接口没有构造函数 B、第三方库的类不能被标注 C、构造函数中的参数必须配置 ?...Provider,每次调用它的 get() 方法都会调用到 @Inject 构造函数创建新实例或者 Module 的 provide 方法返回实例 5、Qualifier(限定符):用于module...提供多同个类的多个对象的,限定区分,即:Qualifier(限定符)的作用相当于起了个区分的别名 6、Scope(作用域):是用来确定注入的实例的生命周期的,如果没有使用 Scope 注解,Component...8、@BindsInstance 用于再创建Component的时候绑定依赖实例,用以注入 总结: 1、Dagger2 依赖注入,目的就是提供对象,在dagger2提供对象有两种方式@Inject

60510

快刀斩乱码—— Dagger2没有想象的那么难

这篇文章并不是讲解Dagger2的基础使用,而是通过讲解它的使用以及套路,帮助大家更好的理解如何高效的使用Dagger2,相信大家看完,一定会对Dagger2的理解更加深刻!...这样的话,当注解一个Context的时候,我们可以用这个标识符来告诉Dagger我们想提供哪一种Context。Dagger2里面已经存在一个限定符@Named注解。...@Inject提供依赖虽然很简单,但是它也有缺陷: 只能标记一个构造方法,如果我们标记两个构造方法,编译的时候就会报错。因为不知道到底要用哪一个构造提供实例。...不能标记其它我们自己不能修改的类,如第三方库,因为我们没办法用@Inject标记它们的构造函数。...若存在参数,则从步骤1开始初始化每个参数 若不存在创建类方法,则查找该类型的类中有@Inject标记的构造方法,查看构造方法中是否有参数 若构造方法中无参数,则直接初始化该类实例,一次依赖注入到此结束。

1.1K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Dagger2从懵懂到精通,在线学习那点事儿

    恩,这里有个关键字依赖注入,因此我们得先知道什么是依赖注入,才能更好的理解Dagger2。 依赖注入是面向对象编程的一种设计模式,其目的是为了降低程序耦合,这个耦合就是类之间的依赖引起的。...之所以有Module类主要是为了提供那些没有构造函数的类的依赖,这些类无法用@Inject标注,比如第三方类库,系统类,以及上面示例的View接口。...()方法返回这个View,当去实例化MainPresenter时,发现构造函数有个参数,此时会在Module里查找提供这个依赖的方法,将该View传递进去,这样就完成了presenter里View的注入...我们来重新理一遍上面的注入过程,首先弄清楚以下几个概念: @Inject 带有此注解的属性或构造方法将参与到依赖注入中,Dagger2会实例化有此注解的类 @Module 带有此注解的类,用来提供依赖,...,所以我们定义了一个类,叫做MainModule,提供一个方法provideMainView,用来提供这个依赖,这个MainView是通过MainModule的构造函数注入进来的,接着我们需要定义Component

    65300

    Dagger2的轻松愉悦解析

    由 @Inject 指向需要构成注入的类和环境。 由 @Module 提供生成对象所需的参数。(一般是在 @Inject 注解的对象,其构造函数无法添加 @Inject时使用。)...内部成员被 @Inject 注解时,如 mTasksPresenter,Dagger2 就会找 TasksPresenter 中被 @Inject 注解的构造函数,如果找到了,便对其构建注入。  ...图中 TasksPresenter 的构造函数有参,需要 tasksRepository 和 tasksView 两个参数,那便是后面的@Module的用武之地,它将提供“后门注入”支持。 ?..., 如下图3,这是由Dagger2的自动编译生成的,这个工厂用于提供实例化类,其中的get()方法便是在注入时被调用。...使用 @Module 提供构造方法中无法注解的参数。 使用 @Component 连起起来,并且调用注入。

    51310

    「android」摆正姿势,dagger2,从精通到上瘾

    所以也许会有正在学习或即将要使用dagger2的同学在使用过程中遇到和我一样的困惑,因此我决定把我对dagger2的理解、使用经验分享给大家,希望能对大家有帮助。 我会分几节给讲解dagger2。...B{ @Inject B(){ } } 这样我们就可以让目标类中所依赖的其他类与其他类的构造函数之间有了一种无形的联系。...我们不讨论具体类的代码,我想从抽象概念的角度来讨论Component。上文中提到Component在目标类中所依赖的其他类与其他类的构造函数之间可以起到一个桥梁的作用。...因此我们也可以给Component叫另外一个名字注入器(Injector) component.png 小结下 目标类想要初始化自己依赖的其他类:用Inject注解标注目标类中其他类 用Inject注解标注其他类的构造函数...Inject主要是用来标注目标类的依赖和依赖的构造函数 Component它是一个桥梁,一端是目标类,另一端是目标类所依赖类的实例,它也是注入器(Injector)负责把目标类所依赖类的实例注入到目标类中

    99530

    带你解析Dagger2

    刚开始,Dagger2解决问题的基本思想是:利用生成和写的代码混合达到看似所有的产生和提供依赖的代码都是手写的样子。...Dagger2注解解释: 接下来介绍Dagger2中的每一个概念: @Inject: 通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。...@Provide: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。...: 构造方法注入:在类的构造方法前面注释@Inject 成员变量注入:在类的成员变量(非私有)前面注释@Inject 函数方法注入:在函数前面注释@Inject 这个顺序是Dagger建议使用的...这在Android的activity或者fragment中使用成员变量注入会经常遇到,因为我们没有在它们的构造方法中使用。 看一下我们是如何在BaseActivity中注入一个成员变量。

    75040

    Jetpack新成员,一篇文章带你玩转Hilt和依赖注入

    那么下面我们就开始逐步学习如何在各种更加复杂的场景下使用Hilt进行依赖注入。 首先一个很容易想到的场景,如果我的构造函数中带有参数,Hilt要如何进行依赖注入呢?...类就变成了无参构造函数的依赖注入方式。...总结一下,就是Truck的构造函数中所依赖的所有其他对象都支持依赖注入了,那么Truck才可以被依赖注入。 现在重新运行一下程序,打印日志如下所示: ?...毫无疑问,我们目前所掌握的技术是无法对接口进行依赖注入的,原因也很简单,接口没有构造函数。 不过不用担心,Hilt对接口的依赖注入提供了相当完善的支持,所以你很快就能掌握这项技能。...那么当在Truck中给engine字段进行依赖注入时,到底是使用bindGasEngine()函数提供的实例呢?还是使用bindElectricEngine()函数提供的实例呢?

    2.6K30

    安卓第三方组件收集

    Dagger 2 Dagger2 注解 开篇我们就提到Dagger2是基于Java注解来实现依赖注入的,那么在正式使用之前我们需要先了解下Dagger2中的注解。...@Inject:@Inject有两个作用,一是用来标记需要依赖的变量,以此告诉Dagger2为它提供依赖;二是用来标记构造函数,Dagger2通过@Inject注解可以在需要这个类实例的时候来找到这个构造函数并把相关实例构造出来...你可能会有点困惑,上面不是提到用@Inject标记构造函数就可以提供依赖了么,为什么还需要@Module?...很多时候我们需要提供依赖的构造函数是第三方库的,我们没法给它加上@Inject注解,又比如说提供以来的构造函数是带参数的,如果我们之所简单的使用@Inject标记它,那么他的参数又怎么来呢?...@Qulifier的存在正式为了解决这个问题,我们使用@Qulifier来定义自己的注解,然后通过自定义的注解去标注提供依赖的方法和依赖需求方(也就是被@Inject标注的变量),这样Dagger2就知道为谁提供依赖了

    38810

    轻松学,听说你还没有搞懂 Dagger2

    而 GreenDao、Butterknife、Dagger2 这些因为涉及到了反射处理,而反射处理相对于正常开发速度很慢,所以它们通常在编译时产生一些新的代码,然后才能在程序运行过程中使用,也就是说它们都把反射处理移动到编译器编译代码时的阶段...有了 DaggerPlatform,我们就能够使用 Dagger2 进行代码的依赖注入了。...所以,@Component 和 @Inject 的配合就能够使用 Dagger2 了,但这里面存在一个局限,@Inject 只能标记在我们自己编写的类的构造方法中,如果我们使用第三方的库或者标准库的话,...这样,FoodComponent 也提供了瓜子和火腿肠的依赖。我们再看如何使用?...Subcomponent 时,还是要先构造 ParentComponent 对象,然后通过它提供的 SubComponent 再去进行依赖注入。

    2.1K20

    Dagger2-从入门到精通(上)

    前言 最近在做项目中,用到了Dagger2,所以找了一些博客和其他的一些学习资源,算是知道如何使用了,但是对其理解还相差很远。所以这篇文章重点针对与使用,和使用中常见的一些问题。...我们想要构造对象并提供这些依赖。...Dagger2该如何使用呢?...,因为我们UserModule需要context参数,所以我们选择这种构建方法 可以看到在创建对象时我们可以在module中像之前一样提供一个创建的方法,第二种我们也可以通过在对象的构造函数上加上@Inject...注解,这里我们需要一个url和context,我们只需要提供一个创建String的url方法即可,并通过UserModule的构造函数将conetxnt传入,最后提供一个创建UserManager的方法将两个参数穿进去

    1.2K10

    Dagger2 入门解析

    不过可以通过其他的手段弥补。 以下来自详解Dagger2 @Inject: 通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。...@Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的 依赖。...@Provide: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。...刚看到这里会好奇,module已经可以把bean提供出来注入了,为啥还需要子组件? 我并没有真实的在生产环境中使用过dagger,全部认知也就来自对官方文档里的理解。...,可以互相inject 能使用Singleton的时候,要注意标注,否则默认多例 命名规约 @Provides方法用provide前缀命名 @Module 用Module后缀命名 @Component

    1.5K120

    Android 使用dagger2进行依赖注入(基础篇)

    前言 Dagger2是首个使用生成代码实现完整依赖注入的框架,极大减少了使用者的编码负担, 本文主要介绍如何使用dagger2进行依赖注入。如果你不还不了解依赖注入,请看这一篇。 1....一旦我们的UserModel的创建方式发生了改变(比如需要传入Context对象到构造函数),我们就需要修改所有创建UserModel的代码。...如果函数声明参数为Activity,dagger2会认为没有需要注入的对象。...至此,我们使用dagger实现了最简单的依赖注入。 2. 多层依赖 除了上面这种最简单的形式,dagger2还可以使用component作为component的依赖,实现多层级的依赖注入。...最后 本文试图用最简单的例子介绍Android中如何使用dagger2进行依赖注入,因此有很多dagger2的特性并未涉及,比如@Scope注释,以及dagger2自动生成代码的分析调试。

    1.1K70

    Dagger2 使用总结(一)

    Dagger2是一套依赖注入框架,在编译期间自动生成代码,创建依赖的对象。项目中使用Dagger2可以降低代码的耦合度。...使用Dagger2库,重点是了解其中的各种注解并熟练使用,下面看一下具体用例。...这样看起来比不使用Dagger2注入对象要简单很多,但是如果对象引用的地方很多,构造复杂,那么一旦改变构造,工作量会很大,这也是Dagge2最重要的优势——解耦。 ?...小结 以上是Dagger2最简单的使用方法,注入依赖后,会用在Apple类中标注@Inject注解的构造器自动创建apple对象。...在MainActivity中注入对象 ? ? 小结 使用@Inject和@Component注解注入对象时, 我们需要在声明的注入类的构造器上加上@Inject注解来使对象被创建。

    1.1K10

    Andriod-Dagger2

    翻译成中文就是: Dagger2是Java和Android的快速依赖注入器,是依赖注入的编译时框架。它不使用反射或运行时字节码生成,在编译时进行所有分析,并生成纯Java源代码。...Dagger主要是以下几个注入标签,我们来一一说明: @Inject 简介:如果在类上添加此依赖注入,Dagger 就会构造一个这个类的实例并满足他们的依赖。...,我们直接在构造函数上声明了@Inject注解,这个注解有什么用呢?...当Component在所拥有的Module类中找不到依赖需求方需要类型的提供方法时,Dagger2就会检查该需要类型的有没有用@Inject声明的构造方法,有则用该构造方法创建一个,注意:这次我没是没有在...,一个是在Module里提供的依赖,规则是这样的:查找Module中是否存在创建该类的方法,如果没有则查找Inject注解的构造函数 4.高级使用 说完了基本使用,我们来看看Dagger2高级使用的注解

    2.2K10

    一个 android 的框架

    具体分析 dagger2 项目使用了 dagger2 依赖注入框架解耦个层,使得单测和框架替换变得很容易 ApplicationComponent 首先看ApplicationComponent,他有一个...Moudle,并且将这个Moudle中的提供的构造方法暴露出来,可以看到DatabaseHelper、PreferencesHelper等暴露出来的都是全局使用的对象 @Singleton @Component...,则查找Inject注解的构造函数,看构造函数是否存在参数 步骤3.1:若存在参数,则从步骤1开始依次初始化每个参数 步骤3.2:若不存在参数,则直接初始化该类实例,一次依赖注入到此结束 因为在使用第三方代码时...,我们无法修改源码的构造方法,所以使用 Module 来提供注入构造 所以再回来看DataManager的构造方法 @Inject public DataManager(RibotsService...,当注入了DataManager时,在module中找不到对应的 provide 方法,变会在构造方法中寻找,在递归的找参数中的注入… 以下用一张图来概括 ?

    84680

    Android集成Dagger2

    Dagger2是一种依赖注入框架,用来帮我们进行类初始化的工作,通常配合MVP架构模式使用。...当我们需要吃饭店的饭的时候,就需要通知送餐员,然后餐厅做好交给送餐员,送餐员在提供给我们。 所以Moudle是帮我们进行构造实例的地方,Component则是需求方和供应方中间的桥梁。...有了一个大概理解以后,接下来介绍下Dagger2主要用到的四个注解和它们的作用。 @Inject: 通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。...(主要用在Container上面) @Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例 时候,就知道从哪里去找到需要的依赖...@Provide: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。

    64950

    如何使用MVP+Dagger2+RxJava+Retrofit开发(1)

    Dagger2库 关键概念 Inject--你用它告诉Dagger这个类或者字段需要依赖注入 Module-- Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger...在构造类的实例的时候,就知道从哪里去找到需要的依赖 Provide--在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。...mvp架构基本搭建,下面是如何运用dagger2; 创建提供应用实例的AppComponent 一个应用在创建时会产生唯一的Application对象,可以在应用的onCreate函数创建,下面有几个步骤...总结 创建module,一般应用于第三方包对象或者应用对象 创建Component,依赖注入器,复杂把注入对象注入到注解成员变量 构造方法注入:在类的构造方法前面注释@Inject 成员变量注入:...在类的成员变量(非私有)前面注释@Inject 开始注入调用注射器的Inject方法 详解Dagger2 Android官方MVP架构示例项目解析 dagger2 让你爱不释手

    1.6K80

    Spring 5.0.0框架介绍_中文版_3.9

    如果一些构造函数是可获得的,至少有一个必须要加上注解,以便于告诉容器使用哪一个。...在这种情况下,会考虑这些候选者中的每一个,Spring使用最贪婪的构造函数,即依赖最满足的构造函数,具有最大数目的参数。...然而,尽管你可以使用这个约定根据名字引用特定的beans,但是@Autowired从根本上来讲是使用可选的语义限定符来进行类型驱动注入的。...或者,使用@Resource通过它的唯一名字可能得到一个返回当前bean的代理。 @Autowired可以应用到字段,构造函数和多参数方法上,允许通过限定符注解在参数层面上缩减候选目标。...相比之下,@Resource仅支持字段和bean属性的带有单个参数的setter方法。因此,如果你的注入目标是一个构造函数或一个多参数的方法,坚持使用限定符。 你可以创建自己的定制限定符注解。

    98310

    Spring 5.0中文版-3.9

    如果一些构造函数是可获得的,至少有一个必须要加上注解,以便于告诉容器使用哪一个。...在这种情况下,会考虑这些候选者中的每一个,Spring使用最贪婪的构造函数,即依赖最满足的构造函数,具有最大数目的参数。...然而,尽管你可以使用这个约定根据名字引用特定的beans,但是@Autowired从根本上来讲是使用可选的语义限定符来进行类型驱动注入的。...或者,使用@Resource通过它的唯一名字可能得到一个返回当前bean的代理。 @Autowired可以应用到字段,构造函数和多参数方法上,允许通过限定符注解在参数层面上缩减候选目标。...相比之下,@Resource仅支持字段和bean属性的带有单个参数的setter方法。因此,如果你的注入目标是一个构造函数或一个多参数的方法,坚持使用限定符。 你可以创建自己的定制限定符注解。

    1.7K100

    关于Spring注解容器配置的那些事,掌握这几点,不再难!

    如果一些构造函数是可获得的,至少有一个必须要加上注解,以便于告诉容器使用哪一个。...在这种情况下,会考虑这些候选者中的每一个,Spring使用最贪婪的构造函数,即依赖最满足的构造函数,具有最大数目的参数。...限定符值为”main”的bean被组装到有相同值的构造函数参数中。...或者,使用@Resource通过它的唯一名字可能得到一个返回当前bean的代理。 @Autowired可以应用到字段,构造函数和多参数方法上,允许通过限定符注解在参数层面上缩减候选目标。...相比之下,@Resource仅支持字段和bean属性的带有单个参数的setter方法。因此,如果你的注入目标是一个构造函数或一个多参数的方法,坚持使用限定符。 你可以创建自己的定制限定符注解。

    67220
    领券