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

spring 构造函数注入

欢迎使用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

spring 构造函数注入

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

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

相关文章

java 快速io_Java编程在ICPC快速IO实现源码

本文将介绍Java在ICPC快速IO实现方法,下面看看具体代码。不处理EOF:import java.io.OutputStream;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.util.Arrays;import java.util.Random;import java.io…

adf开发_如何在ADF中将参数传递给ActionListener

adf开发在某些情况下,需要将值传递给ADF Button的ActionListener。 可以由actionListeners调用的方法只有一个ActionEvent类型的参数。 因此,我将解释如何将参数传递给该bean方法,但是它在方法签名中仅包含一个参数ActionEvent。 我在页面…

JavaScript/JS的学习

文章目录JavaScript 简介JavaScript 发展史ECMAScript基本语法与 HTML 结合方式数据类型类型转换非 number 转成 number非 boolean 转成 boolean特殊语法变量运算符双等号()全等号()流程控制语句switch...casewhilefor 循环对象Fu…

java soap协议头_自己调用webservice方法总结(带请求头SoapHeader)

调用webservice总结:1.加入第三方的jar包 Ksoap2-android-XXX2.访问响应的webservice的网站,查看响应的信息,得到nameSpace,methodName,url,soapAction3.如果request信息还有带有SoapHander的。那么就要封装…

注册界面演示代码(前端开发)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册</title><style>* {margin: 0px;padding: 0px;/*这样的设置会阻止元素大小的改变&#xff0c;因为设置内边距时元素大小会发生改变*/b…

apache ignite_使用Apache Ignite瘦客户端– Apache Ignite内部博客

apache ignite从2.4.0版本开始&#xff0c;Apache Ignite引入了一种连接到Ignite群集的新方法&#xff0c;该方法允许与Ignite群集进行通信而无需启动Ignite客户端节点。 从历史上看&#xff0c;Apache Ignite提供了客户端和服务器节点两个概念。 点燃旨在用作轻量级模式的客户…

java 网络编程 方式_JAVA网络编程

概念BIO 阻塞io&#xff0c;1.4之前NIO no-blocking io 非阻塞io&#xff0c;jdk1.4AIO 异步io&#xff0c;jdk1.7浏览器输入网址&#xff0c;敲下回车之后发生了什么&#xff1f;1.URL解析2.DNS解析概念&#xff1a;Domain Name System&#xff0c;域名系统&#xff0c;本质…

如何设置背景图(前端开发)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>模糊化背景图</title><style>body {background-image: url("image/bjt03.jpg");background-repeat: no-repeat;background-atta…

java字符串底层实现_「JAVA」细述合理创建字符串,分析字符串的底层存储,你不该错过...

Java基础之字符串操作——String字符串什么是字符串&#xff1f;如果直接按照字面意思来理解就是多个字符连接起来组合成的字符序列。为了更好的理解以上的理论&#xff0c;我们先来解释下字符序列&#xff0c;字符序列&#xff1a;把多个字符按照一定的顺序排列起来&#xff1…

查看oracle会话和进程_带有Oracle Digital Assistant和Fn Project的会话式UI。 第三部分,迁移到云...

查看oracle会话和进程在这篇文章中&#xff0c;我将继续在Oracle Digital Assistant和Oracle Digital Assistant之上为FlexDeploy实现对话式UI的故事。 Fn项目 。 今天&#xff0c;我将围绕聊天机器人工作的无服务器API迁移到云中&#xff0c;因此整个解决方案都在云中工作&am…

浏览器用户脚本管理器(Tampermonkey)

文章目录脚本管理器的好处是什么&#xff1f;用户脚本管理器有哪些&#xff1f;如何使用&#xff1f;安装脚本示例常用脚本脚本管理器的好处是什么&#xff1f; 用户脚本管理器将在您的用户脚本管理方面提供更多的便利。 它提供了诸如便捷脚本安装、自动更新检查、标签中的脚本…

服务器$java_top路径_ERP实施项目-MD120_FIN000_即时打印_V1.0

中国移动项目即时打印开发在此将web的即时打印开发成通用程序。1、首先通过创建rtf模板制定报表的输出格式&#xff1b;2、将需要输出的数据插入客户化表cux_fnd_xml_pool中&#xff1b;3、通过EBS功能调用CuxFndXmlpViewer.jsp。此jsp程序会根据传入的参数判断调用哪个rtf模板…

通讯网关 api网关_API网关正在经历身份危机

通讯网关 api网关这些年来&#xff0c;API网关正在经历一些身份危机 。 它们是否是集中的共享资源&#xff0c;从而促进了API对外部实体的公开和治理&#xff1f; 它们是集群入口哨兵&#xff0c;可以严格控制哪些用户流量进入或离开集群吗&#xff1f; 还是他们根据自己拥有…

百度搜索引擎使用技巧

1.在指定的网站搜索内容 在搜索框输入&#xff1a;site:youku.com 蛋炒饭&#xff0c;则只会返回优酷网站上关于蛋炒饭的内容 2.屏蔽指定的网站 例如&#xff0c;搜索“内存溢出”&#xff0c;但是不希望看到 csdn 网站相关的内容&#xff0c;你可以在搜索框输入&#xff1a;内…

docker 容器监控_以简便的方式监控Docker容器中的ADF应用程序

docker 容器监控在这篇简短的文章中&#xff0c;我将展示一种简单的方法来确保在Docker容器中运行的ADF应用程序在内存利用率方面是健康的Java应用程序。 我将使用标准工具JConsole&#xff0c;它是计算机上JDK安装的一部分。 如果存在问题&#xff08;例如&#xff0c;内存泄漏…

phpexcel 日期 时分秒_thinkPHP+PHPExcel实现读取文件日期的方法含时分秒

Vendor(PHPExcel.PHPExcel.IOFactory);$inputFileName Public/demo/demo.xls;$objReader new PHPExcel_Reader_Excel5();$objPHPExcel $objReader->load($inputFileName);$sheet $objPHPExcel->getSheet(0);$highestRow $sheet->getHighestRow(); // 取得总行数$…

css中的display属性值:table,table-row,table-cell

table&#xff1a;此元素会作为块级表格来显示&#xff08;类似 <table>&#xff09;&#xff0c;表格前后带有换行符。 table-row&#xff1a;此元素会作为一个表格行显示&#xff08;类似 <tr>&#xff09;。 table-cell&#xff1a;此元素会作为一个表格单元格显…

Bootstrap的学习

文章目录概念入门响应式布局响应式布局的实现&#xff08;栅格系统&#xff09;示例代码注意事项栅格系统参考视频应用 Bootstrap 的组件概念 一个前端开发的框架&#xff0c;Bootstrap&#xff0c;来自Twitter&#xff0c; 是目前很受欢迎的前端框架。Bootstrap 是基于HTML、…

jdk8 string::_JDK 12的String :: transform方法的简要但复杂的历史

jdk8 string::最近有人提议从JDK 12中删除Java预览功能Raw String Literals &#xff08; JEP 326 &#xff09;&#xff0c; 现在正式宣布将删除该预览功能 &#xff08; Java SE 12 [JSR 386] 25版将其删除 &#xff09;。 JDK String类中已添加了几种方法来支持此功能。 即使…