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

为什么Dagger Factory方法不能像Builder那样工作?

Dagger是一个Java和Android的依赖注入框架,它通过生成代码来帮助开发者管理对象之间的依赖关系。Dagger使用注解来标记依赖关系,并在编译时生成相应的代码来创建和提供这些依赖。

在Dagger中,Factory方法和Builder模式都是用来创建对象的常见方式。然而,它们在实现和使用上有一些不同之处。

首先,Factory方法是一种创建对象的设计模式,它使用一个工厂类或者工厂接口来封装对象的创建逻辑。通过调用工厂方法,我们可以获取所需的对象实例。在Dagger中,我们可以使用@Provides注解来标记一个方法作为Factory方法,该方法负责创建和提供特定类型的对象实例。

相比之下,Builder模式是一种创建复杂对象的设计模式,它通过链式调用一系列方法来设置对象的属性和参数,最后调用build()方法来构建对象。Builder模式可以提供更灵活的对象创建方式,允许我们根据需要设置对象的各种属性。在Dagger中,我们可以使用@BindsInstance注解来标记Builder模式中的方法,该方法用于设置对象的属性。

虽然Factory方法和Builder模式都可以用于对象的创建,但它们在Dagger中的使用方式和适用场景有所不同。

Factory方法适用于创建相对简单的对象,它们通常只有一个或少数几个参数,并且不需要复杂的配置。Factory方法可以通过@Module注解和@Provides注解来定义和提供对象的创建逻辑。

Builder模式适用于创建复杂的对象,它们可能有很多属性和参数,并且需要根据不同的需求进行配置。Builder模式可以通过使用带有@BindsInstance注解的接口来定义对象的属性设置方法,并通过调用build()方法来构建对象。

总结起来,Dagger中的Factory方法和Builder模式都是用于对象的创建,但Factory方法更适用于简单的对象创建,而Builder模式更适用于复杂对象的创建和配置。

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

相关·内容

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

关键在于初始化是谁做的,至于最后一步是你把结果拿过来,还是说你连拿都不用拿,最后一步的赋值工作也让外部来帮你做了,这都不重要,只要初始化工作是外部做的,就都叫依赖注入。...所以 Factory 的使用是依赖注入吗? ? 是的。 Builder? ? 也是。 带参数的构造函数? ? 也是!...这些都属于由外部来提供依赖的初始化,所以都是依赖注入,并不是非要 Dagger 那样使用注解的魔法一样的才叫依赖注入。也就是说,其实我们每个人都已经在使用依赖注入了。...它不是从里到外全新开发的,而是基于 Dagger 做的,它的下层还是 Dagger为什么不直接去优化改进 Dagger,而要基于它做一个新库呢?...总之,它是不通用的,只能给 Android 用,所以不能放在 Dagger 里。 有点明白了吧? 那它具体怎么用呢?

1.4K20
  • Android技术栈(三)依赖注入技术的探讨与实现

    所以就有了Liteproj这个库与Dagger不同,Liteproj不使用Java来描述对象间的依赖关系,而是Spring一样使用xml....使用builder标签指定此依赖使用Builder模式生成,指定builder的type为okhttp3.Request$Builder,使用action标签指定最后是调用build方法生成所需要的对象...(当然这也是默认行为,你可以不写出action属性),并使用arg标签给builder赋值,不过要注意,这里的arg标签是有name的,它将会映射到Builder对象的方法调用上去给Builder赋值....,让字面值可以var一样被ref使用 复制代码 完整的xml 最后在这里提一点无论是factory...还是builder都不允许返回null值,默认导入的null只是为了兼容某些特殊情况而设计的,factorybuilder返回null是没有意义的. <?

    82100

    Dagger2 Android应用:@Component和@Module

    举个例子,我们有个咖啡机(这个例子很多介绍Dagger2的地方都用到),就像在星巴克看到的那样,一个咖啡机需要一个泵和一个加热器才能工作 class CoffeeMachine { Pump pumper...这不是我们想要的,试想在一个大型项目里,一个类的构造方法发生变动,就需要修改所有有引用到的地方,工作量巨大。...虽然用Factory类可以解耦,但是取而代之的是我们还要维护具体的Factory代码,还是有工作量的。...注意需要注入的对象不能声明为 private,否则Dagger2会没办法注入,因为它不是用反射的方式注入的。...然而真正实现DI的核心代码是Dagger2自动生产的,我们需要看这部分代码,才能真正明白Dagger2的工作原理,还有更深层次的去理解Dagger2的核心高级用法,@Scope,@SubComponent

    50020

    依赖注入在多模块工程中的应用

    在任何需要注入的地方,我们都需要在合适的时机调用底层函数,大多数情况下不是在对象初始化时就是在 onCreate 方法中。...application 模块大致知道动态功能模块的存在,但是不能直接执行该模块的代码。对于依赖注入,这意味着整体图必须被分解成片。 对一个模块化应用,简单的依赖图通常大致长成下面这样。...} } 在生成的 DaggerSearchComponent 做初始化时我们这样设置了 CoreComponent: DaggerSearchComponent.builder() .coreComponent...当 CoreComponent 上面那样被引用为 SearchComponent 的一个组件依赖时,所有的 CoreComponent 方法可以在 SearchComponent 中使用,或者在其他...Dagger 组件中使用,就好像他们变成注解 @Provides 标记的方法

    1.8K10

    提示 依赖注入在多模块工程中的应用

    总的来说,这不是一篇关于依赖注入的文章,也不是关于我们为什么选择库 X 而不是库 Y 的文章。 相反的,本文从依赖注入的角度介绍了我们对 Plaid 进行模块化实践的主要成果。...application 模块大致知道动态功能模块的存在,但是不能直接执行该模块的代码。对于依赖注入,这意味着整体图必须被分解成片。 对一个模块化应用,简单的依赖图通常大致长成下面这样。 ?...} } 复制代码 在生成的 DaggerSearchComponent 做初始化时我们这样设置了 CoreComponent: DaggerSearchComponent.builder() .coreComponent...当 CoreComponent 上面那样被引用为 SearchComponent 的一个组件依赖时,所有的 CoreComponent 方法可以在 SearchComponent 中使用,或者在其他...Dagger 组件中使用,就好像他们变成注解 @Provides 标记的方法

    1.7K10

    详解Kotlin 中使用和配置 Dagger2

    方法不能相同 @IntoMap @ActivityKey(YourActivity::class) abstract fun bindYourActivity(builder: YourActivitySub.Builder...): AndroidInjector.Factory<out Activity } 新建接口 YouApplicationSub 使用 @Component 注解,继承 AndroidInjector...在 Dagger2 2.11 版本之前,项目中每添加一个 Activity 或 Fragment 等组件,都要新建一个对应 Subcomponent 接口,并添加到对应的 Module 中,并且添加相应的方法...之后每添加一个 Activity,只需要在 Activity 添加一个对应的方法就可以了。...语法解析 Dagger 2 的配置使用说完了,但是相信很多人对上面的一些语法都不了解,这里来简单说明: // Kotlin 提供的方法,能简单快速的生成一个数组 val array = arrayOf

    1.4K30

    Dagger2的轻松愉悦解析

    (本文为拖更而生) 一、Dagger2 介绍 1、为什么使用dagger2  谁用谁知道Σ( ̄。...我是图2  既然知道 @Module 的作用,我们先继续往下走,构造方法被注解的类,会生成一个继承Factory的类,如 TasksPresenter 生成 TasksPresenter_Factory...4、关联总结   来简单总结下生成模版的关系,不感兴趣的可以略过···吧(#゚Д゚): 注解构造方法,生成的 TasksPresenter_Factory ,内部通过 create 方法 创建Factory...TasksModule_ProvideTasksViewFactory ,由Module中@Provide注解的方法生成,内部通过 create 方法创建,通过 get 方法提供 TasksPresenter_Factory...DaggerTasksComponent 中外部提供Builder设置方法,和依赖的Component与module数量有关。如果依赖的未被使用,会有@deprecated提示。 ?

    51110

    Dagger2 入门解析

    [_]P 用法分析 Dagger暴露的最外层为component,而Component的注入来自module。Component之间不能互相注入,module之间可以互相注入。...注入原理 编译时扫描注解,生成对应的builderfactory。这点和spring不同,spring是运行时通过反射生成instance。另一个问题就是由于是静态工厂,那么就不能动态绑定了。...现在不研究Dagger2是如何根据注解去生成工厂的,先来看看工厂是什么东西,理解为什么可以实现了DI(Dependency Injection),如何创建IoC(Inverse of Control)容器...这里有两种Provider 其中,Factory是正宗的工厂。为毛还要专门继承出来一个接口?可以学习下这种抽象方法,虽然Factory和Provider几乎一模一样,但分出来是为了标记。...但也不能不看,因为这是和我们代码关联最紧密的一步。工厂是如何根据我们的注解生产instance的呢?后面再看。学习源码真心提高抽象思维。 至此,initialize 方法结束。

    1.5K120

    Dagger2入门

    在initialize()方法中对成员赋值,这里的成员分为两类,分别以_MembersInjector和_Factory为后缀;Xx_MembersInjector可以理解为注入器,用来实现Xx与内部成员的依赖...可以看到inject()和initialize()刚好是相反的过程,直到找到依赖的源头完成源头对象的实例化,即这里的Street_Factory的get()方法的返回值;在Street实例化完成之后返回给...这里的inject()和injectMembers()的工作和上面是一样的,调用BeaModule中的方法创建需要的实例,若该实例在创建时依赖其他实例,则调用BeaModule中的对应方法先创建依赖实例...多说一点,在这些生成的XX_Factory中还多了一个静态方法,如: ? 因此我们可以在MainActivity直接通过类名调用创建实例。...如果我们要注入的对象是个接口,接口不能被实例化;或者是我们要注入的对象是第三方库,我们没法把@Inject标注在三方库的构造函数上,真是这样的么?

    39010

    Dagger2系列——实例解析

    这篇文章会分享一下实际应用中的Dagger2如何使用,以及Dagger2通过apt插件如何给我们生成代码,以及生成的代码之间的关联。...IRetrofitRequest.class); } } 代码块2:中提供的IRetrofitRequest 实例对象必须要用@Provides标注,该对象是单例的所以用@Singleton标注,这里为什么用这两个注解标注之后就能实现为...BaseActivity中onCreate()中调用的抽象方法 DaggerMainActivityComponent.builder() .mainActivityModule...到底是怎样工作的呢? 先看下生成的代码目录结构: ? 可以看到生成的代码包名还是跟自己代码中的一样,生成的代码的类名也有一定的规则。...如果一个类的构造函数用了@Inject注解标注:例如: public class CC{ @Inject public CC() { } } 就会生成CC_Factory类。

    63231

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

    我个人总结了大家在学习 Dagger2 时,为什么感觉难于理解的一些原因。 对于 Java 注解内容不熟悉。 对于依赖注入手段不熟悉。 对于 Java 反射不熟悉。...所以,Dagger2 会产生中间代码,不少同学应该会有迷惑,为什么引进了 Dagger2 时,要先编译一次代码,不然就会报错。...但是,单单一个 @Inject 是不能Dagger2 正常运行的。还需要另外一个注解配合。这个注解就是 @Component。...那么在 Dagger2 中它表达了一种什么样的能力范围呢? 大家有没有想过,为什么要用 @Singleton 同时标注 @Provides 和 @Component ?... extends Provider { } 调用它的 create 方法会返回一个 Factory 对象,但是 Fractory 是 Provider 的子类。

    2.1K20

    Dagger2神器入门(二)

    在今后的工作中,需要不断review自身代码,随着技术水平的提高,代码质量也需要不断提高。 上面的代码中,我们写了3个类,都是用来造车的构件。...是不是从第3步开始,就不知道为什么这样写了呢? 分析 我们看看CarModule类是用一个@Module注解的类,里面的方法是使用@Provides注解。什么意思呢?...@Provides 表示该方法提供依赖;通过这个注解的方法,能给你提供依赖,看代码应该清楚。 我们知道了管理并提供依赖的类,那么我们就可以通过它来直接使用依赖。...我们用到了@Inject注解, @Inject Engine engine; 上面的代码表示engine这个属性你不用一般情况去初始化(engine= new Engine()),它能给你自动寻找依赖...这章主要是入门了Dagger2,下面我们会了解 1 为什么要使用Dagger2来替代文章一开头的写法? 2 如果@Inject注解的构造器有多个怎么办? 3 如果存在依赖链怎么办呢?

    41030

    Android | dagger细枝篇

    engine); //抽象的IEngine接口作为返回值,具体的GasEngine作为入参,形成绑定关系 //当有地方依赖了IEngine时,这里可以为他提供GasEngine实例 } 为什么用抽象方法...,因为这里我们要做的只是声明绑定关系,dagger根据声明就知道如何提供实例了,dagger不会调用这个方法或为他生成具体实现。...//告知CarGraph如何创建WheelGraph interface Factory { WheelGraph create(); } } 下面要告知dagger...//提供接口,让使用者能借助Factory拿到WheelGraph实例 WheelGraph.Factory wheelGraph(); } 使用, //轮胎图纸 WheelGraph wheelGraph...@Singleton可以实现全局单例,当父组件CarGraph标记了@Singleton,子组件WheelGraph就不能使用相同的@Singleton了,我们可以自定义注解。

    75610

    Andriod-Dagger2

    你就需要添加dagger-android:xxx依赖。 2.1.为什么要添加dagger-android2.x依赖?...我们都知道Android应用使用Dagger最主要的困难就是一些Framework类(如Activity、Fragment)是由操作系统实例化的,而Dagger更好工作的前提是它可以构建所有的注入对象。...image.png 可以看到我们调用相关方法成功,但我们要思考一个问题,这样并不能很好的解耦,什么意思呢,我们来思考个问题?...image.png 那么又有小伙伴要问了,后一种直接在构造方法上添加 @Inject注解要方便好多,为什么还需要@Module注解呢?...提供了这样的功能,我们只要在photoTailorByPhoto 方法中添加Photo 参数,Dagger2就会帮依赖需求方找依赖对象一样帮你找到该方法依赖的Photo 实例,所以我们代码可以这样改:

    2.2K10

    Android Hilt实战初体验: Dagger替换成Hilt

    Hilt 在Dagger 的基础上构建而成,因而能够具有 Dagger 的编译时正确性、运行时性能、可伸缩性。 那么有的小伙伴可能会有疑问,既然已经有了Dagger为什么还要Hilt的呢?...提供一种简单的方法来为各种构建类型(如测试、调试或发布)配置不同的绑定。 但是Android中会实例化许多组件类,例如Activity,因此在应用中使用Dagger需要开发者编写大量的样板代码。...@Inject @Inject的使用基本与Dagger一致,可以用来定义构造方法或者字段,声明该构造方法或者字段需要通过依赖获取。...Context) = (context as FragmentActivity).supportFragmentManager } 区别是在Hilt中@Providers必须为static类并且构造方法不能有参数...目前唯一一个比较不理想的是对于@Providers的使用,构造方法不能有参数,如果在用Dagger使用时已经有参数了,再转变成Hilt可能不会那么容易。 庆幸的是,Dagger与Hilt可以共存。

    1.7K20
    领券