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

Dagger 2-哪个更好,注入构造函数还是提供方法?

Dagger 2是一个Java和Android的依赖注入框架,它可以帮助开发者管理和解决依赖关系。在Dagger 2中,有两种方式可以进行依赖注入:注入构造函数和提供方法。

  1. 注入构造函数:
    • 概念:注入构造函数是指通过在类的构造函数上添加注解,告诉Dagger 2如何创建该类的实例,并自动解决其依赖关系。
    • 优势:使用注入构造函数可以使代码更加简洁和可读,同时也能够提供更好的可测试性和可维护性。
    • 应用场景:注入构造函数适用于需要在创建类的实例时注入依赖的情况,特别是对于那些依赖关系比较复杂的类。
    • 推荐的腾讯云相关产品:腾讯云容器服务(TKE)是一种基于Kubernetes的高度可扩展的容器管理服务,可帮助您快速构建、部署和管理容器化应用程序。详情请参考:腾讯云容器服务(TKE)
  • 提供方法:
    • 概念:提供方法是指通过在类中添加带有注解的方法,告诉Dagger 2如何提供该类的实例,并自动解决其依赖关系。
    • 优势:使用提供方法可以更加灵活地控制依赖的创建和提供过程,特别适用于需要根据不同条件动态创建依赖的情况。
    • 应用场景:提供方法适用于需要动态创建依赖或者需要在创建依赖时进行一些额外的逻辑处理的情况。
    • 推荐的腾讯云相关产品:腾讯云函数计算(SCF)是一种事件驱动的无服务器计算服务,可帮助您快速构建和运行云端应用程序。详情请参考:腾讯云函数计算(SCF)

综上所述,注入构造函数和提供方法在不同的场景下有不同的优势和应用。在实际开发中,可以根据具体需求选择合适的方式进行依赖注入。腾讯云提供了丰富的云计算产品和服务,如腾讯云容器服务和腾讯云函数计算,可以帮助开发者快速构建和部署应用程序。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

2是标记类中的构造方法,告诉Dagger我可以提供这种类型的依赖实例。 @Provide: 对方法进行注解,都是有返回类型的。...不能标记其它我们自己不能修改的类,如第三方库,因为我们没办法用@Inject标记它们的构造函数。...举个例子,还是User类,有一个带参的构造方法, @Inject public User(String name) { this.name = name; } 如果用@Inject标记带参的构造方法...完成上面两步之后我们会不会有这样的思考:如果同时有@Module和@Inject构造方法提供同一类型的实例,Dagger会调用哪个呢?这就牵涉到@Module和@Inject的优先级问题了。...这个AppComponent接口内没有inject方法,因为具体地注入哪个类,是由依赖它的Component决定的。

1K20

Dagger2入门

2.需要依赖的成员和提供依赖的成员构造函数用@Inject标注 City.java ? Province.java ?...可以看到,不管是通过builder().build()还是create(),最后都会调用DaggerMainActivityComponent构造函数;在通过源码阅读后,可以将整个过程分为两步,分别是initialize...不管是通过builder().build()还是create(),最后都会调用DaggerMainActivityComponent构造函数;和上面对比这里多了一步,那就是创建了BeanModule实例...如果我们要注入的对象是个接口,接口不能被实例化;或者是我们要注入的对象是第三方库,我们没法把@Inject标注在三方库的构造函数上,真是这样的么?...问题又来了,如果依赖的提供方同时存在以@Inject标注和以@Module、@Providers标注,会找哪个

35710

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

恩,这里有个关键字依赖注入,因此我们得先知道什么是依赖注入,才能更好的理解Dagger2。 依赖注入是面向对象编程的一种设计模式,其目的是为了降低程序耦合,这个耦合就是类之间的依赖引起的。...View,当去实例化MainPresenter时,发现构造函数有个参数,此时会在Module里查找提供这个依赖的方法,将该View传递进去,这样就完成了presenter里View的注入。...我们来重新理一遍上面的注入过程,首先弄清楚以下几个概念: @Inject 带有此注解的属性或构造方法将参与到依赖注入中,Dagger2会实例化有此注解的类 @Module 带有此注解的类,用来提供依赖,...,所以我们定义了一个类,叫做MainModule,提供一个方法provideMainView,用来提供这个依赖,这个MainView是通过MainModule的构造函数注入进来的,接着我们需要定义Component...到这里,就分析完了Dagger2的注入过程,如果不去看这些生成的类,就很难理解整个过程究竟是怎么发生的,从而导致还是不知道怎么去使用这个依赖注入框架。

62600

Hilt-依赖注入框架上手指南

对于Android开发者来说,Hilt可以说专门为Android 打造,提供了一种将Dagger依赖项注入到Android应用程序的标准方法,而且创建了一组标准的组件和作用域,这些组件会自动集成到Android...,需要将 @Inject 添加到要注入的类的构造函数中。...使用@Provides告诉Hilt如何获得具体实例 用来告诉Hilt 如何提供不能被构造函数注入的类型 每当 Hilt 需要提供该类型的实例时,将执行带注释的函数函数主体。...使用@Binds为接口提供注入 对于接口,无法使用构造函数进行注入,我们需要告诉Hilt使用哪种实现。...,继续代码演示 接着有一个具体的实现类 BookImpl ,这里我们使用构造函数注入 并且注入了 BookDao 用来处理具体的数据存储。

1.6K10

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

di.png 若您还是对依赖注入不了解,点击我可以让您了解更多 dagger2就是实现依赖注入的一种技术手段。...上文中提到Component在目标类中所依赖的其他类与其他类的构造函数之间可以起到一个桥梁的作用。...因此我们也可以给Component叫另外一个名字注入器(Injector) component.png 小结下 目标类想要初始化自己依赖的其他类:用Inject注解标注目标类中其他类 用Inject注解标注其他类的构造函数...Inject主要是用来标注目标类的依赖和依赖的构造函数 Component它是一个桥梁,一端是目标类,另一端是目标类所依赖类的实例,它也是注入器(Injector)负责把目标类所依赖类的实例注入到目标类中...希望能帮您更好的理解dagger2。

95730

Android注解三大框架Dagger、Hilt 和 Koin 有何不同?

Dagger 如果我们希望 Dagger 提供某个类的实例,我们要做的就是在构造函数中添加 @Inject 注解。...get()方法将查找为给定类型的类注册工厂,并将其注入其中。 image.png 有什么影响? Dagger 生成代码来提供依赖,而 Koin 不生成代码,这实际上带来了一些影响。 1....错误处理 因为Dagger 是一个编译时依赖注入框架,如果我们忘记提供某些依赖,我们几乎会立即知道我们的错误,因为我们的项目将构建失败。...例如,如果我们忘记向构造函数的 CompositeAdapter 中添加 @Inject 注解,并尝试将其注入 fragment 中,则构建将失败,并显示适当的错误,确切地告诉我们出了什么问题。...老实说,我认为选择 Dagger 还是 Koin 并不重要,重要的是能够让你编写干净、简单且易于单元测试的代码。我认为所有的库:Koin,Dagger 和 Hilt 都达到了这个目的。

1.9K40

Dagger2的轻松愉悦解析

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

47710

dagger2的学习

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

56410

kotlin使用Dagger2的过程全纪录

这个注解本身并没有作用,它需要依赖于注入框架才具有意义,可以用来标记构造函数、属性和方法。 标记构造函数 被标记的构造函数可以有0个或多个依赖作为参数。 同一个类中最多只可以标记一个构造函数。...还有一种做法是@Inject标记被注入类的某个方法,该方法会在类的构造方法之后接着被调用: data class People constructor(val name: String) { @Inject...在Component中一般可以定义两种方法: Members-injection methods: 该方法有一个参数,表示需要注入到的类,提醒Dagger在该类中寻找需要被注入的属性(被@Inject...Provision methods: 该方法没有参数,返回一个需要被注入(或被提供)的依赖。...an injectable constructor and governs how the injector reuses instances of the type @Scope是用来标记包含可注入构造函数的类或者提供注入依赖对象的类

1.2K20

Android--Dagger2入门

Dagger也是一个IOC框架,对于大型项目,我们有必要去学习使用它 一、构造函数注入 dagger拥有两种方式注入对象,一种是利用@Inject注解构造函数 1.gradle中导入dagger依赖 在...} 2.自定义类,并对构造函数使用@Inject注解 这边定义两个类,分别代表本地和远程的数据源,并对构造函数使用@Inject注解 /** * 模拟本地数据源 */ class LocalDataSource...帮我们自动生成注入对象了,并且我们在使用的地方不需要关注它是如何生成的 二、模块注入 第二种方式就是模块注入构造函数注入是以类为对象,模块注入则是以方法为对象 接下来尝试使用网络请求,以获取百度的首页...同一个Component实例在注入对象时,一旦发现注入方式使用了作用域,那么它们注入的对象将会是同一份实例 1.使用@Singleton注解实现注入相同实例 @Singleton注解为dagger默认提供的一个作用域注解...定义一个构造函数注入方式,并使用该注解 /** * 表示该注入的对象的作用域为Singleton * Created by aruba on 2021/12/4. */ @Singleton class

50610

安卓第三方组件收集

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

36210

Andriod-Dagger2

我们都知道Android应用使用Dagger最主要的困难就是一些Framework类(如Activity、Fragment)是由操作系统实例化的,而Dagger更好工作的前提是它可以构建所有的注入对象。...@Provides注解的方法中选择调用哪个方法。...类中要提供依赖的注解方法用@Provides注解声明,以此来告诉Dagger构造对象并提供这些依赖 @Provides public PhotoUtil photoInstance...当Component在所拥有的Module类中找不到依赖需求方需要类型的提供方法时,Dagger2就会检查该需要类型的有没有用@Inject声明的构造方法,有则用该构造方法创建一个,注意:这次我没是没有在...,一个是在Module里提供的依赖,规则是这样的:查找Module中是否存在创建该类的方法,如果没有则查找Inject注解的构造函数 4.高级使用 说完了基本使用,我们来看看Dagger2高级使用的注解

2.2K10

一个 android 的框架

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

79980

Hilt三问—你了解依赖注入

所以官方也是为了让我们更好使用依赖注入框架,为我们封装了一个新的框架——Hilt,今天一起来看看: 依赖注入是啥?为什么需要她? Hilt是啥,怎么用? Hilt支持哪些类的依赖注入。 依赖注入是啥?...很明显,Hilt就是一个依赖注入库,一个封装了Dagger,在Dagger的基础上进行构建的一个依赖注入库。...用于提供类的依赖,也就是代表这个类会用到注入的实例。 @Inject。这个注解是用来告诉 Hilt 如何提供该类的实例,它常用于构造函数、非私有字段、方法中。 Hilt支持哪些类的依赖注入。...用于被 @Module注解标记类的内部的方法,并提供依赖项对象。 @Singleton。...提供单例 3)为ViewModel提供的专门的注解 @ViewModelInject,在Viewmodel对象的构造函数中使用 @ViewModelInject 注解可以提供一个 ViewModel。

1.1K00

Dagger2-从入门到精通(上)

@Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger构造类的实例的时候,就知道从哪里去找到需要的 依赖。...我们想要构造对象并提供这些依赖。...@Provide: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。 现在我们回头在看看概念是不就明白其中的含义了。...,因为我们UserModule需要context参数,所以我们选择这种构建方法 可以看到在创建对象时我们可以在module中像之前一样提供一个创建的方法,第二种我们也可以通过在对象的构造函数上加上@Inject...注解,这里我们需要一个url和context,我们只需要提供一个创建String的url方法即可,并通过UserModule的构造函数将conetxnt传入,最后提供一个创建UserManager的方法将两个参数穿进去

1.1K10

Dagger 到 Hilt,谷歌为何执着于让我们用依赖注入

要初始化一个依赖,有两种方法:第一,你这个类自己初始化: ? 第二,让外部帮你初始化。 其中这第二种,让外部帮你初始化你的依赖,就叫依赖注入。...所以 Factory 的使用是依赖注入吗? ? 是的。 Builder? ? 也是。 带参数的构造函数? ? 也是!...虽然很多人在面对 Dagger 的时候会问「依赖注入到底有什么用」,但其实 Dagger 并不是提供了依赖注入的能力,而是为依赖注入提供了一种更简单的方式。...依赖注入本来就是有用的,这个问题不想明白,不管是 Dagger 还是现在的 Hilt,你都用不好。 Dagger 让我们可以用注解的方式来配置依赖关系,让依赖注入变得更方便。...加载的方式可以选择直接调用构造函数: ? 或者指定子类或实现类: ? 或者干脆给出具体的代码: ? 加载的作用域可以选择默认的每次都初始化,也可以设置成全局单例的: ?

1.2K20

Android |《看完不忘系列》之dagger

(控制),比如常见的构造方法和setter都叫注入。...engine = new Engine(); } 二、手动依赖注入,如构造方法和setter,当需要替换汽车引擎时,传入不同的引擎实现(如ElectricEngine extends Engine)...-- 谷歌 Hilt就先放一放,下面我们先开始dagger之旅吧~ 补:关于手动注入的痛点,可以看下谷歌的手动依赖项注入(看完或许能更好的理解dagger的设计)。...因为我有两种引擎,分别是汽油车的GasEngine,和电动车的ElectricEngine,接口没有构造方法怎么注入?此时@Module和@Binds注解就派上用场了。...,比如Retrofit是三方库的类我们没法标记其构造方法,则可以用Provides提供, @Module public class NetworkModule { @Provides public

88510

带你解析Dagger2

@Module: Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger构造类的实例的时候,就知道从哪里去找到需要的 依赖。...@Provide: 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。...给了我们一堆选择用来注入依赖: 构造方法注入:在类的构造方法前面注释@Inject 成员变量注入:在类的成员变量(非私有)前面注释@Inject 函数方法注入:在函数前面注释@Inject 这个顺序是...activity的注入成员提供依赖,只要我们一调用inject()方法,就可以获取需要的字段和依赖。...第二个重点:关于我们的DaggerApplicationComponent类,我们有一个Provider,它不仅仅是一个提供实例的接口,它还是被ScopedProvider构造出来的,可以记录创建实例的范围

67940
领券