@Autowired注释使我们的生活更轻松。 如果我们在类的属性上使用它,也可能导致代码量减少。 我们既不需要构造函数也不需要setter方法。 乍一看看起来很棒,但好处很少是没有成本的。

今天,我想让您知道必须支付的费用。

@Autowired(必填= false)

默认情况下,@ Autowired批注将required元素设置为true,这意味着需要注释的依赖项。 但是,我们可以关闭默认行为,并将依赖项设为可选,如下所示:

@Autowired(required=false)
private Dependency dependency;

它很有用,并且由于并非总是需要所有依赖项,因此引入这种可能性是合理的。

那么以这种方式注释依赖项又是什么问题呢?

让我们看一下代码:

class SomeClass {@Autowired private DependencyA dependencyA;@Autowired private DependencyB dependencyB;@Autowired(required=false)private DependencyC dependencyC;@Autowired(required=false)private DependencyD dependencyD;
}

我们可以创建具有以下依赖关系的SomeClass实例(允许所有组合):

  1. DependencyA,DependencyB
  2. DependencyA,DependencyB,DependencyC
  3. DependencyA,DependencyB,DependencyD
  4. DependencyA,DependencyB,DependencyC,DependencyD

这一切都很好,但是您确定所有这些组合确实可用并且正确吗? 如果班级作者只考虑1和4怎么办?

可选的依赖项-正确执行!

如果我们正在考虑上一段中提供的示例,则对于所提问题有两个可能的答案:

  1. 所有组合都是可能的。
  2. 组合的子集是可能的。

如果所有组合都可行,我将保持原样。 如果没有什么可以出错的,并且对象的每个状态都是正确的,那么我们的代码就具有足够的描述性。 它显然允许任何事情,因此我们可以假设我们将做的任何事情都会导致我们可以使用的对象的创建。

第二点-组合的子集呢?

假定仅从点1和点4开始创建状态的对象是有效对象。 照原样保留代码可能会导致对象的错误使用。 我们允许创建处于无效状态(第2点和第3点)的对象。 我们对此可以做什么?

在那种情况下,我认为我们应该删除@Autowired注释。 为了代码的可读性和设计质量,最好使用构造函数:

class SomeClass {private DependencyA dependencyA;private DependencyB dependencyB;private DependencyC dependencyC;private DependencyD dependencyD;public SomeClass(DependencyA dependencyA, DependencyB dependencyB) {this.dependencyA = dependencyA;this.dependencyB = dependencyB;}public SomeClass(DependencyA dependencyA, DependencyB dependencyB, DependencyC dependencyC, DependencyD dependencyD) {this(dependencyA, dependencyB);this.dependencyC = dependencyC;this.dependencyD = dependencyD;}
}

有了这段代码,您就知道了一切。 您知道创建正确对象所需的依赖项。

保持警惕!

本文无意让您相信最好不要使用@Autowired(required = false)。 其目的是使您知道必须支付的费用。

您必须保护自己的设计,必须保护对象不变式,并且不应该允许对象处于无效状态。 当然,您可以添加文档或注释,但是如果我们已经有了该语言提供的语义,可以使我们无需付出额外的努力即可使用它。

翻译自: https://www.javacodegeeks.com/2016/03/autowired-optional-dependencies.html

@Autowired和可选依赖项相关推荐

  1. java platform_Java Platform Module系统中的可选依赖项

    java platform Java平台模块系统(JPMS)对依赖项有很强的见解:默认情况下,需要它们(可以访问),然后在编译时和运行时都将它们存在. 但是,这不适用于可选的依赖项,因为代码是针对运行 ...

  2. Java Platform Module系统中的可选依赖项

    Java平台模块系统(JPMS)对依赖项有很强的见解:默认情况下,需要(必须可访问)它们,然后在编译时和运行时都将它们存在. 但是,这不适用于可选的依赖项,因为代码是针对运行时不一定存在的工件编写的. ...

  3. npm 依赖?不熟知的 optionalDependencies(可选依赖项)

    前言 背景 项目对所有的开源组件依赖进行过统计,并将该版本号的依赖都统一提交至生产库(源地址:npm-prod)中: 项目的开发源地址直连外网,有所有开源组件:npm-test: 之前项目运行没问题 ...

  4. 【热门框架】Maven依赖传递,可选依赖以及排除依赖指的是什么?有什么意义?

    Maven依赖传递是指当一个项目依赖另一个项目时,Maven会自动下载并构建这些依赖项,同时还会将这些依赖项所依赖的其他项一并下载并构建.这个过程会一直递归下去,直到所有依赖的项都被下载并构建完成.这 ...

  5. Spring源码分析(十)依赖注入源码解析3:DefaultListableBeanFactory#doResolveDependency 真正开始解析依赖项

    4.2 真正开始解析依赖项(最核心方法) org.springframework.beans.factory.support.DefaultListableBeanFactory#doResolveD ...

  6. everythingtoolbar.dll”或它的一个依赖项。_ASP.NET Core依赖注入最佳实践、提示和技巧...

    译者前言 本文译自ABP框架的开发博客<ASP.NET Core Dependency Injection Best Practices, Tips & Tricks>一文(原作者 ...

  7. spring bean依赖_Spring @Configuration并将bean依赖项作为方法参数注入

    spring bean依赖 一个春天建议注射豆从Spring的参考指南复制下面的示例中显示之间的相互依存关系的方式在这里 : @Configuration public class AppConfig ...

  8. spring依赖注入_Spring3:类型安全依赖项注入

    spring依赖注入 在从Spring跳到类型安全依赖注入之前,我想讨论一下我们之前所做的方式. 我们一直在借助Spring的Autowired注释按类型使用依赖项注入. 像这样的东西会注入Sprin ...

  9. 在Spring容器外部连接对象依赖项

    有几种有趣的方法可以设置在Spring容器外部实例化的对象的属性和依赖关系. 用例首先,为什么我们需要在Spring容器之外进行依赖注入–我知道三个用例,其中我实例化了Spring容器之外的对象并需要 ...

最新文章

  1. 《剑指offer》第十五题(二进制中1的个数)
  2. 事件参数对象下的几个属性 mouseenter与mouseover的区别
  3. kaptcha配置java_kaptcha 配置
  4. 一个不成功人士的“成功之道”
  5. 编译我的hello.ko
  6. 如何收缩超大的SharePoint_Config数据库
  7. 在Delphi中如何创建和使用udl文件
  8. dbunit java_java - 错误地抛出了Java DBUnit AmbiguousTableNameException - 堆栈内存溢出
  9. java project保存_java project 导出介绍
  10. Linux服务器运行环境搭建(四)——Tomcat安装
  11. linux系统安装snort,linux下SNORT安装.doc
  12. HoloToolkit视频共享接受发送脚本
  13. php phdfs扩展,hadoop HDFS的PHP扩展—PHDFS
  14. java输入语句怎么写_java中输入语句是怎么写的
  15. 苏东坡的起伏一生:就算人生不顺利,也要活的潇潇洒洒
  16. 动态规划[SDUT]全题解超详细注释哦!
  17. 戏法人人会做, 巧妙各有不同。 你文不会之乎者也, 武不能安国定邦。 只会些鸡鸣狗盗, 雕虫小伎。 智者顺时而谋, 愚者逆理而动。 我接受你的挑战!
  18. 导航AGV设计方案 此方案为市面上成熟的磁导航AGV设计方案
  19. HBase的数据模型和存储原理
  20. android调用虚拟摄像头方法,Android:如何在模拟器中使用摄像头?

热门文章

  1. 面象对象设计6大原则之三:里氏替换原则
  2. 第二章jQuery选择器
  3. Hibernate中使用Criteria查询及注解——(DeptTest.java)
  4. 分布式锁之Redis6+Lua脚本实现原生分布式锁
  5. JS中对象创建的五中方式
  6. React中构造函数、reader和函数的调用次数和时机测试
  7. 部署kafka kafka的service容器和zookeeper kafka客户端 Elasticsearch的客户端
  8. win10关闭“Windows安全中心”功能的两种方法
  9. vpn mysql_MYSQL数据库
  10. mod auth mysql_Apache使用mysql认证用户