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

欢迎使用Spring Dependency Injection –字段,设置器,构造函数注入教程。 了解场注入二传手注入构造函数注入之间的区别。 借助代码示例,我们将看到使用每个示例的好处以及为什么选择一个而不是另一个。

有关Spring依赖注入的更多信息:

  • Spring Setter依赖注入示例
  • Spring构造函数依赖注入示例
  • Spring字段依赖注入示例
  • Spring依赖注入和控制反转

总览

在Spring框架中,依赖注入分为三种类型。 它们是场注入setter注入构造器注入 。 您可以绝对使用它们中的任何一个,它们的结果完全相同。 但是,基于易用性,可读性,编码标准或更好的编码实践,几乎没有差异。 在我们Swift了解这些差异之前,我们将了解所有三种类型的依赖注入

基于字段的依赖注入

 @Component  public class MyClass { @Autowired private DogsController controller; @Autowired private DogsService service; @Autowired private DogsDao dao; @Autowired private ApplicationProperties properties; //... // Business methods //  } 

基于Setter的依赖注入

 @Component  public class MyClass { private DogsController controller; private DogsService service; private DogsDao dao; private ApplicationProperties properties; @Autowired public void setController(DogsController controller) { this .controller = controller; } @Autowired public void setService(DogsService service) { this .service = service; } @Autowired public void setDao(DogsDao dao) { this .dao = dao; } @Autowired public void setProperties(ApplicationProperties properties) { this .properties = properties; } //... // Business methods //  } 

基于构造函数的依赖注入

 @Component  public class MyClass { private DogsController controller; private DogsService service; private DogsDao dao; private ApplicationProperties properties; @Autowired public MyClass(DogsController controller, DogsService service, DogsDao dao, ApplicationProperties properties) { this .controller = controller; this .service = service; this .dao = dao; this .properties = properties; } //... // Business methods //  } 

我们具有所有三种类型的依赖项注入的代码参考。 让我们在面向对象设计原则的一些重要方面进行评估。

可读性

可读性是人类对一个软件程序或一个软件程序的理解程度的判断。 开发人员花费30%的时间编写软件,并花费70%的时间维护软件。 可读性提高了软件的可维护性。 当开发人员查看课程时,他/她应该能够Swift专注于课程的重要部分,而不会被样板代码或其他框架组件所分散。

让我们对所有三个应用可读性度量

  • 现场注入 :最好的。 更少的样板代码。 重点是业务逻辑。
  • 构造函数注入 :更好。 构造函数在视觉上与方法分开。
  • 二传手注射:最糟糕。 添加了4个实例方法。 从业务方法中删除焦点。

用软件编程的术语来说,如果对象在创建后不能被修改,则称其为不可变 。 不变性是良好的面向对象编程的重要原则。 不变性为类带来了线程安全性,状态安全性和可读性。

如果我们从不变性的角度看上面的例子。

  • 构造函数注入 :支持不变性。
  • Setter注入 :无固定性。
  • 场注入 :无固定性。

国家安全

对象很可能由使用者或基础框架实例化。 对象本身应为实例化器提供规则或指导,以便他们将以正确的状态调用对象。 如果对象没有规定这种状态安全性,则有可能将对象实例化为不完整或不正确的状态。

注意 :以上所有示例都是状态安全的,因为Spring正在解析它们的依赖项,并且Spring将正确初始化所有字段,这些字段是@Autowired一部分。 但是某些使用者可能会使用new关键字实例化您的对象。 我们应该研究Spring框架之外的状态安全性。

让我们将State Safety措施应用于我们看到的所有示例。

  • 构造函数注入 :状态安全。 该对象被实例化为完整状态或完全不被实例化。
  • setter注入 :消费者使用无参数构造函数。 而且可能会错过调用设置器之一或两次以不同的值调用相同的设置器(复制粘贴错误)
  • 字段注入 :使用者使用无参数构造函数。 没有有效的方法来设置对象的状态。 唯一的选择是使用反射设置私有字段。

实例字段太多

让我们考虑具有6、7或更多字段的对象的情况。 当您将上述示例用于大量字段时,会发生什么情况。

场注入 :看起来仍然更好,而且可读性强。 依赖项被隔离在一个地方。

 @Component  public class MyClass { @Autowired private Service1 service1; @Autowired private Service2 service2; @Autowired private Service3 service3; @Autowired private Service4 service4; @Autowired private Service5 service5; @Autowired private Service6 service6; @Autowired private Service7 service7; @Autowired private Service8 service7;     //... // Business methods //  } 

构造函数注入 :丑陋! 构造函数注入确实看起来很丑。 对于消费者来说也不容易使用。

 @Component  public class MyClass { private Service1 service1; private Service2 service2; private Service3 service3; private Service4 service4; private Service5 service5; private Service6 service6; private Service7 service7; private Service8 service7; @Autowired public MyClass(Service1 service1, Service2 service2, Service3 service3, Service4 service4, Service5 service5, Service6 service6, Service7 service7, Service8 service71) { this .service1 = service1; this .service2 = service2; this .service3 = service3; this .service4 = service4; this .service5 = service5; this .service6 = service6; this .service7 = service7; this .service7 = service71; }  //... // Business methods //  } 

二传手注射 :不好。 它添加了8个额外的实例方法,仅用于设置依赖项。

 @Component  public class MyClass { private Service1 service1; private Service2 service2; private Service3 service3; private Service4 service4; private Service5 service5; private Service6 service6; private Service7 service7; private Service8 service7; @Autowired public void setService1(Service1 service1) { this .service1 = service1; } @Autowired public void setService2(Service2 service2) { this .service2 = service2; } @Autowired public void setService3(Service3 service3) { this .service3 = service3; } @Autowired public void setService4(Service4 service4) { this .service4 = service4; } @Autowired public void setService5(Service5 service5) { this .service5 = service5; } @Autowired public void setService6(Service6 service6) { this .service6 = service6; } @Autowired public void setService7(Service7 service7) { this .service7 = service7; } @Autowired public void setService7(Service8 service7) { this .service7 = service7; } //... // Business methods //  } 

我们是否应该考虑“实例字段太多”?

通过检查太多实例字段” ,我们发现“ 字段注入”是最好的。 真正的问题是,我们是否应该重视太多领域的问题?

答案是不。
我们所有人都喜欢并遵循单一责任原则 。 如果您的班级依赖太多东西,则说明设计不正确。 采用更好的设计,您将不会看到这些问题。 我们不应该支持不良的设计案例。 因此,我们将不重视“实例字段太多”的情况。

在特殊的情况下,不可避免的是有太多字段,而丑陋的构造函数是一个大问题,您应该致电并进行Field Injection

结论

根据上面的代码示例和事实,很明显, 基于构造的依赖注入在所有情况下始终表现得更好。 即使我们从Spring Dependency Injection的角度来看我们的课程,构造函数注入仍然是最佳选择。

注意:所有设计原则或更好的编码标准以及我们在此处讨论的内容都只是准则,而不是规则。 您只是足够聪明,可以接听电话并证明您要走的路。

快乐编码!

翻译自: https://www.javacodegeeks.com/2019/02/field-setter-constructor-injection.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/345316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

马尔可夫蒙特卡罗 MCMC 原理及经典实现

我们在做机器学习、深度学习或自然语言处理等项目时,经常采用什么方法采样呢?大家马上会想到吉布斯 Gibbs 采样,今天我们来分享一种比较实用的采样方法:马尔可夫蒙特卡罗方法,吉布斯采样是其中的一种。 Markov chain …

【渝粤题库】陕西师范大学151212 审计理论与实务作业(专升本)

《审计理论与实务》作业一、单选题 1.注册会计师的服务是一种有偿服务,下列不能成为会计师事务所收费依据的是( )。 2.在执行审计业务时,注册会计师应当确定合理的重要性水平,下列做法正确的是( &#xff0…

les物流执行系统_【精益运营】立足智慧物流 推进仓储智能化稳步升级

近年来,“智能制造”成为制造行业的热门词汇,也成为引领物流行业发展的风向标。今年在两会中,“智能”一词首次写入报告,为传统行业改造升级、实现协同共享带来了新的发展机遇。早在2017年12月,根据公司对VMI业务整合工…

【渝粤题库】陕西师范大学163108旅行社经营与管理 作业(高起专)

陕西师范大学 内 部 题 库 教育 (yuyueshool) 编制 《旅行社经营与管理》作业 一、单选题 1、一名领导者直接领导的下属的数量叫做( )。 A、管理层次 B、管理策略 C、管理跨度 D、管理水平 2、团体包价组合中除去( …

增益比值 dB 以及 dBw-dBmv 等之详解

dB 分贝(工程应用),dB(Decibel,分贝)是一个纯计数单位,本意是表示两个量的比值大小,没有单位。在工程应用中经常看到貌似不同的定义方式(仅仅是看上去不同)。…

带有Spring Boot 2支持的Apache Camel 2.22发布

今天,我们发布了最新的Apache Camel 2.22.0版本 ,这是第一个正式完全支持Spring Boot 2的版本。这是一项重大的工作,因为针对像Apache Camel这样的大型框架将Spring Boot v1升级到v2付出了很多努力–感谢骆驼队和他们的贡献。 对Spring Boot …

【渝粤题库】陕西师范大学164202 市场营销学 作业(专升本)

《市场营销学》作业 一、单选题 1、从营销理论的角度而言,企业市场营销的最终目标是_________。 A.满足消费者的需求和欲望 B.获取利润 C.求得生存和发展 D.把商品推销给消费者 2、执行推销观念的企业,称为…

java 分布式事务_Java核心知识 Spring原理十五 JPA 原理

1. 事务事务是计算机应用中不可或缺的组件模型,它保证了用户操作的原子性 ( Atomicity )、一致性( Consistency )、隔离性 ( Isolation ) 和持久性 ( Durabilily )。2. 本地事务紧密依赖于底层资源管理器(例如数据库连接 ),事务处理局限在当前事务资源内…

Latex中定理、引理、证明、假设、空白行的编写

1. 引理 \newtheorem{lemma}{Lemma}[section] \begin{lemma} \label{lemma1}\end{lemma}编译效果: 2. 定理 \newtheorem{thm}{\bf Theorem}[section] \begin{thm}\label{thm1} Suppose system (\ref{l1}) satisfies Assumption (\ref{mim1}), the closed-loop s…

【渝粤题库】陕西师范大学180102 广告策划 作业(高起专)

一、单项选择题 1.市场调查,是进行广告策划的( )。 A.基础 B.核心 C.内涵 D.外延 2.知觉是大脑对当前直接作用于感觉器官的客观事物的( &#xf…

【渝粤题库】陕西师范大学200011基础写作 作业(高起专)

一、单项选择题 1.下面不属于写作活动特点的是( )。 A.人文性 B.综合性 C.个体性 D.群体性 2.写作活动质量的高低乃至成败,归根到底是由写作主体的( )所决定的。 A.思维 B.表达能力 C. 表达技巧 D.思维和表达能力 3.“…

Latex设置字体大小

全局模式 \documentclass[12pt]{article} 在文档的开头,有设置整个文章的字体大小,如:12pt。 局部模式 设置字体大小的命令从小到大为: \tiny \scriptsize \footnotesize \small \normalsize \large \Large \LARGE \huge \Huge…

c 结构体在声明时赋值_C/C++编程笔记:C++入门知识,C++多态性和虚函数解析

本篇要学习的内容和知识结构概览多态性编译时的多态性称为静态联编. 当调用重载函数时, 在编译期就确定下来调用哪个函数.运行时的多态性称为动态联编. 在运行时才能确定调用哪个函数, 由虚函数来支持.静态联编中的赋值兼容性及名字支配规律派生一个类的原因并非总是为了添加新…

【渝粤题库】陕西师范大学200411 数学建模 作业(专升本)

《数学建模》作业 计算题1. 求差分方程 的初值解。 2. 求差分方程 的初值解。 二、1.某储蓄所每天的营业时间是上午9:00到下午5:00。根据经验,每天不同时间段所需要的服务员数量如下: 储蓄所可以雇佣全时和半时两类服务员。全时服…

【渝粤题库】陕西师范大学200781 数据库原理及应用 作业

《数据库原理及应用》作业 一、选择题 1.在数据管理技术的发展过程中,经历了人工管理阶段、文件系统阶段和数据库系统阶段。在这几个阶段中,数据独立性最高的是____阶段。 数据库系统 B.文件系统 C.人工管理 D&#xf…

concurrent vs. simultaneous

Both the words mean “occurring at the same time”, but “concurrent” represents the events that occur over a period of time whereas “simultaneous” represents the events that occur at a point in time. https://www.perfmatrix.com/concurrent-users-vs-simul…

使用Spring Boot和GraphQL构建安全的API

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 GraphQL是Facebook在2012年开发的一种数据查询语言,用于解决REST API和传…

python flask 上传下载 api_python – 使用Flask上传和下载文件

PythonAnywhere dev这里.这是一个关于Flask和Web开发的一个很好的问题,而不是我们的系统特定的,所以我会尝试给出一个没有任何特定的通用答案:-)有一些事情我需要知道,给出一个明确的答案你的问题,所以我首先列出我所做的假设 – 如果我错了任何一个,给我一个评论我会适当地更新…

【渝粤题库】陕西师范大学201841 比较教育学 作业(专升本)

《比较教育学》作业 单选题 1、比较教育学界人们常说的“比较教育之父”是( )。 A.阿尔特巴赫 B. 康德尔 C. 萨德勒 D. 朱利安 2、结构功能主义对比较教育的影响,主要表现为比较教育注重对( )之间的关系进行分析和研究。 A、教育与民族特性 B、教育与民族传统 C、教…

visio 绘图矢量图素材网站

visio 绘图矢量图素材网站 visio是个绘图的好工具,可是自带图形元素有限,没有还要自己画。 推荐几个矢量图形素材库,里边有很多图形,很方便的导入到visio中,放大也不失真。 https://www.iconfont.cn/ https://www.st…