`
sllizhimei
  • 浏览: 165604 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Spring 循环依赖(circular reference)问题

    博客分类:
  • Java
阅读更多
spring的事务管理配置如下:
.....

<!-- 事务管理 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>

<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="del*">PROPAGATION_REQUIRED</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="*">PROPAGATION_REQUIRED</prop>

</props>
</property>
</bean>

<bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<value>*Service,*Manager</value>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>

<bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
<property name="transactionInterceptor" ref="transactionInterceptor"/>
</bean>
......

程序在启动的时候,报错:
org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'transactionManager': Bean with name 'transactionManager' has been

injected into other beans [transactionInterceptor] in its raw version as part of a circular reference, but has eventually been wrapped (for example as part of auto-

proxy creation). This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching - consider using

'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.

出现了循环依赖的错误,终于发现是
<property name="beanNames">
   <value>*Service,*Manager</value>
</property>
里面的问题,transactionManager后边也是Manager。这样会把transactionInterceptor注入到transactionManager中,故将bean id="transactionManager"改成其他的名字不用Manager结尾,或者将*Manager改成其他的就不会出现这个错误了。
如果要改bean transactionManager 的名字,记得将transactionInterceptor中<property name="transactionManager" ref="transactionManager"/>
的ref="transactionManager"也改成对应的名字。

网上还发现了一种解决方法,发现也可行,不求甚解,先记下:
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"  lazy-init="true" >
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>

将bean id="transactionManager"延迟加载。
分享到:
评论
1 楼 javaanddonet 2011-04-14  
请问:
楼主在服务层中注入的时候,采用的是构造方法注入还是Setter方法注入呢?

相关推荐

    Spring源码最难问题:当Spring AOP遇上循环依赖.docx

    Spring源码最难问题:当Spring AOP遇上循环依赖 Spring源码中最难的问题之一是循环依赖问题,当Spring AOP遇上循环依赖时,该如何解决? Spring通过三级缓存机制解决循环依赖的问题。 在Spring中,bean的实例化...

    Spring循环依赖案例问题详解.docx

    在Spring框架中,循环依赖(Circular Dependency)是指两个或多个bean之间形成了一种相互引用的关系,使得它们在初始化过程中无法独立完成实例化。在上述案例中,`AuthorService`依赖于`BookService`,而`...

    Spring循环依赖debug源码图

    Spring循环依赖debug源码图

    理解Spring循环依赖.docx

    Spring的循环依赖处理机制是其依赖注入的核心功能之一,它使得开发者能够编写松耦合的代码,而无需过多关注依赖关系可能导致的问题。然而,了解其限制并合理设计bean之间的依赖关系,是避免潜在问题的关键。在编程时...

    Spring 解决循环依赖的 3 种方式.docx

    但如果开发者明确指定允许循环依赖,Spring会在每次请求prototype Bean时进行实例化和依赖注入,这可能导致每次请求都会创建一个新的Bean实例,从而避免了循环引用的问题。 总结来说,Spring通过“三级缓存”和“半...

    spring多个动态代理导致循环依赖报错问题解决

    了解并熟练掌握以上策略,可以帮助我们更有效地应对Spring中的动态代理导致的循环依赖问题。 为了更好地理解并实践这些解决方案,你可以参考提供的压缩包文件`demo-spring`中的示例代码,通过实际操作来加深印象。...

    Spring循环依赖.vsdx

    Spring循环依赖.vsdx

    Spring5.0源码深度解析之SpringBean循环依赖问题解决方案.docx

    Spring5.0源码深度解析之SpringBean循环依赖问题解决方案 Spring5.0源码深度解析之SpringBean循环依赖问题解决方案是指在Spring框架中如何解决Bean的循环依赖问题。在Spring框架中,Bean的循环依赖指的是两个或多个...

    Springbean循环依赖问题,与解决方案。.docx

    SpringBean 循环依赖问题与解决方案 SpringBean 循环依赖问题是指在 Spring 框架中,多个 Bean 之间存在相互依赖关系,导致 Bean 创建失败或无法正确注入的问题。这种问题常见于大型项目中,特别是在复杂的业务系统...

    spring-framework-reference-4.3.19.pdf

    Spring框架提供了一种全面的方式来解决各种各样的问题,从依赖注入到事务管理,再到Web应用开发。 - **快速入门**:Spring框架为开发者提供了快速入门指南,帮助新手快速上手。通过简单的示例,开发者可以快速理解...

    spring bean循环依赖时序图

    spring bean循环依赖时序图详细的描述了spring的循环依赖关系,帮我们快速了解spring是如何优雅的进行处理的

    简单了解Spring循环依赖解决过程

    Spring 框架中循环依赖是一个常见的问题,它指的是两个或多个 Bean 之间存在的相互依赖关系,例如 A 依赖 B,B 依赖 A,这种情况下,Spring 需要解决这个循环依赖关系,以便正确地实例化和初始化 Bean。 在 Spring ...

    Spring循环依赖的解决办法,你真的懂了吗

    Spring循环依赖的解决办法 Spring框架中,循环依赖是指两个或多个Bean相互引用,形成一个环。这篇文章主要介绍了Spring循环依赖的解决办法。在Spring中,循环依赖可以分为两种场景:构造器的循环依赖和属性的循环...

    spring-framework-reference

    《Spring 框架详解——基于“spring-framework-reference”参考文档》 在Java开发领域,Spring框架无疑是最具影响力和广泛使用的轻量级框架之一。它以其强大的功能、灵活的设计和丰富的生态系统,成为了企业级应用...

    spring-boot-reference-zh

    学习 "spring-boot-reference-zh",将有助于深入理解 Spring Boot 的工作原理,提升开发效率,同时避免常见问题。通过这份文档,你可以了解每个功能的详细配置、使用方法以及最佳实践,从而更好地利用 Spring Boot ...

    spring-boot-reference.pdf

    根据提供的文件信息,这份文档是一份英文版的Spring Boot参考指南,标题为"spring-boot-reference.pdf",描述提到该文档对于学习Spring Boot及搭建微服务框架具有重要帮助,标签为"spring-boot"。文件内容涉及Spring...

    spring-boot-reference

    整体上,Spring Boot Reference Guide对Spring Boot的各个方面提供了深入的指导,包括但不限于Spring Boot的安装和配置、构建系统、代码结构、自动配置、Spring Beans管理、依赖注入和应用的运行。对于初学者来说,...

Global site tag (gtag.js) - Google Analytics