spring依赖注入

Spring框架中有三种注入变量:

  • 基于二传手的注射
  • 基于构造函数的注入
  • 基于现场的注入

这些机制中的每一种都有优点和缺点,并且不仅只有一种正确的方法。 例如现场注入:

@Autowired
private FooBean fooBean;

在生产代码中使用它通常不是最好的主意,主要是因为它使我们的bean无法在不启动Spring上下文或不使用反射hack的情况下进行测试。 另一方面,它几乎不需要其他代码,并且可以在集成测试中使用-绝对不会独立实例化。 我认为这是基于现场注射的唯一情况。

现在,让我们集中讨论两个主要变体。 在Spring文档中,我们可以读到

…将构造函数参数用于强制性依赖项并将设置器用于可选的依赖项是一个很好的经验法则。

同样在参考Spring到3.1的文档中 ,我们可以找到一个句子

Spring团队通常提倡setter注入,因为大量的构造函数参数可能变得笨拙,尤其是当属性是可选的时。

这种情况在文档中已更改为第四版,其中指出:

Spring团队通常提倡构造函数注入,因为它使人们能够将应用程序组件实现为不可变对象,并确保所需的依赖项不为null。

尤其是在版本4.0之前的人们使用基于构造函数的注入方法(其中也有些“纯粹主义者”)(这也可以在本文档中找到)的时候, 这很酷:)请注意,在第四个框架发布之前,这种注入方法存在很大的问题–方面要求使用默认构造函数。 现在仍然存在基于构造函数的注入的“缺点”:它不允许循环依赖。 我特意在双引号中添加了缺点,因为对我来说,这是该机制的巨大优势:)文档中还有另外一句话:

通常建议不要在您的bean之间使用循环引用。

但为什么? 如果我们的应用程序中有循环引用,该怎么办? 我不想写有关应用程序设计的文章,因为几乎总是可以重构我们的代码并将有问题的逻辑委托给第三个bean。 有两个重大而不幸的“沉默”问题。

第一个陷阱

调用ListableBeanFactory.getBeansOfType()方法时,不能确定将返回哪些Bean。 让我们看一下DefaultListableBeanFactory类的代码:

if (isCurrentlyInCreation(bce.getBeanName())) {if (this.logger.isDebugEnabled()) {this.logger.debug("Ignoring match to currently created bean '"+ beanName + "': " + ex.getMessage());}// ...continue;
}

如您所见,如果您不使用DEBUG日志记录级别,那么将有零个信息表明Spring在解析过程中跳过了特定的bean。 如果您想获取所有事件处理程序,那就太麻烦了:)

第二陷阱

第二个问题涉及AOP。 如果要在bean上使用方面,请确保它不涉及循环引用-否则Spring将创建bean的两个实例–一个没有方面,另一个具有适当方面。 当然仍然没有任何信息。 惊讶吗

对我来说, 停止在我们的应用程序中使用循环依赖就足够了(特别是与此相关的行为可能更有趣)。

请勿使用循环依赖!

但是,我们该如何摆脱困境呢? 当然,您可以使用基于构造函数的注入:)但是,如果您拥有大量应用程序,那么花很多时间重写所有类以使用构造函数而不是setter并不是最好的主意。 幸运的是,我有个好消息– AbstractRefreshableApplicationContext类中的allowCircularReferences字段。 只需添加一行到应用程序上下文创建(所描述的方式在这个岗位 )

AnnotationConfigWebApplicationContext applicationContext =new AnnotationConfigWebApplicationContext();
applicationContext.setAllowCircularReferences(false);
// rest of context initialization

最后,为了使您心情愉快,我从DefaultListableBeanFactory粘贴了另一个代码片段:

catch (NoSuchBeanDefinitionException ex) {// Shouldn't happen - probably a result of circular reference resolution...if (logger.isDebugEnabled()) {logger.debug("Failed to check manually registered singleton with name '"+ beanName + "'", ex);}
}

祝你今天愉快! :)

翻译自: https://www.javacodegeeks.com/2015/01/dependency-injection-pitfalls-in-spring.html

spring依赖注入

spring依赖注入_Spring的依赖注入陷阱相关推荐

  1. java什么是依赖注入_spring的依赖注入是什么意思

    最近学习spring框架,对依赖注入有些模糊,遂上网翻阅资料,做了下列总结,原博客为CSDN 南夏的 spring的依赖注入是什么意思,侵删! Spring 能有效地组织J2EE应用各层的对象.不管是 ...

  2. spring 构造函数注入_Spring构造函数依赖注入示例

    spring 构造函数注入 欢迎使用Spring构造函数依赖注入示例指南. 基于构造器的依赖注入是Spring 依赖注入的一种 . 依赖注入的另一种类型是Setter注入和字段注入. 有关Spring ...

  3. spring依赖注入_Spring源码阅读:Spring依赖注入容器

    依赖注入 依赖注入是Spring框架最核心的能力,Spring框架提供的AOP,WebMVC等其它功能都是以依赖注入容器作为基础构建的,Spring依赖注入容器类似于一个用于组装对象的框架内核,任何应 ...

  4. spring依赖注入_Spring依赖注入

    spring依赖注入 介绍: 在设计良好的Java应用程序中,这些类应尽可能独立. 这样的设计提高了组件的可重用性. 它还使对各个组件进行单元测试变得更加容易. 依赖注入的概念促进了Java对象之间的 ...

  5. spring注入私有字段_Spring字段依赖注入示例

    spring注入私有字段 了解如何编写Spring Field Injection示例 . 字段注入是Spring框架 依赖注入的一种 . 在本教程中,我们将编写几个类,并看一看现场注入工程. 有关S ...

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

    spring 构造函数注入 欢迎使用Spring Dependency Injection –字段,设置器,构造函数注入教程. 了解场注入 , 二传手注入和构造函数注入之间的区别. 借助代码示例,我们 ...

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

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

  8. spring依赖注入_Spring依赖注入技术的发展

    spring依赖注入 回顾Spring框架的历史,您会发现在每个发行版中实现依赖注入的方法越来越多. 如果您使用该框架已经超过一个月,那么在这篇回顾性文章中可能不会发现任何有趣的东西. 除了Scala ...

  9. Spring IoC是如何进行依赖注入的

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 依赖注入(DI) DI(Dependency Injection) ...

最新文章

  1. Python数据类型之字符串
  2. ARM 之十二 Cortex-M 内核异常处理、异常定位方法、在线调试、Keil MDK-ARM 的使用
  3. Unity热更新方案探索与讨论
  4. RTK、IMU、RT3000
  5. 五分钟学会python_关于五分钟学Python系列视频
  6. 牛客小白月赛9: div.2 A(线性筛)
  7. 汇编:在BUFFER中定义了的十个带符号字,将其中的负数变成绝对值,并以十进制方式输出
  8. XML非法字符的处理
  9. 59 | 测试专栏特别放送 | 答疑解惑第七期
  10. base64转码原理
  11. 2022珠三角深圳锂电池技术展览会暨论坛|2022华南广东深圳锂电池技术展览会
  12. Google Play 开发者账号注册 上架应用
  13. 1.4树莓派SSH远程登录
  14. Predicting mRNA Abundance Directly from Genomic Sequence Using Deep Convolutional Neural Networks
  15. html5 设备管理信息 device
  16. vue开发的音乐小播放器
  17. 2021年度训练联盟热身训练赛第八场
  18. 各大互联网公司校园招聘笔试面试题
  19. WORD设置标题格式
  20. 基于JAVA的公交调度系统

热门文章

  1. 【2018.3.31】模拟赛之二-ssl2407 负进制【贪心】
  2. 【做题记录】DP 杂题
  3. 【DP】【树状数组】免费馅饼(luogu 7302/金牌导航 数据结构优化DP-4)
  4. 战争尾声(nowcoder 215073)
  5. 【Floyed】【匈牙利算法】导弹(jzoj 1610)
  6. Codeforces274B
  7. Nacos(四)之安装
  8. Java的GC机制及算法
  9. Java 反射机制深入研究
  10. 最全三大框架整合(使用映射)——IDeptDao.java