java 字段构造函数

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

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

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

现场注入

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

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

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

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

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

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

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

二传手注射

Setter注入工具setter方法,每个依赖项一个,DI框架使用该方法来注入依赖项。

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

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

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

构造函数注入

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

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

每个依赖项都是强制性的

这种注射类型的好处是

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

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

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

混合二传手和构造剂注射

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

这给您:

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

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

使用/喜欢什么?

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

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

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

java 字段构造函数

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

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

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

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

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

  3. 通过自定义注解和java反射实现Spring-DI依赖注入

    依赖注入的原理就是简单说就是从头往下递归生成依赖对象的,然后对引用字段赋值最后返回. 这里实现通过变量类型来生成相应的对象. 模拟一个用户的注册业务,首先是controller层调用service层, ...

  4. Spring 基于构造函数的依赖注入

    当容器调用带有一组参数的类构造函数时,基于构造函数的依赖注入就完成了,其中每个参数代表一个对其他类的依赖. 看个例子: TextEditor的源代码: public class TextEditor ...

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

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

  6. 依赖注入–字段vs构造函数vs方法

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

  7. java中依赖注入_关于Java:什么是依赖注入?

    本问题已经有最佳答案,请猛点这里访问. Possible Duplicate: What is Inversion of Control? 我真的很困惑依赖注入的概念. 我对软件领域非常陌生,我对下面 ...

  8. java 注入依赖_依赖注入(Dependency Injection)

    一.依赖注入的概念了解 介绍依赖注入(di),首先要先了解一个概念--即控制反转(ioc). 控制反转是面向对象编程的一种设计原则,可以用来减低计算机代码之间的耦合度.在传统的应用程序中,都是程序员手 ...

  9. mockito手动注入依赖_依赖注入–手动方式

    mockito手动注入依赖 依赖注入是一种将行为与依赖解决方案分开的技术. 用简单的话来说,它使开发人员可以定义具有特定功能的类,这些功能取决于各种协作者,而不必定义如何获取对这些协作者的引用. 以此 ...

最新文章

  1. 使用Html5+C#+微信 开发移动端游戏详细教程 总目录
  2. redis基础之有序集合应用
  3. 4412 GPIO读 和 ioremap控制GPIO寄存器
  4. 系统架构师-基础到企业应用架构-企业应用架构
  5. codeblock 带mingw的版本_云顶之弈10.22新版本最强阵容排名 10.22版本吃鸡阵容推荐...
  6. Spring Cloud Gateway 源码解析(2) —— 路由
  7. 上周热点回顾(6.5-6.11)
  8. php和ajax实现聊天功能,怎么在PHP项目中使用jquery与ajax实现一个即时聊天功能
  9. 如果你手头有20万,你是拿去买房还是拿去投资?
  10. 一文看懂深度学习新王者「AutoML」:是什么、怎么用、未来如何发展?
  11. ueditor html模板,UEditor 编辑模板
  12. Java迭代器和lambda的区别,Java使用Lambda表达式遍历Iterator迭代器
  13. ios视频通话三方_自己实现简易版 多人视频通话 iOS Android
  14. AutoJsPro,阿伟的假期(看广告游戏)脚本实例
  15. 【论文解读】NAACL 2021 对比自监督学习的上下文和一般句子表征:以篇章关系分析为例
  16. 关于前后台部署打包时需要修改的ip位置
  17. 达索Abaqus 2022新功能介绍(三)
  18. 微信小程序之Github API用户登录认证的三种方式
  19. 电子工程师标配十款经典RF射频器件
  20. android无法监听焦点,android tv常见问题(二)如何监听ViewGroup子View的焦点状态

热门文章

  1. P4655-[CEOI2017]Building Bridges【斜率优化dp,CDQ分治】
  2. nssl1478-题【dp】
  3. jzoj1161-机器人M号【欧拉函数,dp】
  4. ssl初一组周六模拟赛【2018.3.24】
  5. Java IO: InputStream
  6. 并发场景下MySQL存在的问题及解决思路
  7. ajax读取.txt文件出现乱码
  8. C++描述杭电OJ 2009.求数列的和 ||
  9. 利用bootstraptable展示数据,对数据进行排序分页等操作
  10. mybatis三种(查询,参数传递)