2013-02-22 60 views
3

我有一個提供配置數據的彈簧服務。當服務被GUI調用時,它從數據庫加載配置數據。事實證明,在呈現單個請求期間,這經常發生。我想通過緩存配置數據來優化它。但是,我不確定這是一種很好的編程風格,還是「允許」在服務中有實例變量。它允許在Spring服務中有實例變量嗎?

下面是我在想什麼做的一些示例代碼:

@Serivce("MyConfigService") 
public class MyConfigServiceImpl implements MyConfigService { 

    private Config cachedConfig; 

    @Override 
    public Config loadConfig() { 
     if (cachedConfig != null) { 
      // load config 
      cachedConfig = loadedConfig; 
     } 
     return cachedConfig; 
    } 

    @Override 
    public saveConfig(Config config) { 
     cachedConfig = null; 
     // save the configuration 
    } 
} 
+0

當然你可以這樣做,但我會建議讓你的服務初始化bean。通過這種方式,Spring在初始化bean時會自動調用特殊的回調函數,並且可以確保在任何其他服務可以開始使用bean之前完成初始化:http://www.mkyong.com/spring/spring-initializingbean-and-disposablebean-示例/ – 2013-02-22 13:00:28

回答

2

是否允許在Spring服務層類中使用實例變量?當然。

在這裏使用一個保存對Config對象的引用是一個好主意嗎?

也許,也許不是。

你沒有顯示Config通常如何加載......是否同樣Config實例返回給所有用戶?即 - 當用戶1呼叫saveConfig,則用戶2呼叫loadConfig用戶2獲取Config對象用戶1保存。

如果是這樣,你應該能夠緩存值沒有問題。

此外,您可以使用Spring的annotation-based caching而不是自己實現它。

+0

是的,Config是一個全局應用程序範圍的配置對象,它只存在一次,並且不依賴於用戶。 – Jack 2013-02-22 17:08:27

0

實例變量是什麼Spring IoC容器是怎麼一回事;你的設計中可疑的是,你在loadConfig —中有你自己的延遲加載邏輯,這是你必須通過lazy-init=true(或類似的,我不記得準確)留給Spring的關注。該設計也可能涉及查找方法和可請求範圍的bean。

4

有一個實例變量(不是由Spring管理)引入了服務成爲線程不安全的可能性。所以我儘量避免它們,或者確保它們是線程安全的。

您可能想看看@configurable@postconstuct註釋以實現您的目標。