嗨,今天,我想简单地讨论将依赖项注入您的类的不同方式。

通常,您有以下三种注射方法

  • 直接进入字段/属性
  • 通过显式的setter方法
  • 通过显式的构造函数参数

现场注入

这种类型的注入为将所需的依赖项注入到类中提供了某种反射机制。

尽管这种注入类型的好处是,它消除了诸如setter方法或构造函数参数之类的混乱代码,但其缺点是这些依赖性是不可见的。 如果从外部查看类,则只会看到公共方法,并且可能是构造函数。

即使这使您非常清楚地了解了类提供的服务,但在我看来,它仍然具有以下主要缺点:

在为此特定类编写测试时,您必须检查该类以查看所需的依赖项,并且必须使用DI框架(即使是简单的测试),也必须使用一种反射机制来注入依赖项(模拟/存根/真实)。

更糟糕的是,传入依赖项的数量隐藏在该类中。 当然,您可以使用工具(JDepend等,pp。)告诉您依赖性的数量和方向,或者使用一个文件来指定注入,但是您必须依靠这种工具或检查类。

我观察到的另一个缺点是,与使用Setter或Constructor Injection的情况相比,创建具有多个职责的类的机会更高。
就像是:

哦,让我们使用这个精美的注解在这里注入我们需要的服务...几天/几小时后:测试这种野兽是如此的困难

二传手注射

注入器注入工具注入器方法,每个依赖项一个,DI框架用于注入依赖项。

这是一个变体,它使依赖项显式显示,并且使您可以清楚地了解特定类的依赖项。

在测试过程中,它的好处是您不必使用DI框架或反射机制,而可以直接设置依赖项。

这种方法的缺点是:您可以构造处于无法使用状态的类。 这是因为如果需要或可选依赖项,则无法与外部区分开。

构造函数注入

构造函数注入对类的构造函数进行检测,DI框架使用该类来注入依赖项。 这是使依赖关系明确的另一个变体。

与Setter注入相反,它可以防止您在不规则状态下创建类。 (当然,您可以传递null,但这不仅仅是一种作弊,对吗?)所以我要说,这是最严格的变体:

每个依赖项都是强制性的

这种注射类型的好处是

  1. 您必须只阅读一种方法,即构造函数,才能弄清楚此类的依赖关系。
  2. 您创建了一个不可变的类,它使缓存变得如此简单

同样,这里的缺点是您无法区分可选依赖项和必需依赖项。 构造函数强制设置所有字段。

我要讨论的最后一个变体是:

混合二传手和构造剂注射

我个人更喜欢此变体,混合了Setter和Constructor注入。

这给您:

  • 在合同级别上区分强制性依赖项和可选性的能力
  • 清楚说明特定类的依赖项是什么
  • 使您可以轻松地检查班级是否负有重大责任
  • 构建后正确配置的类

与纯方法类似,使用这种注入进行测试非常简单。 您不需要DI框架,并且可以轻松地将模拟的/存根的/真实的实现传递到要测试的类中。

使用/喜欢什么?

这个答案在很大程度上取决于您的框架/团队规则/语言。

但是我强烈建议您使用显式注入变量之一,因为它们使您无需使用依赖注入框架即可编写纯单元测试。

翻译自: https://www.javacodegeeks.com/2015/01/dependency-injection-field-vs-constructor-vs-method.html

依赖注入–字段vs构造函数vs方法相关推荐

  1. java 字段构造函数_依赖注入–字段vs构造函数vs方法

    java 字段构造函数 嗨,今天,我想简短地讨论将依赖项注入您的类的不同方式. 通常,您有以下三种注射方法 直接进入字段/属性 通过显式的setter方法 通过显式的构造函数参数 现场注入 这种类型的 ...

  2. 给微软的依赖注入框架写一些扩展方法

    给微软的依赖注入框架写一些扩展方法 Intro 现在在项目里大多都是直接使用微软的依赖注入框架,而微软的注入方式比较简单,不如 AutoFac 使用起来灵活,于是想给微软的依赖注入增加一些扩展,使得可 ...

  3. spring 构造函数注入_Spring依赖注入–字段vs设置器vs构造函数注入

    spring 构造函数注入 欢迎使用Spring Dependency Injection –字段,设置器,构造函数注入教程. 了解场注入 , 二传手注入和构造函数注入之间的区别. 借助代码示例,我们 ...

  4. Spring依赖注入–字段vs设置器vs构造函数注入

    欢迎使用Spring Dependency Injection –字段,设置器,构造函数注入教程. 了解场注入 , 二传手注入和构造函数注入之间的区别. 借助代码示例,我们将看到使用每个示例的好处以及 ...

  5. spring注入私有字段_Spring字段依赖注入示例

    spring注入私有字段 了解如何编写Spring Field Injection示例 . 字段注入是Spring框架 依赖注入的一种 . 在本教程中,我们将编写几个类,并看一看现场注入工程. 有关S ...

  6. Spring字段依赖注入示例

    学习如何编写Spring Field Injection示例 . 字段注入是Spring框架 依赖注入的一种 . 在本教程中,我们将编写几个类,并看一看现场注入工程. 有关Spring依赖注入的更多信 ...

  7. java 有参数的构造函数如何注入_Spring5参考指南:依赖注入

    依赖注入 依赖注入就是在Spring创建Bean的时候,去实例化该Bean构造函数所需的参数,或者通过Setter方法去设置该Bean的属性. Spring的依赖注入有两种基于构造函数的依赖注入和基于 ...

  8. 依赖注入底层反射原理_PHP基于反射机制实现自动依赖注入的方法详解_php技巧...

    这篇文章主要介绍了PHP基于反射机制实现自动依赖注入的方法,结合实例形式分析了php使用反射实现自动依赖注入的步骤.原理与相关操作技巧,本文实例讲述了PHP基于反射机制实现自动依赖注入的方法.分享给大 ...

  9. ASP.NET Core依赖注入最佳实践,提示技巧

    分享翻译一篇Abp框架作者(Halil İbrahim Kalkan)关于ASP.NET Core依赖注入的博文. 在本文中,我将分享我在ASP.NET Core应用程序中使用依赖注入的经验和建议. ...

最新文章

  1. 数据库服务器 之 在Linux下使用perl通过unixODBC连接SQLServer2000
  2. 李宏毅深度学习——深度学习介绍
  3. 使用 Visual C# .NET 生成 Office COM 外接程序
  4. 如何在JavaServer Pages中使用Salesforce REST API
  5. 《学习opencv》笔记——基本数据结构,CvMat,矩阵訪问
  6. PAT乙类1013 数素数 (20 分)
  7. OSPF邻接关系的建立步骤
  8. 轻松学习JavaScript二十一:DOM编程学习之获取元素节点的子节点和属性节点
  9. 【BZOJ2654】tree
  10. 《大数据之路-阿里巴巴大数据实践》拆书稿以及数仓架构的思考
  11. sprinboot打包jar后读取不到/resource/data/ip2region.xdb的文件.
  12. 企业如何搭建商业智能BI,过程中又需要注意哪些事项
  13. excel公式里用html,excel中value是什么函数?
  14. 【自然语言处理】【对比学习】搞nlp还不懂对比学习,不会吧?快来了解下SimCLR
  15. measure_solder_paster_dff.hdev测量BGA封装焊锡膏深度的 相关例程学习
  16. 批量实现excel中的地名转为经纬度
  17. C++ 实现trim函数
  18. mysql 拷贝表(复制表)的几种方式
  19. CRISPR技术:基因编辑婴儿或能免受镰状细胞病和肌营养不良症困扰
  20. [小白系列]利用echarts或者pyecharts来实现高端大气上档次的可视化

热门文章

  1. a+=b不一定等于a=a+b
  2. 2016蓝桥杯省赛---java---A---10(压缩转换)
  3. 分治算法---汉诺塔
  4. PHP WEB程序设计信息表,PHP WEB程序设计
  5. Spring Boot进阶之Web进阶 代码推送的github上面去
  6. renderthread是什么_Android5.0中 hwui 中 RenderThread 工作流程
  7. Flex布局 让你的布局更完美
  8. spark应用程序_Sparklens:Spark应用程序优化工具
  9. spark ui_Spark UI的见解
  10. kafka 发布订阅_在Kafka中发布订阅模型