javascript
使用Spring的缓存管理器缓存Web内容
在這篇文章中,我想向您展示如何使用Spring的CacheManager,@ Cacheable和JMX批注來緩存和管理Web內容的緩存的基礎知識。 想象一下一個網上商店,它從遠程WCMS(Web內容管理系統)獲取一些內容,例如頁眉,頁腳,預告片,主導航。 提取可以例如經由REST服務發生。 一些內容很少更新,因此出于性能原因,將其緩存在Web應用程序中是有意義的。
入門
首先,我們需要一個緩存提供程序。 一個好的緩存提供程序將是EhCache 。 您需要將EhCache 作為依賴項添加到您的項目中。 您還需要配置ehcache.xml,該文件除其他事項外還描述緩存名稱,緩存內容的存儲位置和存儲時間。 請參考文檔以了解ehcache.xml的外觀。 EhCache的中心類是net.sf.ehcache.CacheManager。 借助此類,您可以以編程方式向緩存中添加對象或從緩存中刪除任何對象。 可以將對象緩存在內存中,磁盤上或其他位置。
Spring框架提供了一個由EhCache支持的CacheManager – org.springframework.cache.CacheManager。 它還提供了@Cacheable批注。 在文檔中 :“顧名思義,@ Cacheable用于劃分可緩存的方法-即,將其結果存儲在緩存中的方法,以便后續調用(具有相同的參數)時使用緩存中的值返回,而無需實際執行該方法。 在最簡單的形式中,注釋聲明要求與被注釋方法關聯的緩存名稱。 我們還將使用JMX注釋。 這些是Spring的注釋@ManagedResource和@ManagedOperation。 我們為什么需要那些? 我們需要它們能夠通過JMX控制臺清除緩存。 為什么? 好吧,例如,基礎數據已更改,但是緩存尚未過期。 過時的數據仍將從緩存中讀取,而不是從本機源中讀取。 用@ManagedResource注釋的Bean將作為JMX Bean公開,并且可以通過JMX控制臺執行@ManagedOperation注釋的方法。 我建議使用JMiniX作為簡單的JMX入口點。 只需聲明一個servlet,即可將JMiniX嵌入到webapp中。 還支持參數化方法,因此您甚至可以為方法的參數輸入一些實際值,并使用這些值觸發執行。
怎么做…
現在我們準備開發第一個代碼。 我們需要與遠程后端進行通信的服務,以便從WCMS中獲取各種內容。 讓我們用一種方法fetchMainNavigation()展示示例性的基本代碼。 此方法獲取主導航菜單的結構,并將該結構轉換為DTO對象NavigationContainerDTO(菜單的模型類)。 整個業務和技術邏輯都駐留在bean MainNavigationHandler中。 此邏輯對于此博客文章并不重要。 方法fetchMainNavigation()需要兩個參數:語言環境(例如,英語或德語)和變量(例如,B2C或B2B shop)。
@Component public class WCMSServiceImpl extends BaseService implements WCMSService {// injection of Spring's CacheManager is needed for @Cacheable@Autowiredprivate CacheManager cacheManager;@Autowiredprivate MainNavigationHandler mainNavigationHandler;...@Override@Cacheable(value = "wcms-mainnavigation",key = "T(somepackage.wcms.WCMSBaseHandler).cacheKey(#root.methodName, #root.args[0], #root.args[1])")public NavigationContainerDTO fetchMainNavigation(Locale lang, String variant) {Object[] params = new Object[0];if (lang != null) {params = ArrayUtils.add(params, lang);}if (variant != null) {params = ArrayUtils.add(params, variant);}return mainNavigationHandler.get("fetchMainNavigation", params);} }該方法使用Spring的@Cacheable注釋進行注釋。 這意味著,如果返回的對象NavigationContainerDTO在緩存中尚不可用,則將對其進行緩存。 下次獲取將從緩存中返回對象,直到緩存過期。 根據ehcache.xml中的設置進行緩存。 Spring的CacheManager在類路徑中自動找到EhCache提供程序。 @Cacheable中的value屬性指向緩存名稱。 key屬性指向可以訪問對象的緩存中的鍵。 由于緩存本質上是鍵值存儲,因此需要將對緩存方法的每次調用轉換為適合緩存訪問的鍵。 在簡單的情況下,鍵可以是任何靜態字符串。 在示例中,我們需要一個動態鍵,因為該方法具有兩個參數:語言環境和變量。 幸運的是,Spring支持帶有SpEL表達式(Spring EL表達式)的動態鍵。 有關更多詳細信息,請參見表“ Cache SpEL可用元數據 ”。 您可以調用任何生成密鑰的靜態方法。 我們的表達式T(somepackage.wcms.WCMSBaseHandler).cacheKey(#root.methodName,#root.args [0],#root.args [1])意味著我們使用以下三個參數在類WCMSBaseHandler中調用靜態方法cacheKey:方法名稱,第一個和第二個參數(分別是語言環境和變量)。 這是我們的密鑰生成器。
public static String cacheKey(String method, Object... params) {StringBuilder sb = new StringBuilder();sb.append(method);if (params != null && params.length > 0) {for (Object param : params) {if (param != null) {sb.append("-");sb.append(param.toString());}}}return sb.toString(); }讓我們展示處理程序類MainNavigationHandler的外觀。 這只是來自實際項目的簡化示例。
@Component @ManagedResource(objectName = "bean:name=WCMS-MainNavigation",description = "Manages WCMS-Cache for the Main-Navigation") public class MainNavigationHandler extends WCMSBaseHandler<NavigationContainerDTO, Navigation> {@OverrideNavigationContainerDTO retrieve(Objects... params) {// the logic for content retrieving and DTOs mapping is placed here...}@ManagedOperation(description = "Delete WCMS-Cache")public void clearCache() {Cache cache = cacheManager.getCache("wcms-mainnavigation");if (cache != null) {cache.clear();}} }由于在WCMSBaseHandler中進行了以下注入,因此CacheManager在這里也可用。
@Autowired private CacheManager cacheManager;@ManagedResource是Spring的JMX批注,以便將bean作為JMX MBean導出并在JMX控制臺中可見。 要導出的方法應使用@ManagedOperation注釋。 這是方法clearCache(),它從緩存中刪除主導航的所有內容。 “所有內容”是指NavigationContainerDTO類型的對象。 現在,可以將開發的WCMS服務注入前端的Bean中。 我已經在博客上寫過如何使用純HTML構建多級菜單并顯示了代碼。 這正是該服務的主要導航。
還有更多…
應該在Spring的XML配置文件中配置JMX注釋的掃描。
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"><property name="server" ref="mbeanServer"/><property name="assembler" ref="assembler"/><property name="namingStrategy" ref="namingStrategy"/><property name="autodetect" value="true"/> </bean>可在http(s)://:/ mct / webshop / admin / jmx /下訪問JMiniX的JMX控制臺。單擊clearCache()方法的execute按鈕將觸發緩存清除。
翻譯自: https://www.javacodegeeks.com/2015/04/caching-of-web-content-with-springs-cache-manager.html
總結
以上是生活随笔為你收集整理的使用Spring的缓存管理器缓存Web内容的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java高频面试_C ++或Java,高
- 下一篇: spring和maven_具有Sprin