tolitius給出的答案可以正常工作,但對於真實世界的使用,我認爲您需要合併某種緩存。
到您的網站的每個要求都將需要你的主題,但你希望每一個請求,打你的數據庫只是爲了看一些顏色嗎?主題通常不是很大,不經常更改。所以它們是加載到內存並保存在內存中的理想選擇。這是我們使用我們運行的網站所做的,我們在啓動時從Hibernate加載的內存中保留了大約50個主題。它使服務主題的請求非常快。
的核心類,當然,你DatabaseThemeSource
豆,它實現ThemeSource
。如果你有一個可用的緩存庫,比如Ehcache,你可以使用它,但是大多數人只有很少的主題,所以簡單的Map
就可以用於這個緩存。我們用這樣的:
@Component("themeSource")
public class DatabaseThemeSource implements ThemeSource {
@Autowired
ThemeDAO themeDAO;
private final Map<String, Theme> themeCache;
public DatabaseThemeSource() {
themeCache = new HashMap<String, Theme>();
}
/**
* @see org.springframework.ui.context.ThemeSource#getTheme(java.lang.String)
*/
@Override
public Theme getTheme(String themeName) {
if (themeName == null) {
return null;
}
Theme theme = themeCache.get(themeName);
if (theme == null) {
Theme theme = themeDAO.getTheme(themeName);
if (theme != null) {
MessageSource messageSource = new ThemeMessageSource(theme);
theme = new SimpleTheme(themeName, messageSource);
synchronized (this.themeCache) {
themeCache.put(themeName, theme);
}
}
}
return theme;
}
/**
* Clears the cache of themes. This should be called whenever the theme is updated in the database.
*/
public void clearCache() {
synchronized (this.themeCache) {
themeCache.clear();
}
}
}
然後,你需要實現一個MessageSource
保存你的主題的所有的各個組件。值得將你的主題的各個元素從你的Hibernate對象複製到專用的MessageSource
中,這樣你就可以在關閉Hibernate會話和LazyLoadingException等方面沒有任何問題。它也更有效率,因爲你可以構造必要的MessageFormat
對象每個請求必須這樣做:
public class ThemeMessageSource extends AbstractMessageSource {
private final Map<String, MessageFormat> messages;
public ThemeMessageSource(Theme theme) {
messages = new HashMap<String, MessageFormat>();
messages.put("heading1", createMessageFormat(theme.getHeading1(), null));
messages.put("heading2", createMessageFormat(theme.getHeading2(), null));
messages.put("colour1", createMessageFormat(theme.getColour1(), null));
messages.put("colour2", createMessageFormat(theme.getColour2(), null));
}
public ThemeMessageSource(Map<String, MessageFormat> messages) {
this.messages = messages;
}
@Override
protected MessageFormat resolveCode(String code, Locale locale) {
return messages.get(code);
}
}
最終結果是它很快。所有主題都保存在內存中,通過簡單的Map
查找可以快速訪問主題元素。我們已經使用了一段時間,它對我們來說效果很好。
我接受了其他答案後,您一定有回答。這很有意義。我們走了一條不同的方向,讓最終用戶創建自己的主題。保存時會創建一個css文件,並將其存儲在每個請求當前訪問的db中。我還沒有實施緩存解決方案,但計劃這樣做。我很感謝你的迴應,但我現在所能做的只是滿足你的答案。 – blong824