簡體   English   中英

我應該在 spring 單例 bean 中完全使用靜態嗎

[英]Should I use static at all in spring singleton beans

正如我剛剛讀到的,默認情況下我創建的 spring bean 是單例。 我目前正在將 static 關鍵字用於我的記錄器、重用變量和一些我只想存在一次的列表。

但是因為所有 bean 都是單例,所以我正在考慮從所有內容中刪除靜態。

private static final Logger LOGGER = LoggerFactory.getLogger(MatchmakingService.class);
private static final List<Lobby> QUEUE_BLOCKED = new ArrayList<>();

private final Logger logger = LoggerFactory.getLogger(MatchmakingService.class);
private final List<Lobby> queueBlocked = new ArrayList<>();

我的問題是,我應該在 spring 上下文中使用“靜態”嗎? 如果是,為什么?

Spring 的設計使得在絕大多數情況下您可以避免使用靜態字段。

擁有一個靜態最終記錄器是完全可以的。 記錄器是線程安全的,旨在以這種方式使用。

擁有靜態最終常量是可以的。

除了記錄器之外,應該避免任何不是一成不變的靜態。

也不要將實例變量用於會話狀態(與服務調用者執行的操作相關的狀態),因為其他調用者可以訪問和更改該狀態。

如果您使用實例或靜態變量來緩存,請擺脫它們並配置緩存管理器。

如果您的代碼將配置數據存儲在靜態字段中,請將它們設為實例字段並使用 spring 讀取配置數據。

如果類記錄到相同的文件或輸出流(例如System.out ),則在類中使用靜態記錄器通常是有意義的,而不管哪個實例記錄某些內容。 代碼片段中的隊列是否應該是靜態的取決於它的用途,沒有更多細節就無法回答。

好問題。 在我看來,如果您的業務場景始終處於相同的 spring 上下文中,則不應使用靜態。 原因是 spring bean 在一個 spring 上下文中是單一的。但是 bean 在不同的 spring 上下文中具有不同的實例。 下面是示例代碼:

//  The first Spring Bean Context
ApplicationContext context1 = new FileSystemXmlApplicationContext("classpath:/ApplicationContext.xml");
Biz b1 = context1.getBean("myBean", Biz.class);

//  The second Spring Bean Context
ApplicationContext context2 = new FileSystemXmlApplicationContext("classpath:/ApplicationContext.xml");
Biz b2 = context2.getBean("myBean", Biz.class);

//  The result is false, because of creating two instances of Biz
System.out.println(b1 == b2);

但是靜態變量在一個 JVM 中有一個實例。 所以為了性能和健壯性,你應該更頻繁地使用靜態。 換句話說,你不能把一個程序中的所有類都做成bean。

暫無
暫無

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

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