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

autowired_@Autowired所有的东西!相关推荐

  1. @Autowired所有的东西!

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

  2. con not set com.xxx field com.xxx to com.sun.proxy.$proxy23问题

    一般出现这个问题要么是因为你在某个controller中用Autowired注解的是一个实现类而不是一个接口,因为JDK动态代理只能针对接口,所以你要么把AutoWired中的东西改成接口,要么在你的 ...

  3. 不能执行autowired_想用@Autowired注入static静态成员?官方不推荐你却还偏要这么做...

    生命太短暂,不要去做一些根本没有人想要的东西.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习 ...

  4. java junit autowired_写Junit测试时用Autowired注入的类实例始终为空怎么解?

    踩坑半天多,终于在网上寻觅到了解决方案,特此分享一下. 重要前提:src/main/java下的根包名必须和src/test/main的根包名完全一致,否则就会发生死活不能注入的情况,要继续进行下面的 ...

  5. @autowired注解_品Spring:对@Autowired和@Value注解的处理方法(文末附spring系列资源合集)...

    作者:编程新说李新杰 出自:微信公众号"编程新说" 原文:品Spring:对@Autowired和@Value注解的处理方法 在Spring中能够完成依赖注入的注解有JavaSE提 ...

  6. Spring5:@Autowired注解、@Resource注解和@Service注解

    转载:http://www.cnblogs.com/xrq730/p/5313412.html 什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有 ...

  7. @Autowired注解与@resource注解的区别(十分详细)

    背景: 今天下班路上看到一个大货车,于是想到了装配,然后脑海里跳出了一个注解@Autowired(自动装配),于是又想到最近工作项目用的都是@Resource注解来进行装配.于是本着学什么东西都要一钻 ...

  8. spring的Autowired和@Resource的区别是什么

    2019独角兽企业重金招聘Python工程师标准>>> @Resource默认按照名称方式进行bean匹配,@Autowired默认按照类型方式进行bean匹配 @Resource( ...

  9. SSM始用 @Autowired(required = false)的一个坑

    今天在写东西时候,一个小问题卡了好久,,,我就是要引入两个dao层接口判断,然而一直报500空指针异常,,另一个服务一直找不到,苦恼了很久.才发现原来是注解始用的问题..貌似是一个@Autowired ...

最新文章

  1. 逆向工程 sql_mybatis逆向生成工具,真的很好用!
  2. linux拷贝大量文件时有什么方法可以效验文件有没有损坏,使用linux的cp命令复制文件后验证文件是否一致的方法...
  3. java 线程 插件_我的第一个Chrome插件:天气预报应用
  4. linux监听端口丢失,linux – 如果没有监听端口,则为Systemd重启服务
  5. Linux Vim 光标错位,技术|Vim 复制粘帖格式错乱问题的解决办法
  6. matlab怎么写集合,matlab集合操作
  7. curl post 日志_curl命令发送Post请求
  8. 数据结构基础(11) --循环链表的设计与实现
  9. 给JDBC换个装——连接解耦
  10. python数字排序_python按照列表元素中的数字大小排序
  11. win桌面显示html,win10怎么把ie图标放桌面上 win10桌面添加ie浏览器图标的方法
  12. 电脑复制粘贴不了怎么办?
  13. can总线rollingcounter_[翻译]识别 CAN 总线上的攻击
  14. MATLAB国产替代软件出现,这些学校已解决被禁用问题
  15. 数据结构极客视频5_DFS的题目
  16. 华为搅局ERP,北用友南金蝶格局改变?用户:NO,我们另有选择
  17. php redis 详细操作
  18. 【bzoj4712】洪水(dp,树剖)
  19. vc messagebox怎么选择选项_亚马逊VC卖家被迫转向第三方卖家,下一步要怎么做?...
  20. 江西理工大学南昌校区排名赛 E: 单身狗的种树游戏

热门文章

  1. YbtOJ#853-平面标记【整体二分,凸壳】
  2. P3700-[CQOI2017]小Q的表格【分块,欧拉函数】
  3. P1407-[国家集训队]稳定婚姻【tarjan,强连通分量】
  4. jzoj3385-黑魔法之门【并差集】
  5. ssl2293-暗黑游戏【dp练习题】
  6. 纪中C组模拟赛总结(2019.7.6)
  7. Nacos client SDK 订阅式请求坑
  8. Sentinel(九)之热点参数限流
  9. 深度学习工具caffe详细安装指南
  10. 人脸检测解析json的工具类face_test