@Autowired所有的东西!

最近,我写了@Autowired注释 ,它使我们可以编写更少的代码,从而使我们的生活更轻松 。 但是,使用它通常会使您的设计更加复杂。 尤其是当我们谈论在类的属性上使用它时。 它更容易违反
单一责任原则 。 这样可以更容易地注意到这一点。

可以将@Autowired与属性一起使用,但是,我认为,构造函数的存在会在问题出现时以过多的依赖关系可视化该问题。 即使没有在我们这边加倍照顾。

不断增长的代码

让我们使用文章中有关构造方法和设置方法的已知示例,但我们将对其进行一些修改。

因此,曾经有一个事件必须处理。 首先,我们必须从数据库中检索所有必需的信息,然后,我们就可以基于该信息触发适当的操作。

根据需求,我们创建了以下代码片段:

public class SomeHandler {@Autowired private final Repository repository;@Autowired private final Trigger trigger;public void handle(SomeEvent event) {// some code}
}

但是改变是唯一可以确定的。 客户提出了新的要求,我们不得不扩展功能。 客户希望存储所有信息,然后才能采取适当的措施。 他们还希望在发生任何紧急事件时得到通知。

经过所有更改后,我们最终得到如下结果:

public class SomeHandler {@Autowired private final Repository repository;@Autowired private final Trigger trigger;@Autowired private final SnapshotTaker snapshotTaker;@Autowired private final Notifier notifier;public void handle(SomeEvent event) {// some code}
}

从类的角度来看,这是编写良好的代码吗? 好吧,我相信三到四个依赖关系绝对应该给我们理由,开始考虑进行小型重新设计。

不幸的是,这并不是我在单个类的代码中见过的最多的依赖项……

@Autowired在哪里?

好的,但是@Autowired必须做什么? 解决该问题的方法是在需要时重构和重新设计代码,对吗? 我相信你们中的一些人会同意我的看法。 但是,在做出任何更改决定之前,我们必须找出问题所在。

好的,再说一次– @Autowired必须做什么? 依赖项的数量是否有问题是显而易见的吗? 好吧,在字段上使用@Autowired使它有点模糊。 当您查看上面的代码时,似乎并不会感到很痛苦。 这些只是四行代码,短行代码。 我们可能会争辩说,任何优秀的开发人员都应该知道什么时候太多了,但是为什么我们应该假设何时可以编写可以表达问题本身的代码呢?

如果所有这些依赖项都是必需的,我们可以使用构造函数来注入它们:

public class SomeHandler {private final Repository repository;private final Trigger trigger;private final SnapshotTaker snapshotTaker;private final Notifier notifier;@Autowiredpublic SomeHandler(Repository repository, Trigger trigger, SnapshotTaker snapshotTaker, Notifier notifier) {this.repository = repository;this.trigger = trigger;this.snapshotTaker = snapshotTaker;this.notifier = notifier;}public void handle(SomeEvent event) {// some code}
}

现在,代码“告诉”我们一些东西。 这个长的构造函数声明看起来并不好。 我们不必考虑四个是否太多。 我们看到了。

在示例中,我们同时使用了类和方法的简称,但是在实际应用中,有时这些名称要更长一些,以便尽可能地描述:

@Autowired
public SomeHandler(EventRepository eventRepository, EventActionTrigger eventActionTrigger, EventSnapshotTaker eventSnapshotTaker, EmergencyIssueNotifier emergencyIssueNotifier) {this.repository = eventRepository;this.trigger = eventActionTrigger;this.snapshotTaker = eventSnapshotTaker;this.notifier = emergencyIssueNotifier;
}

现在问题更明显了,不是吗?

并且添加另一个依赖项只会伤害我们的眼睛(如果尚未发生):

@Autowired
public SomeHandler(EventRepository eventRepository, EventActionTrigger eventActionTrigger, EventSnapshotTaker eventSnapshotTaker, EmergencyIssueNotifier emergencyIssueNotifier, SomeAnotherDependency someAnotherDependency) {this.eventRepository = eventRepository;this.eventActionTrigger = eventActionTrigger;this.eventSnapshotTaker = eventSnapshotTaker;this.emergencyIssueNotifier = emergencyIssueNotifier;this.someAnotherDependency = someAnotherDependency;
}

我们需要更深入!

但是现在不要停下来。 让我们看一下扩展类时的代码:

public interface Handler {void handle(Event event);
}public abstract class BasicEventHandler {@Autowired private final EventRepository eventRepository;@Autowired private final EventActionTrigger eventActionTrigger;// some code
}public class SomeHandler extends BasicEventHandler implements Handler {@Autowired private final EventSnapshotTaker eventSnapshotTaker;@Autowired private final EmergencyIssueNotifier emergencyIssueNotifier;@Autowired private final SomeAnotherDependency someAnotherDependency;public void handle(SomeEvent event) {// some code}
}

在第一个示例中,我们可以争论声明对象依赖项的代码行数是否足够大,这使我们感到担忧。 当我们扩展一个类时,在一个特定的类中这个数字可能很好。

但是,此代码的问题甚至比前面的示例更大。

作者通常可以确定他们的解决方案是好的。 这就是我们(作者)对待正在创造的东西的方式。

但是这次,即使是代码审阅者也可能不会注意到问题。 不幸的是,并不是每个人都会看一下父类。 在检查代码时,需要付出额外的努力。 即使没有签出分支,我们仍然必须转到IDE并打开类。 也许不是很多,但请相信我,对于我们中的某些人来说,太多了​​。

如果我们同意构造函数是类的必需部分,那么就不会出现问题。

public class SomeHandler extends BasicEventHandler implements Handler {private final EventSnapshotTaker eventSnapshotTaker;private final EmergencyIssueNotifier emergencyIssueNotifier;private final SomeAnotherDependency someAnotherDependency;@Autowiredpublic SomeHandler(EventRepository eventRepository, EventActionTrigger eventActionTrigger, EventSnapshotTaker eventSnapshotTaker, EmergencyIssueNotifier emergencyIssueNotifier, SomeAnotherDependency someAnotherDependency) {super(eventRepository, eventActionTrigger);this.eventSnapshotTaker = eventSnapshotTaker;this.emergencyIssueNotifier = emergencyIssueNotifier;this.someAnotherDependency = someAnotherDependency;} public void handle(SomeEvent event) {// some code}
}

使其明显!

我们可以想想有多少是太多的条款协议。 我们可以尝试遵循自己的规则。 但是,总有人会挑战这一点。 谁将编写代码,并试图证明所有内容都适合并且应该在一起,但这还不是“太多”。

不要争论, 让代码说明一切!

翻译自: https://www.javacodegeeks.com/2016/03/autowired-all-the-things.html

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

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

相关文章

Python基础-闭包

闭包:闭包内部函数定义函数时的环境 def outer():x 10def inner(): # 条件一 inner就是内部函数print(x) # 条件二 外部环境的一个变量return inner # 结论 内部函数inner就是一个闭包 outer()() 转载于:https://www.cnblogs.com/fansik/p/7676231.html

jit即时编译_热点中的即时编译器(JIT)

jit即时编译即时编译器(JIT)的概念以及更广泛的自适应优化是除Java(.Net,Lua,JRuby)之外的许多语言中众所周知的概念。 为了解释什么是JIT编译器,我想先定义一个编译器概念。 根据维基百科&…

每天十分钟系列:JS数据操作之神奇的map()

Array.prototype.map() map()方法可以创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。 demo1 上面的例子,在控制台中打印的结果是: 1 2 3 4 5 demo2 javascript学习交流群:453833554 上面的例子…

JSON格式数据与数据组件

1.将JSON格式数据转化为wex5data数据组件中的数据,且数据列数不必一 一对应,但转化的列数据的列名与数据表字段相同。 Model.prototype.goodsDataCustomRefresh function(event){var url require.toUrl("./json/goodsData.json");$.ajaxSett…

作业十三

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>GZCC</title> </head> <body> <h1>MIS问答平台</h1> <h2 id"2015">2015</h2> <div id&quo…

openshift_通过OpenShift超越云炒作

openshift您是否厌倦了为应用程序请求新的开发机器&#xff1f; 您是否为必须为应用程序设置新的测试环境感到烦恼&#xff1f; 您是否只想专注于和平开发应用程序而不会一直“沉迷于堆栈”&#xff1f; 我们听到你的声音。 我们也去过那里。 不用担心&#xff0c;OpenShift就在…

初级程序员需要接触好的架构代码

最近感触最深的就是一个项目需要好的架构设计&#xff0c;不会因为后面不断延伸业务需求造成业务代码的不断堆砌&#xff0c;破坏整个项目的层次结构&#xff0c;也让新来的团队成员更好的上手项目&#xff0c;从清晰的结构就能很快的了解整个业务的流程。一个好的架构设计&…

行动中的反思实践

在上一篇文章中 &#xff0c;我解释了最基本的敏捷实践是反思。 在本文中&#xff0c;我概述了组织&#xff0c;团队和人员如何在行动中运用反思的示例。 通过回顾反思 回顾是强大的工具&#xff0c;整个团队都可以使用它们来反思其当前的工作实践&#xff0c;以了解他们为持续…

python基本语法1.2--数的移位及与或抑或相关计算

#便于中文的显示# -*- coding: utf-8 -*- #指数表示 # a ** b <> power(a, b) print(10 ** 2) #100 print(10 ** 2.5) #316.22776601683796 #做除法 # //: 返回商的整数部分 print(23 // 5) #4 print(28.7 // 4.4) #6.0#<<向左移位做乘法#>>向右移位做除法 …

fabric canvas 清空并重置画布

fabric.js是一个强大而简约的依赖HTML5上的 canvas的javascript库&#xff0c;Fabric在canvas元素顶部提供了交互式对象模型&#xff0c;它还具有SVG到画布&#xff08;和画布到SVG&#xff09;解析器&#xff0c;官网上提供了丰富的案例&#xff0c;可照葫芦画瓢&#xff0c;足…

使用vue-axios请求geoJson数据报错的问题

最近的项目用到了echarts一个带有散点地图的图表,按照正常jquery写法应该使用ajax请求geojson的数据动态去切换地图,就像下面这样 $.get(Js/map/ cityData.name .json, function(geoJson) {map(gr-map, cityData, geoJson, geoCoordMap);//调用地图方法}); 页面显示(成功) bu…

前端工业物联网开发(Electron + Typescript + Vue)

从SpaceX公司的带来的Javascript上天新闻开始&#xff0c;以及近几年js语言在整个互联网的广泛应用&#xff0c;注定未来js语言有着不平凡的使命&#xff0c;跨端&#xff08;一套代码多端运行&#xff09;、易UI&#xff08;前端开发UI的便利&#xff09;、丰富的生态&#xf…

JAVA记录-Servlet介绍

1.什么是Servlet Servlet是sun公司提供的一门用于开发动态web资源的技术。Sun公司在其API中提供了一个servlet接口&#xff0c;用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据)&#xff0c;需要完成以下2个步骤&#xff1a;1、编写一个Java类&#xff0c;实现…

前端jenkins打包编译发布项目流程

如今的前端项目已不像之前直接写完代码&#xff0c;扔到服务器直接运行了。免不了安装依赖&#xff0c;执行build过程&#xff0c;然后再将打包后的代码上传到服务器&#xff0c;可能还需要更改配置文件啥的。如此多的步骤严重影响开发的日常划水时间。所以jenkins自动化部署少…

OpenMap教程4 –图层

1.简介 在第一个教程中&#xff0c;我们创建了一个基本的OpenMap GIS应用程序&#xff0c;该应用程序在JFrame中显示一个从文件系统加载的具有一个形状图层的地图。 该教程基于com.bbn.openmap.app.example.SimpleMap 。 在第二篇教程中&#xff0c;我们扩展了基本应用程序以使…

Vue.js实战之Vuex的入门教程

在 Vue.js 的项目中&#xff0c;如果项目结构简单&#xff0c; 父子组件之间的数据传递可以使用 props 或者 $emit 等方式。 但是如果是大型项目&#xff0c;很多时候都需要在子组件之间传递数据&#xff0c;使用之前的方式就不太方便。Vue 的状态管理工具 Vuex 完美的解决了这…

为什么写公众号,为什么改名字

这是一篇水果文&#xff0c;啥叫水果文&#xff1f;比水文稍微有点内容&#xff0c;我暂时这么解释吧。最近刚刚开始决定写公众号&#xff0c;其实这个订阅号申请的还蛮早的&#xff0c;当时是为了学习开发公众号而创建的&#xff0c;所以中间有过一段空档期&#xff08;呸&…

chrome浏览器解决ajax跨域问题

方法一 1、右键谷歌快捷方式&#xff0c;选择“属性”。 2、打开属性窗口&#xff0c;切换到“快捷方式”选项卡。 3、在目标路径的后面添加【 --disable-web-security】&#xff0c;其中chrome.exe与--disable之间有一个空格 4、点击应用&#xff0c;然后点击确定关闭窗口。 5…

前端的使命来了

最近国家工信部发布了一则关于重大App进行适老化改造的政策目的在于随着互联网的普及&#xff0c;有一部分群体在互联网应用的使用上存在着一定的障碍&#xff0c;为了保证这部分人能够顺利的使用手机中的App&#xff0c;国家出手了&#xff01;现在人们的生活越来越离不开互联…

java 过滤xss脚本_Java Web应用程序的反跨站点脚本(XSS)过滤器

java 过滤xss脚本这是为Java Web应用程序编写的一个好简单的反跨站点脚本&#xff08;XSS&#xff09;过滤器。 它的基本作用是从请求参数中删除所有可疑字符串&#xff0c;然后将其返回给应用程序。 这是我以前关于该主题的帖子的改进。 您应该将其配置为链&#xff08;web.xm…