[英]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
私有字段。
在此之后傾注了更多的大腦(我們和其他人),我們提出了這種方法:
安裝BeanPostProcessor
,確保所有單例bean(即bean定義中的作用域為Singleton
)在實際bean類型上具有自定義注釋@Stateless
。
我們選擇了自定義注釋而不是重用@Singleton
因為我們在其他地方也需要這個功能。
如果缺少注釋,則工廠會拋出錯誤。
在單元測試中,我們使用帶有自定義注釋的ClassPathScanningCandidateComponentProvider
來定位類路徑上的所有類。 然后我們可以進行復雜且昂貴的測試,以確保bean在初始配置之后沒有狀態發生變化(即在自動裝配發生之后)。
如果我們將自動裝配的字段移動到構造函數中,第二步可能會變得更容易,但我們不喜歡采用許多參數的方法。 如果Java或IDE可以從bean代碼生成構建器,那將是很好的。 由於情況並非如此,我們堅持使用自動裝配的字段和/或設置器。
您可以創建一個JUnit測試來加載您的應用配置。 這可以從這里組合ListableBeanFactory:
我可以通過掃描spring配置文件中的bean來動態創建List嗎?
在這里查看'isSingleton':
即列出應用程序上下文中的所有bean,然后檢查哪些是單例。
這可以讓你找到所有單例bean ...雖然它不會真正阻止你的錯誤情況,有人將這些單例中的一個視為不是。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.