package li.ehcache; import java.util.concurrent.locks.Lock; import li.aop.AopChain; import li.aop.AopFilter; /** * CacheAopFilter,缓存的name为方法,key为方法参数,value为方法返回值 * * @author li (limingwei@mail.com) * @version 0.1.1 (2013-02-05) */ public class CacheFilter implements AopFilter { public void doFilter(AopChain chain) { li.ehcache.Clear clear = chain.getMethod().getAnnotation(li.ehcache.Clear.class); if (null == clear) { doCache(chain);// 缓存执行方法 } else { CacheUtil.removeCache(clear.value());// 清理缓存 } } /** * 缓存执行方法 */ private void doCache(AopChain chain) { String cacheName = CacheUtil.cacheName(chain.getMethod()); String cacheKey = CacheUtil.cacheKey(chain.getArgs()); Object cacheData = CacheUtil.getElement(cacheName, cacheKey); if (cacheData == null) { cacheData = doMethod(cacheName, cacheKey, cacheData, chain);// 执行目标方法 CacheUtil.putElement(cacheName, cacheKey, cacheData);// 缓存方法返回值 } chain.setResult(cacheData);// 不执行目标方法,设置他的返回值 } /** * 执行目标方法(事实上会进行二次锁检测是否需要执行) */ private Object doMethod(String cacheName, Object cacheKey, Object cacheData, AopChain chain) { Lock lock = CacheUtil.getLock(cacheName); lock.lock(); try { cacheData = CacheUtil.getElement(cacheName, cacheKey); if (cacheData == null) { cacheData = chain.doFilter().getResult();// 这里执行了目标方法 } } finally { lock.unlock(); } return cacheData; } }