Java 获取Spring循环引用的可读输出
为了保持理智,我告诉Spring吐循环引用:Java 获取Spring循环引用的可读输出,java,spring,Java,Spring,为了保持理智,我告诉Spring吐循环引用: _context = new ClassPathXmlApplicationContext(getApplicationContextFiles(), false); _context.setAllowCircularReferences(false); _context.refresh(); _context.start(); 问题是,生成的堆栈跟踪实际上看起来像barf:| 如何获得循环引用的简单输出,类似于:
_context = new ClassPathXmlApplicationContext(getApplicationContextFiles(), false);
_context.setAllowCircularReferences(false);
_context.refresh();
_context.start();
问题是,生成的堆栈跟踪实际上看起来像barf:|
如何获得循环引用的简单输出,类似于:
Unresolved circular reference: [aBean->nextBean->otherBean->aBean]
你试过“”吗?它显示了一系列的依赖关系。不确定它是否支持基于注释的DI,但它应该…如果您的所有周期都在注册的组件之间,这可能会有所帮助(据我所知,您无法轻松引用内部bean,因为它们未注册)。 您可以在bean解析器生成的事件上注册自定义侦听器,以便扩展应用程序上下文并覆盖initBeanDefinitionReader(),在该方法中,使用setEventListener在beanDefinitionReader上设置自定义侦听器(您需要强制转换为XmlBeanDefinitionReader) 当注册组件定义并将其存储在映射中时,侦听器将收到通知。 一旦配置处理完成,您就可以使用类似于的jdepend.framework.JavaPackage处理组件定义以识别周期。。 对于每个组件定义,迭代getBeanDefinitions()和getBeanReferences()(可能还有getInnerBeanDefinitions()),并为每个定义和每个引用添加一个“JavaPackage”和一个依赖项。
在处理每个引用和声明之后,您可以询问类似JavaPackage的对象,并给出任何返回true的containsCycle()的结果。我将采用的方法是编写一个脚本(可能是Python,但Groovy可能也很适合)来执行以下操作:
听起来可能有点复杂,但事实并非如此。我曾多次使用Python脚本解决过类似的问题。循环引用是否导致了问题的产生?Spring很好地处理了它们。是的,它们通过注入未初始化的bean造成了问题,这以令人痛苦的微妙方式破坏了应用程序。我很惊讶,因为我记得默认情况是不允许循环引用。现在我被带有循环引用的大型bean图所困扰——我对此并不满意。正如Spring文档所说,“与典型情况(没有循环依赖关系)不同,bean a和bean B之间的循环依赖关系将迫使一个bean在完全初始化之前注入另一个bean(经典的鸡/蛋场景)“使用SpringIDEEclipse插件生成bean依赖关系图怎么样?”?这可能会告诉你问题所在。我担心豆图太大了,我看不清DEP。我担心这没用——豆图太大了,我看不到依赖关系。罗伯特,你能把豆图放在可下载的地方,然后贴一个链接,让我们看看你说的“大”是什么意思吗再详细看看这个问题?恐怕我不能发布图表了。不过我要清点一下豆子。