今天在項目中用到了ehcache緩存,將list緩存到ehcache中,但是又存在分頁問題,會傳入Page類,默認的key命名方式失效,網上資料比較少,總結代碼貼上來。
spring整合ehcache的配置主要參考http://blog.goyello.com/2010/07/29/quick-start-with-ehcache-annotations-for-spring/,已經非常詳細了,不累贅敘述。
在上篇資料的基礎上,假設controller里面有個這樣的方法:
public List<ActivityDO> queryActivities(Page page, long clubId) { List<ActivityDO>result=activityDAO.queryActivityByCludId(page, clubId); return result; }
其中傳入Page和Long型的參數,按照默認的key命名方式,會將page+clubId這種類似的方式命名key,而page每次是不同的實體,導致即使是相同的查詢,也有不同的key,於是,我需要自己寫一個key生成方式,key=page的當前頁+clubid;
package com.xianxing.lxb.common.vo; import java.io.Serializable; import com.googlecode.ehcache.annotations.key.AbstractCacheKeyGenerator; public class PageKeyGenerator extends AbstractCacheKeyGenerator<Serializable>{ @Override public Serializable generateKey(Object... data) { if(data[0] instanceof com.xianxing.common.lang.Page){ com.xianxing.common.lang.Page page = (com.xianxing.common.lang.Page) data[0]; long clubId = (Long) data[1]; String result = page.getPage() + "-" + clubId; return result.hashCode(); } new IllegalArgumentException(); return null; } }
完成這一步后,可以將注解放入controller中:
@Cacheable(cacheName = "activityCache",keyGenerator = @KeyGenerator ( name = "com.xianxing.lxb.common.vo.PageKeyGenerator", properties = @Property( name="includeMethod", value="false"))) public List<ActivityDO> queryActivities(Page page, long clubId) { List<ActivityDO> result = activityDAO.queryActivityByCludId(page, clubId); return result; }
這樣就完成了!