autowired_@Autowired所有的东西!

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

autowired

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

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

相关文章

android message 代码,Android Handler移除Message详解及实例代码

Android Handler移除Message详解问题:1.removeMessage(what)函数是否只能移除对应what值的Message?2.对于Delayed发送的Message,能否提前remove?代码测试:package javine.k.testhandler;import android.app.Activity;i…

python中如何调用或修改元组中的元素_python 元组的使用方法

元组——tuple 列表非常适合用于存储在程序运行期间可能变化的数据集。 列表是可以修改的,但元组是不可修改的 Python将不能修改的值称为不可变的,而不可变的列表被称为元组 1. 元组的创建和删除 (1)使用赋值运算符直接创建元组 语…

【WebRTC---入门篇】(十三)WebRTC音视频数据采集

音视频采集API false表示不采集,true表示采集 WebRTC API适配 获取音视频设备的访问权限 通过 return navigator.mediaDevices.enumerateDevices();/*返回一个promise,为了获取音视频的权限*/ 视频约束

android按钮点击toast,关于button点击事件中setOnClick等元素的解读以及方法?以及toast的位置以及作用?...

此文末参考链接:此段代码的教程以及使用接口的方式、switch语句的教程链接为链接1.汇总里说的有更多的实现方法,为链接2。文中链接为视觉统一,链接均于文末,以上为方便文中跳转,加了文中的跳转链接。以下代码为我学习b…

java用什么编译器_Java用Java编译

java用什么编译器在上一篇文章中,我写了关于如何在运行时生成代理的内容,我们已经了解到生成Java源代码的程度。 但是,要使用该类,必须对其进行编译,并将生成的字节码加载到内存中。 那是“编译”时间。 幸运的是&…

app登录界面背景 css_计算机毕业设计中Java web实现简登录页面(MyBatis+jsp+servlet+html+css+javascript)...

点击上方“蓝字”,关注我们.本文利用MyBatisjspservlethtmlcssjavascript实现了一个简单的登录页面。对用户输入的用户名和密码就行校验,校验通过则登录成功,密码和用户信息保存在mysql表中,通过MyBatis访问(MyBatis相关知识可参考…

android strm,Android 关于so文件的随记

1.背景:项目中要集成商汤的活体检测sdk,2.遇到的问题:商汤提供的demo 可以正常运行,但是将sdk集成至项目中时一直报错,但是商汤侧却没办法提供具体的报错原因3.解决问题:反编译商汤的源码发现,报…

工业互联网二级节点建设_建设者还是二传手?

工业互联网二级节点建设不用说,每个对象都需要先创建才能使用。 无论我们是在谈论域,框架,库还是任何其他类型的类,都没有关系。 当您的代码是面向对象的时,这些类仅是对象的定义。 创建对象之前,不能使用它…

android 指针是什么意思,Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析(3)...

提供引用计数器的类RefBase我们就暂时介绍到这里,后面我们再结合智能指针类一起分析,现在先来看看强指针类和弱指针类的定义。强指针类的定义我们在前面介绍轻量级指针的时候已经见到了,就是sp类了,这里就不再把它的代码列出来了。…

【WebRTC---入门篇】(十五)WebRTC信令服务器实现

如何使用socket.io发送消息 io代表整个节点

气味识别应用_代码气味–第二部分

气味识别应用在上一篇文章《代码气味–第一部分》中 ,我谈到了膨胀器:它们是代码气味,可以识别为长方法,大型类,原始痴迷,长参数列表和数据块。 在这一篇中,我想深入研究面向对象的滥用者和变更…

activiti高亮显示图片_如今透明LED显示屏成为广告橱窗,它们之间有什么关联?...

如今我们在街道行走时,我们就会看到各种玻璃橱窗,这是商家想利用橱窗进行不同产品宣传角度。其实无论是海报、灯箱或是实物展示,这些都是商家通过橱窗广告进行来吸引消费者,而现在是5G时代到来使橱窗数字化营销成为了一种新的趋势…

theme editor android,谷歌宣布将于下月停用 Material Theme Editor

使用 Material Theme Editor,开发人员可创建和自定义 Material 主题,包括颜色、形状、版式等等。在 Material Theme Editor 中,可根据不同部分依次选择颜色,并应用于所有组件,还可调整对比度,根据单一颜色自…

【WebRTC---入门篇】(十六)端对端1V1传输基本流程

RTCPeerConnection 媒体协商 setLocalDescription方法 ,收集所有候选者。 setRemoteDescription方法, 放到远端的描述槽中。 协商状态变化

pytorch dataset_【小白学PyTorch】16.TF2读取图片的方法

<>扩展之tensorflow2.0 | 15 TF2实现一个简单的服装分类任务小白学PyTorch | 14 tensorboardX可视化教程小白学PyTorch | 13 EfficientNet详解及PyTorch实现小白学PyTorch | 12 SENet详解及PyTorch实现小白学PyTorch | 11 MobileNet详解及PyTorch实现小白学PyTorch | 10 …

android 硬件对接,Android 对接硬件串口篇

private DispQueueThread DispQueue;private AssistBean AssistData;private SerialControl ComA;Overridepublic void initView() {ComA new SerialControl();//开启串口DispQueue new DispQueueThread();//开启线程实时获取数据DispQueue.start();//线程启动AssistData ge…

【WebRTC---入门篇】(十七)实现1V1音视频实时互动直播系统

STUN/TURN服务器搭建 详细搭建过程 RTCPeerConnection

junit5和junit4_JUnit 5 –架构

junit5和junit4现在我们知道如何设置JUnit 5并使用它编写一些测试 &#xff0c;下面让我们看一下。 在本文中&#xff0c;我们将讨论JUnit 5架构以及采用这种方式的原因。 总览 这篇文章是有关JUnit 5的系列文章的一部分&#xff1a; 建立 基本 建筑 条件 注射 … JUni…

pytorch load state dict_PyTorch 学习笔记(五):Finetune和各层定制学习率

本文截取自《PyTorch 模型训练实用教程》&#xff0c;获取全文pdf请点击&#xff1a;https://github.com/tensor-yu/PyTorch_Tutorial [toc]我们知道一个良好的权值初始化&#xff0c;可以使收敛速度加快&#xff0c;甚至可以获得更好的精度。而在实际应用中&#xff0c;我们通…