Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取Spring循环引用的可读输出_Java_Spring - Fatal编程技术网

Java 获取Spring循环引用的可读输出

Java 获取Spring循环引用的可读输出,java,spring,Java,Spring,为了保持理智,我告诉Spring吐循环引用: _context = new ClassPathXmlApplicationContext(getApplicationContextFiles(), false); _context.setAllowCircularReferences(false); _context.refresh(); _context.start(); 问题是,生成的堆栈跟踪实际上看起来像barf:| 如何获得循环引用的简单输出,类似于:

为了保持理智,我告诉Spring吐循环引用:

    _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可能也很适合)来执行以下操作:

  • 解析bean图转储的文本,以生成形式为(a,B)的单个依赖项的有向图,表示B引用了a。这里a,B等是图中的节点,(a,B)对是边
  • 在图形上运行拓扑排序。这将在多个过程中删除节点。有多种语言的多种实现。为你选择的脚本语言选择一种,谷歌是你的朋友
  • 如果剩下任何节点,它们就是您的循环(循环引用集)

  • 听起来可能有点复杂,但事实并非如此。我曾多次使用Python脚本解决过类似的问题。

    循环引用是否导致了问题的产生?Spring很好地处理了它们。是的,它们通过注入未初始化的bean造成了问题,这以令人痛苦的微妙方式破坏了应用程序。我很惊讶,因为我记得默认情况是不允许循环引用。现在我被带有循环引用的大型bean图所困扰——我对此并不满意。正如Spring文档所说,“与典型情况(没有循环依赖关系)不同,bean a和bean B之间的循环依赖关系将迫使一个bean在完全初始化之前注入另一个bean(经典的鸡/蛋场景)“使用SpringIDEEclipse插件生成bean依赖关系图怎么样?”?这可能会告诉你问题所在。我担心豆图太大了,我看不清DEP。我担心这没用——豆图太大了,我看不到依赖关系。罗伯特,你能把豆图放在可下载的地方,然后贴一个链接,让我们看看你说的“大”是什么意思吗再详细看看这个问题?恐怕我不能发布图表了。不过我要清点一下豆子。