gpt4 book ai didi

spring - 为什么 Spring 4.0.9 applicationContext 初始化会卡住,而 3.2.1 不会?

转载 作者:行者123 更新时间:2023-12-01 11:22:37 25 4
gpt4 key购买 nike

我的 applicationContext 初始化在 Spring 3.2.1 上运行良好。

但是当我升级到 4.0.9 而没有更改任何代码或 bean 定义时),初始化卡住了。以下声明不断发生。虽然没有明显的循环引用。

Requested bean is currently in creation: Is there an unresolvable circular reference?

我继续调查。我故意删除了一个 bean 定义。

  • Spring 3.2.1 取得了预期的结果:几乎立即抛出了一个 fatal error 。
  • Spring 4.0.9 仍在进入这个无限循环,试图找到不同的种子 bean 定义来使事情​​正常进行。

这是不断发生的日志语句。

[factory.support.DefaultListableBeanFactory.getTypeForFactoryBean()] - Ignoring bean creation exception on FactoryBean type check:
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'someSeedBean-which-is-different-in-every-instance-of-this-log' defined in the class path resource ........ ;
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'someDataSource' is defined

有什么变化?任何想法都会有所帮助。


在 Spring 3.x 和 4.x 中都有效的 Bean 定义

<bean id="abstractDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close" abstract="true" scope="singleton">
<property ....>
</bean>

<bean id="someDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close" scope="singleton" parent="abstractDataSource">
<property name="driverClass" .... />
</bean>

<bean id="someSessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource"> <ref bean="someDataSource" /> </property>
<property name="packagesToScan"> <list>......</list> </property>
....

在 Spring 3.x 中有效但在 4.0.9 中无效的 Bean 定义。

@Configuration
public class SomeSpringConfiguration{

// Moving this beanDef to Java for features not available in XML
@Bean(destroyMethod = "close")
public DataSource someDataSource() { // also tried setting this to ComboPooledDataSource
// verified that this beanDefinition is recognized by Spring
// but this bean is never created / this method is never executed
...
return datasource;
}
}

<bean class="SomeSpringConfiguration" />

<bean id="someSessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource"> <ref bean="someDataSource" /> </property>
<property name="packagesToScan"> <list>......</list> </property>
....
</bean>

我在 Spring 4.0.9 中遇到的错误是

Cannot resolve reference to bean 'someSessionFactory' while setting constructor argument; 
nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException:
Error creating bean with name 'someSessionFactory':
Requested bean is currently in creation: Is there an unresolvable circular reference?

请注意,该应用程序在/通过 xml、@Component 和@Configuration 中定义了数千个 bean。我不得不将 bean 从 xml 移动到 @Configuration 类以执行复杂的 bean 构建过程。

--------------------更新

我发现了问题:“大量 MethodInvokingFactoryBean[MIB] 用法”。出于某种原因,Spring 4 在大量 MIB 的存在下变得困惑。完全相同的代码库适用于 Spring 3。我将各种 MIB 执行的所有逻辑迁移到 ApplicationListener。请注意,ApplicationListener 并不是 MIB 的预期替代品,但在我的例子中,我可以在监听器中重现逻辑,因为 MIB 只是将 Spring bean 静态注入(inject)到不受 Spring 管理的类中。它不仅解决了这个问题,而且将 Spring 启动时间从大约 300 秒减少到大约 200 秒。

不幸的是,我既无法找出 Spring 中的根本原因,也无法在较小的代码库中重现该问题(在此分享)。

最佳答案

删除

<bean class="SomeSpringConfiguration" />

从 XML 中,它已经用 @Configuration 注释。如果正在对其进行扫描,则其中的 bean 可能会被创建两次。您应该将所有内容移至 Javaconfig。

关于spring - 为什么 Spring 4.0.9 applicationContext 初始化会卡住,而 3.2.1 不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40471592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com