簡體   English   中英

獲得Spring循環引用的人類可讀輸出

[英]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可能也很合適)來執行以下操作:

  1. 解析bean圖形轉儲的文本以生成形式(A,B)的單個依賴關系的有向圖,指示B具有對A的引用。這里A,B等是圖中的節點,並且(A ,B)配對是邊緣。
  2. 在圖表上運行拓撲排序。 這會在多次傳遞中刪除節點。 許多語言都有許多實現。 選擇一種適合您選擇的腳本語言,Google就是您的朋友。
  3. 如果剩下任何節點,它們就是你的循環(循環引用集)。

聽起來有點復雜,但實際上並非如此。 我已經很多次使用Python腳本解決了類似的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM