簡體   English   中英

尋找有狀態的單身豆

[英]Finding stateful singleton beans

今天,我們在代碼中發現了這種模式:

class Foo {
    private List<String> errors;

    public void addError(String error) { ... }
    public List<String> getErrors();
}

雖然代碼似乎有效,但這是一個單獨的Spring bean,並且它被注入了幾個獨立的地方,並且bean的使用者認為它們每個都有自己的錯誤列表。 所以這引入了微妙的錯誤。

顯而易見的解決方案是教育開發人員避免這種錯誤,但我想知道是否有靜態或運行時代碼分析工具可以找到這種錯誤。

例如,bean后處理器可以在返回之前分析bean,並查找不是@Autowired私有字段。

在此之后傾注了更多的大腦(我們和其他人),我們提出了這種方法:

  1. 安裝BeanPostProcessor ,確保所有單例bean(即bean定義中的作用域為Singleton )在實際bean類型上具有自定義注釋@Stateless

    我們選擇了自定義注釋而不是重用@Singleton因為我們在其他地方也需要這個功能。

    如果缺少注釋,則工廠會拋出錯誤。

  2. 在單元測試中,我們使用帶有自定義注釋的ClassPathScanningCandidateComponentProvider來定位類路徑上的所有類。 然后我們可以進行復雜且昂貴的測試,以確保bean在初始配置之后沒有狀態發生變化(即在自動裝配發生之后)。

如果我們將自動裝配的字段移動到構造函數中,第二步可能會變得更容易,但我們不喜歡采用許多參數的方法。 如果Java或IDE可以從bean代碼生成構建器,那將是很好的。 由於情況並非如此,我們堅持使用自動裝配的字段和/或設置器。

您可以創建一個JUnit測試來加載您的應用配置。 這可以從這里組合ListableBeanFactory:

我可以通過掃描spring配置文件中的bean來動態創建List嗎?

在這里查看'isSingleton':

如何強制執行Spring bean的原型范圍

即列出應用程序上下文中的所有bean,然后檢查哪些是單例。

這可以讓你找到所有單例bean ...雖然它不會真正阻止你的錯誤情況,有人將這些單例中的一個視為不是。

暫無
暫無

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

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