我有这个例外:
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依赖关系的想法。
答案 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的情况有所不同,但供将来参考:
如果您有此例外:
然后堆栈跟踪顶部的消息应该说明依赖循环是什么,例如:
这里的周期是 - > b - >一个。