寻找spring bean之间循环依赖关系的良好实践

时间:2011-12-06 15:13:13

标签: java spring circular-dependency

我有这个例外:

SEVERE: Context initialization failedorg.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'myService': Bean with name 'myService' has been injected into other beans [otherService] in its raw version as part of a circular reference, but has eventually been wrapped. 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.

任何人都可以建议找到循环依赖来源的好策略吗?

我目前正在查看上下文定义,但正如您可能想象的那样,在某个成熟度的项目中,这需要一段时间。

所以我一般都在寻找快速找到循环bean依赖关系的想法。

4 个答案:

答案 0 :(得分:6)

这是宣传依赖图生成的2个工具。然而,我对他们没有任何经验。

答案 1 :(得分:4)

对我有用的一种方法是使用main方法编写一个辅助类,该方法实例化可刷新的应用程序上下文,禁止循环依赖并调用refresh。确保您的bean / app上下文配置文件位于类路径中。

public class ContextChecker {
    public static void main( String[] args ) {
        AbstractRefreshableApplicationContext ctx = 
            new ClassPathXmlApplicationContext( "classpath*:/beans.xml" );
        ctx.setAllowCircularReferences( false );
        ctx.refresh();
    }
}

此类可以作为Java应用程序运行,例如来自IDE内部。如果在您的上下文中检测到循环依赖关系,则错误消息将提供有关违规bean的信息。

答案 2 :(得分:1)

IntelliJ给了我一个非常好的依赖图,我必须增加Xmx大小,以便为操作提供足够的内存。右键单击应用程序上下文文件,Diagrams>依赖关系图。有时加载需要一段时间。如果基于注释的应用程序上下文不起作用,请尝试将组件扫描移至application.xml并重试。

答案 3 :(得分:0)

我知道OP的情况有所不同,但供将来参考:

如果您有此例外:

  • org.springframework.beans.factory.BeanCurrentlyInCreationException:创建名称为' a':请求的bean当前正在创建时出错:是否存在无法解析的循环引用?

然后堆栈跟踪顶部的消息应该说明依赖循环是什么,例如:

  • org.springframework.beans.factory.UnsatisfiedDependencyException:在文件[filename]中定义名称' a' 的 bean时出错:通过构造函数参数表示的不满意的依赖关系类型为[com.gk.simple.B]的索引0:在文件[filename]中定义名称' b' bean时出错:通过索引为0的构造函数参数表示不满意的依赖关系类型为[com.gk.simple.A]:创建 bean名称' a' 时出错:请求的bean当前正在创建:是否存在无法解析的循环引用?

这里的周期是 - > b - >一个。