有时,您可能会听说通过getter方法完成的依赖项注入,该方法会覆盖子类或伪造测试框架。 它允许类具有一组设置的依赖关系,该依赖关系实际上是经过硬编码的,但是可以根据需要“注入”。

从现在开始, 我已经写过关于所谓的“公司编码”依赖项的想法 。 不过,我在那篇文章中没有提到吸气剂注入,因为当时我还不太了解,现在我认为这并不是一个好主意。 我对第一个想出这种回旋方式做DI的人表示敬意,但这并不意味着我喜欢它。 我已经做了一些练习来弄出round回的做事方式,但这并不意味着我没有意识到这是一个坏主意。

我不能说我的观点应该是关于吸气剂注入是否不良以及永远不应该被触及的最终裁决。 我只想说说我对此有什么反对,并讨论更好的选择。

什么是吸气剂注入?

吸气剂注入是指您使用吸气剂方法进行硬编码的“依赖注入”。 我使用引号是因为,因为它是硬编码的,所以它不是真正的依赖注入。 “注入”依赖项的方式是通过子类化和覆盖getter方法或通过使用反射(通常是使用模拟库)替换它来更改getter。 我将举一个继承的例子。

public class ClassUnderTest
{public void saySomething(){System.out.println(getString());}protected String getString(){return "Hello World";}
}public class GetFrench extends ClassUnderTest
{@Override protected String getString(){return "Bonjour le monde";}
}

为什么吸气剂注射不好?

我有什么反对吸气剂注入的方法? 简而言之,我不喜欢它的最大原因是因为您的操作方式。 必须对要测试的内容进行子类化或模拟并不是一个好主意,因为这样做可以使您不再测试相同的类。 您正在测试其他内容。

我不喜欢的另一个原因是因为人们可能很难理解。 测试代码必须易于读取和编写,并且使用getter注入会在测试代码中造成混淆。

我该如何解决?

上面的链接文章对如何进行“公司编码”依赖项进行了完整描述,但是我将在此处进行快速概述。

您需要做的第一件事是提供一种设置字段以保存依赖项的方法。 最好的方法是通过构造函数(如果您当前具有公共构造函数,则应使用程序包私有的构造函数重载),因为它有助于设计不可变的类。 第二种选择是提供使用该依赖项的方法的程序包私有重载,其中重载具有一个附加参数来获取依赖项。 这种技术也非常适合不可变的设计。 否则,您可以使用package-private字段或setter来设置依赖关系。

下一步是确定依赖项是普通对象还是工厂。 如果旧的getter每次都产生一个新对象, 并且需要 ,则该依赖关系应该是工厂。

如果您想要更深入的解释, 请查看我的旧文章 。

什么时候这不是一个坏主意?

尽管我对吸气剂注入不满意,但我对类似的东西也很满意:模板模式。 如果将getter抽象化,以便它的唯一实现是通过子类,则可以。

奥托罗

那是我对吸气剂注入的看法。 您可以不同意。 就我个人而言,我只是觉得这是依赖注入的最糟糕的选择(紧接着使用“自动装配” DI框架)。

翻译自: https://www.javacodegeeks.com/2015/06/is-getter-di-a-good-idea.html

Getter DI是个好主意吗?相关推荐

  1. Spring学习3—控制反转(IOC)Spring依赖注入(DI)和控制反转(IOC)

    一.思想理解    Spring 能有效地组织J2EE应用各层的对象.不管是控制层的Action对象,还是业务层的Service对象,还是持久层的DAO对象,都可在Spring的 管理下有机地协调.运 ...

  2. Spring依赖注入(DI)

    2019独角兽企业重金招聘Python工程师标准>>> 1.面向接口编程 什么是面向接口编程呢?我个人认为,就是在我们的系统分析和架构中,首先,分清层次和依赖关系,每个层次不直接向上 ...

  3. Spring学习(二)Spring IoC 和 DI 简介

    本文借鉴:Spring学习(特此感谢!) 一.IOC(控制反转) 定义:反转控制 (Inversion Of Control)的缩写,即创建对象的反转控制. 正向控制:若要使用某个对象,需要自己去负责 ...

  4. python ioc di_Sping(一)——IOC/DI

    Spring是一个基于IOC和AOP的结构J2EE系统的框架 IOC(Inversion Of Control) 反转控制 是Spring的基础,由容器控制应用程序获取外部资源而非程序主动获取. 简单 ...

  5. Sping(一)——IOC/DI

    Spring是一个基于IOC和AOP的结构J2EE系统的框架 IOC(Inversion Of Control) 反转控制 是Spring的基础,由容器控制应用程序获取外部资源而非程序主动获取. 简单 ...

  6. Spring 框架 IOC 与 DI 的总结

    一:Spring并天下 1:Spring帝国: ①:Spring崛起 什么是Spring:源于Rod Johnson在其著作<Expert one on one J2EE design and ...

  7. DIP(依赖倒置原则),IoC(控制反转),DI(依赖注入)复习总结

    原文地址:http://blog.csdn.net/qqlinke/archive/2011/04/05/6303689.aspx ---- 概念 ---- ◆1.依赖倒置原则(DIP,Depende ...

  8. 一步一步手绘Spring DI运行时序图(Spring 自动装配之依赖注入)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  9. Spring IOC与DI、反射的理解 含小案例说明

    阅览了很多篇博文,对于Spring IOC和DI看到很多人介绍的感觉都很含糊,读完之后还是觉得混淆的不行,也有的人认为DI是IOC的另一种说法-emm,可能个人理解不同吧,我的观点并不然.但这种东西, ...

最新文章

  1. jQuery 设置select默认选中问题
  2. Windows Phone开发(36):动画之DoubleAnimation 转:http://blog.csdn.net/tcjiaan/article/details/7521388...
  3. 固态硬盘量产工具_机械硬盘Q1出货量大降,电脑硬盘榜单出炉
  4. Python自动化运维——文件内容差异对比
  5. Python程序设计语言基础03:基本数据类型
  6. 苹果正式发布自研 M1 处理器;神州数码回应:未与华为就荣耀出售达成任何协议​;Ant Design 4.8.1发布|极客头条
  7. 前端基础8:HTML5新增标签及CSS3新属性 viewport 动画
  8. D1、D系列分辨率是多少
  9. eclipse安装插件速度很慢的解决方案
  10. 2022年 - 2023年 最新计算机毕业设计 本科 选题大全 汇总
  11. matlab sae模型,发动机平均值模型的三篇SAE论文
  12. C语言程序设计-班级档案管理系统
  13. 入门易精通难的Unity要如何学
  14. 在家怎么免费下载论文、专利及标准?
  15. 传感器研究NO1.陀螺仪
  16. Java 动态眨眼 EyesJPanel (整理)
  17. sharp s2 android 9,夏普AQUOS S2值得买吗?夏普S2全面深度评测
  18. 浅谈基于PLC和Modbus的配电室现场环境监控系统设计及产品选型
  19. Argument for @NotNull parameter ‘quickFixes‘ of com/intellij/ope
  20. 编译原理——语法制导翻译并产生中间代码(while,复合语句和过程调用语句的翻译)

热门文章

  1. 走的走的居然飞起来了……
  2. oracle8修改最大连接数,ORACLE查看并修改最大连接数的具体步骤
  3. php无限极菜单,无限极菜单的实现
  4. php 去掉url中的index.php,php 去掉url中的index.php
  5. java快排原理_Java数据结构与算法——快速排序
  6. 架构师成长之路(内附推荐书籍)
  7. HDU2612(BFS算法)
  8. Mybatis3 (2)xml映射文件
  9. java设计模式 订阅模式_Java中的复合设计模式
  10. vertx rest 跨域_Vertx编程风格:您的React式Web Companion REST API解释了