解决Spring自动装配中的循环依赖

我认为这篇文章是在企业应用程序开发中使用Spring的最佳实践。

使用Spring编写企业Web应用程序时,服务层中的服务量可能会增加。

服务层中的每个服务可能会消耗其他服务,这些服务将通过@Autowire注入。

问题:当服务数量开始增加时,可能会发生循环依赖性。 它不必指出设计问题……只要在许多服务中自动连接并消耗其他服务之一的中央服务就足够了,就可能发生循环依赖。

循环依赖关系将导致Spring Application Context失败,并且症状是一个错误,清楚地表明了问题所在:

名称为'*********'的Bean已被注入其他Bean [******,**********,**********, **********]的原始版本(作为循环引用的一部分),

但最终被包装(例如,作为自动代理创建的一部分)。 这意味着所说的其他bean不使用该bean的最终版本。 这通常是过度渴望类型匹配的结果–例如,考虑在关闭“ allowEagerInit”标志的情况下使用“ getBeanNamesOfType”。

现代Spring应用程序中的问题是,bean是通过@nnotations(而不是通过XML)定义的,而allowEagerInit标志的选项根本不存在。
用@Lazy注释类的替代解决方案对我来说根本不起作用。

可行的解决方案是将default-lazy-init =“ true”添加到应用程序配置xml文件中:

<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true" xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd >
  
<context:component-scan base-package="com.package">

</context:component-scan>
<context:annotation-config/>
...
</beans>

希望这可以帮助。 不知道为什么它不是默认配置。
如果您对为什么这种配置可能不满意有任何建议,请与我们所有人分享。

更新:
经过重新设计后,上述解决方案根本无法解决问题。
因此,我设计了更积极的解决方案以5个步骤解决该问题

祝好运!

参考:通过Gal Levinsky博客博客中的JCG合作伙伴 Gal Levinsky 解决了Spring Autowiring中的循环依赖问题


翻译自: https://www.javacodegeeks.com/2012/08/resolve-circular-dependency-in-spring.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值