当前位置: 首页 > news >正文

网站备案证书下载密码忘了网站建设企业服务器

网站备案证书下载密码忘了,网站建设企业服务器,免费摄影网站,flash互动网站开发前言#xff1a;测试环境突发BeanCurrentlyInCreationException#xff0c;导致后端服务启动失败#xff0c;一看就是Spring的Bean管理中循环依赖。项目中存在Bean的循环依赖#xff0c;是代码质量低下的表现。多数人寄希望于框架层来给擦屁股#xff0c;造成了整个代码的…前言测试环境突发BeanCurrentlyInCreationException导致后端服务启动失败一看就是Spring的Bean管理中循环依赖。项目中存在Bean的循环依赖是代码质量低下的表现。多数人寄希望于框架层来给擦屁股造成了整个代码的设计越来越糟最后用一些奇技淫巧来填补犯下的错误。 1、什么是循环依赖 循环依赖指的是两个或者多个bean之间相互依赖,形成一个闭环。直接表现为两个service层互相调用对方。 一般场景是一个Bean A依赖Bean B,而Bean B也依赖Bean A. Bean A → Bean B → Bean A 当然我们也可以添加更多的依赖层次比如 Bean A → Bean B → Bean C → Bean D → Bean E → Bean A 2、Spring中的循环依赖 当Spring上下文在加载所有的bean时他会尝试按照他们他们关联关系的顺序进行创建。比如如果不存在循环依赖时例如 Bean A → Bean B → Bean C Spring会先创建Bean C再创建Bean B并将Bean C注入到Bean B中最后再创建Bean A(并将Bean B注入到Bean A中)。 但是如果我们存在循环依赖Spring上下文不知道应该先创建哪个Bean,因为它们依赖于彼此。在这种情况下Spring会在加载上下文时抛出一个BeanCurrentlyInCreationException。 当我们使用构造方法进行注入时也会遇到这种情况。如果您使用其它类型的注入你应该不会遇到这个问题。因为它是在需要时才会被注入而不是上下文加载被要求注入。 3、让我们看一个例子 我们定义两个Bean并且互相依赖通过构造函数注入。 Component public class CircularDependencyA {private CircularDependencyB circB;Autowiredpublic CircularDependencyA(CircularDependencyB circB) {this.circB circB;} }Component public class CircularDependencyB {private CircularDependencyA circA;Autowiredpublic CircularDependencyB(CircularDependencyA circA) {this.circA circA;} }现在我们写一个测试配置类姑且称之为TestConfig指定基本包扫描。假设我们的Bean在包“com.baeldung.circulardependency”中定义 Configuration ComponentScan(basePackages { com.baeldung.circulardependency }) public class TestConfig { }最后我们可以写一个JUnit测试以检查循环依赖。该测试方法体可以是空的因为循环依赖将上下文加载期间被检测到。 RunWith(SpringJUnit4ClassRunner.class) ContextConfiguration(classes { TestConfig.class }) public class CircularDependencyTest {Testpublic void givenCircularDependency_whenConstructorInjection_thenItFails() {// Empty test; we just want the context to load} }如果您运行这个测试你会得到以下异常 BeanCurrentlyInCreationException: Error creating bean with name circularDependencyA: Requested bean is currently in creation: Is there an unresolvable circular reference?4、解决方法 我们将使用一些最流行的方式来处理这个问题。 4.1 重新设计 当你有一个循环依赖很可能你有一个设计问题并且各责任没有得到很好的分离。你应该尽量正确地重新设计组件以便它们的层次是精心设计的也没有必要循环依赖。 如果不能重新设计组件可能有很多的原因遗留代码已经被测试并不能修改代码没有足够的时间或资源来完全重新设计......但有一些变通方法来解决这个问题。 4.2 使用 Lazy 解决Spring 循环依赖的一个简单方法就是对一个Bean使用延时加载。也就是说这个Bean并没有完全的初始化完实际上他注入的是一个代理只有当他首次被使用的时候才会被完全的初始化。 我们对CircularDependencyA 进行修改结果如下 Component public class CircularDependencyA {private CircularDependencyB circB;Autowiredpublic CircularDependencyA(Lazy CircularDependencyB circB) {this.circB circB;} }如果你现在运行测试你会发现之前的错误不存在了。 4.3 使用 Setter/Field 注入 其中最流行的解决方法就是Spring文档中建议使用setter注入。 简单地说你对你须要注入的bean是使用setter注入或字段注入而不是构造函数注入。通过这种方式创建Bean实际上它此时的依赖并没有被注入只有在你须要的时候他才会被注入进来。 让我们开始动手干吧。我们将在CircularDependencyB 中添加另一个属性,并将我们两个Class Bean从构造方法注入改为setter方法注入 Component public class CircularDependencyA {private CircularDependencyB circB;Autowiredpublic void setCircB(CircularDependencyB circB) {this.circB circB;}public CircularDependencyB getCircB() {return circB;} }Component public class CircularDependencyB {private CircularDependencyA circA;private String message Hi!;Autowiredpublic void setCircA(CircularDependencyA circA) {this.circA circA;}public String getMessage() {return message;} } 现在我们对修改后的代码进单元测试 RunWith(SpringJUnit4ClassRunner.class) ContextConfiguration(classes { TestConfig.class }) public class CircularDependencyTest {AutowiredApplicationContext context;Beanpublic CircularDependencyA getCircularDependencyA() {return new CircularDependencyA();}Beanpublic CircularDependencyB getCircularDependencyB() {return new CircularDependencyB();}Testpublic void givenCircularDependency_whenSetterInjection_thenItWorks() {CircularDependencyA circA context.getBean(CircularDependencyA.class);Assert.assertEquals(Hi!, circA.getCircB().getMessage());} }下面对上面看到的注解进行说明 Bean在Spring框架中标志着他被创建一个Bean并交给Spring管理 Test测试将得到从Spring上下文中获取CircularDependencyA bean并断言CircularDependencyB已被正确注入并检查该属性的值。 4.4 使用 PostConstruct 打破循环的另一种方式是,在要注入的属性该属性是一个bean上使用 Autowired ,并使用PostConstruct 标注在另一个方法且该方法里设置对其他的依赖。 我们的Bean将修改成下面的代码 Component public class CircularDependencyA {Autowiredprivate CircularDependencyB circB;PostConstructpublic void init() {circB.setCircA(this);}public CircularDependencyB getCircB() {return circB;} }Component public class CircularDependencyB {private CircularDependencyA circA;private String message Hi!;public void setCircA(CircularDependencyA circA) {this.circA circA;}public String getMessage() {return message;} }现在我们运行我们修改后的代码发现并没有抛出异常并且依赖正确注入进来。 4.5 实现ApplicationContextAware and InitializingBean接口 如果一个Bean实现了ApplicationContextAware该Bean可以访问Spring上下文并可以从那里获取到其他的bean。实现InitializingBean接口表明这个bean在所有的属性设置完后做一些后置处理操作调用的顺序为init-method后调用;在这种情况下我们需要手动设置依赖。 Component public class CircularDependencyA implements ApplicationContextAware, InitializingBean {private CircularDependencyB circB;private ApplicationContext context;public CircularDependencyB getCircB() {return circB;}Overridepublic void afterPropertiesSet() throws Exception {circB context.getBean(CircularDependencyB.class);}Overridepublic void setApplicationContext(final ApplicationContext ctx) throws BeansException {context ctx;} }public class CircularDependencyB {private CircularDependencyA circA;private String message Hi!;Autowiredpublic void setCircA(CircularDependencyA circA) {this.circA circA;}public String getMessage() {return message;} }同样我们可以运行之前的测试看看有没有异常抛出程序结果是否是我们所期望的那样。 5、总结 有很多种方法来应对Spring的循环依赖。但考虑的第一件事就是重新设计你的bean所以没有必要循环依赖他们通常是可以提高设计的一种症状。 但是如果你在你的项目中确实是需要有循环依赖那么你可以遵循一些这里提出的解决方法。 参考链接 痛快SpringBoot终于禁掉了循环依赖 解决Spring Boot 2.6及之后版本取消了循环依赖的支持的问题
http://www.zqtcl.cn/news/432513/

相关文章:

  • 太原专业网站建设杭州网络推广专员
  • 广西专业建网站橙米网站建设
  • 百度做的网站能优化吗html网站系统
  • php素材网站源码免费下载网站维护的内容有哪些
  • 打鱼跟电子游戏网站怎么做佛山微网站开发哪家好
  • 知名的网站建设网站在工信部备案
  • 网站首页的快照更新慢爆wordpress密码
  • dw做网站背景图片设置铺平微博通 wordpress
  • 勉县网站建设电商网站要素
  • 重庆旅游seo整站优化网站制作的一般步骤是什么
  • 网站建设评估体系p2p网站建设框架
  • .net 快速网站开发东莞网站建设公司哪家好
  • 东莞个人网站设计潍坊专业人员继续教育
  • 网站建设如何创业建设招标网官网
  • 公司没有销售网站怎么做业务怎么做微信推送 网站
  • 商城网站模版郴州网页定制
  • 电子商务网站建设步骤海外广告投放渠道
  • 网站用花生壳nas做存储十堰市网站建设
  • 用html5做手机网站抖音平台建站工具
  • 在线课程网站开发的研究意义网站开发需要哪些知识
  • 深圳网站优化怎么做手工艺品外贸出口公司网站建设方案
  • 从网站优化之角度出发做网站策划wordpress邀请码插件
  • 大学营销型网站建设实训课程o2o的四种营销模式
  • 咋做网站代码背景图宁远网站建设
  • 有哪些可以做网站的企业网站想换个风格怎么做
  • 怎么在百度搜索自己的网站在电脑上建设个人网站
  • wordpress网站菜单固定电商未来发展趋势前景
  • 五合一网站建设费用python 做网站 用哪个框架好
  • 波莱网站开发动态域名可以做网站吗
  • 网站建设 赣icp 南昌面馆装修设计