您的位置:首页 > 编程语言 > Java开发

SPRING循环依赖(circular reference)的解决方法

2014-03-10 16:08 1016 查看
有时候,在SPRING中两个类互相含有对方的声明,一般情况这是不允许并且极可能是有错误的。

会报这个错:

org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name ‘***’: Bean with name ‘***’ has been injected into other beans [***, ***]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.

但有时候这正是我们想要的,考虑这种情况:

我们用一个ManagerFactory来包含所有Manager的声明,以便在程序中用到多个Manager的地方,一个入口集中访问。但是,可能某个Manager本身就需要用到其它几个Manager,进而用到ManagerFactory。这时,我们可以这样声明即可:

 <bean id="managerFactory" class="common.utils.ManagerFactory" lazy-init="true"/>

除了注册Bean之外,还可以通过在<bean>上设置属性来控制Bean的其他属性,比如:

<bean name="" class=""

lazy-init=“true” //是否延迟初始化

scope=“prototype” //bean的生命周期

depends-on=“其他bean“ //依赖其他bean

/>

在Spring中也有相应的注解去对应

@Lazy

@Scope

@DependsOn

他们都是放在类的头上。

除了注册Bean之外,还可以通过在<bean>上设置属性来控制Bean的初始化方法和析构方法,比如:

<bean name="" class=""

init-method=“init“ //初始化方法

destroy-method=“close“ //析构方法

/>

在Spring中也有相应的Bean去对应,当然,这两个注解是jdk里内置的

@PostConstruct

@PreDestroy

这两个注解放在方法头上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: