[英]Getting human-readable output of Spring circular references
為了保持理智,我告訴Spring要在循環引用上做准備:
_context = new ClassPathXmlApplicationContext(getApplicationContextFiles(), false);
_context.setAllowCircularReferences(false);
_context.refresh();
_context.start();
問題是生成的堆棧跟蹤實際上看起來像barf:|
如何獲得循環引用的簡單輸出,類似於:
Unresolved circular reference: [aBean->nextBean->otherBean->aBean]
?
如果你的所有周期都在注冊組件之間,這可能有所幫助(據我所知,你不能輕易引用內部bean,因為它們沒有注冊)。 您可以在bean解析器生成的事件上注冊自定義偵聽器,這樣做可以擴展應用程序上下文並覆蓋initBeanDefinitionReader(),在該方法中使用setEventListener在beanDefinitionReader上設置自定義偵聽器(您需要轉換為XmlBeanDefinitionReader)。
注冊ComponentDefinitions時將通知偵聽器並將其存儲在Map中。 一旦配置處理完成,您就可以使用類似於JDepend的jdepend.framework.JavaPackage來處理ComponentDefinitions以識別周期。對於每個ComponentDefinition,迭代getBeanDefinitions()和getBeanReferences()(以及getInnerBeanDefinitions() )並為每個定義添加“JavaPackage”,並為每個引用添加依賴項。 在處理完每個引用和聲明之后,您可以查詢類似JavaPackage的對象,並為containsCycle()返回任何返回true的結果
你試過“ Spring IDE ”嗎? 它顯示了依賴項的圖形描述 。 不確定它是否支持基於注釋的DI,但它應該......
我采取的方法是編寫一個腳本(可能在Python中,盡管Groovy可能也很合適)來執行以下操作:
聽起來有點復雜,但實際上並非如此。 我已經很多次使用Python腳本解決了類似的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.