日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用自定义annotation接口进行aspectj动态缓存

發布時間:2025/3/16 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用自定义annotation接口进行aspectj动态缓存 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
由于系統需求需
要對各個接口進行key-value緩存(以參數為key,返回的對象為value),當然對于這種情況首先考慮到的是使用aop,前段時間看過
aspectj的一些介紹,借此機會正好加以應用和體會一下,aspectj是AOP最早成熟的java實現,它稍微擴展了一下java語言,增加了一些
keyword等,具體的aspectj的基本語法見[ur=http://today.java.net/pub/a/today/2003/12
/26/ch3AspectJSyntaxBasics.html]這里[/url],進行緩存的框架使用較成熟的ehcache.
首先是ehcache的配置文件
<?xml?version="1.0"?encoding="UTF-8"?>??
<ehcache>??
?????<diskStore?path="/home/workspace/gzshine/trunk/ehcache"/>??
?????<cache?name="DEFAULT_CACHE"??
?????????maxElementsInMemory="10000"??
?????????eternal="false"??
?????????timeToIdleSeconds="3600"??
?????????timeToLiveSeconds="3600"??
?????????overflowToDisk="true"/>??
</ehcache>?

這個的DEFAULT_CACHE是默認配置,最大的緩存數為10000,時間為一個小時
接下來的是spring下的配置
<?xml?version="1.0"?encoding="UTF-8"?>??
<beans?xmlns="http://www.springframework.org/schema/beans"??
?????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
?????xmlns:aop="http://www.springframework.org/schema/aop"??
?????xmlns:tx="http://www.springframework.org/schema/tx"??
?????xmlns:context="http://www.springframework.org/schema/context"??
?????xsi:schemaLocation="??
????????http://www.springframework.org/schema/beans??
????????http://www.springframework.org/schema/beans/spring-beans-2.5.xsd??
????????http://www.springframework.org/schema/tx??
????????http://www.springframework.org/schema/tx/spring-tx-2.5.xsd??
????????http://www.springframework.org/schema/aop??
????????http://www.springframework.org/schema/aop/spring-aop-2.5.xsd??
????????http://www.springframework.org/schema/context??
????????http://www.springframework.org/schema/context/spring-context-2.5.xsd">??
???
<!--?##############??aspectj?4?ehcache???#############?-->??
?????<aop:aspectj-autoproxy?proxy-target-class="true"/>??
?????<bean?id?=?"methodCacheAspectJ"?class="com.***.shine.aspectj.MethodCacheAspectJ"?>??
?????????<property?name="cache">??
?????????????<ref?local="methodCache"?/>??
?????????</property>??
?????</bean>??
?????<bean?id="cacheManager"??
?????????class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">??
?????????<property?name="configLocation">??
?????????????<value>classpath:ehcache.xml</value>??
?????????</property>??
?????</bean>??
?????<!--?定義ehCache的工廠,并設置所使用的Cache?name?-->??
?????<bean?id="methodCache"??
?????????class="org.springframework.cache.ehcache.EhCacheFactoryBean">??
?????????<property?name="cacheManager">??
?????????????<ref?local="cacheManager"?/>??
?????????</property>??
?????????<property?name="cacheName">??
?????????????<value>DEFAULT_CACHE</value>??
?????????</property>??
?????</bean>?

<aop:aspectj-autoproxy
proxy-target-class="true"/>
是為aspectj在所有class下開啟自動動態代理
<bean id="cacheManager">指定剛剛的ehcache配置文件
接下來編寫一個自定義的annotation
?package?com.***.shine.cache;??
?import?java.lang.annotation.Documented;??
?import?java.lang.annotation.ElementType;??
?import?java.lang.annotation.Retention;??
?import?java.lang.annotation.RetentionPolicy;??
?import?java.lang.annotation.Target;??
?@Target({ElementType.METHOD,ElementType.TYPE})??
?@Retention(RetentionPolicy.RUNTIME)??
?@Documented??
?public?@interface?MethodCache?{??
?????int?second()?default?0;???

<bean id =
"methodCacheAspectJ">是一個aspectj進行Pointcuts和Advice的類需注入methodCache
?package?com.***.shine.aspectj;??
?@Aspect??
?public?class?MethodCacheAspectJ?{??
?????Log?logger?=?LogFactory.getLog(MethodCacheAspectJ.class);??
?????private?Cache?cache;??
???????
?????public?void?setCache(Cache?cache)?{??
?????????this.cache?=?cache;??
???????
?????@Pointcut("@annotation(com.***.shine.cache.MethodCache)")??
?????public?void?methodCachePointcut(){????
???????
?????@Around("methodCachePointcut()")??
?????public?Object?methodCacheHold(ProceedingJoinPoint?joinPoint)?throws?Throwable{??
?????????String?targetName?=?joinPoint.getTarget().getClass().getName();??
?????????String?methodName?=?joinPoint.getSignature().getName();??
?????????Object[]?arguments?=?joinPoint.getArgs();??
?????????Object?result?=?null;??
?????????String?cacheKey?=?getCacheKey(targetName,?methodName,?arguments);??
?????????Element?element?=?cache.get(cacheKey);??
?????????if?(element?==?null)?{??
?????????????try{??
?????????????????result?=?joinPoint.proceed();??
?????????????}catch(Exception?e){??
?????????????????logger.info(e);??
?????????????if(result!=null){??
?????????????????try{??
?????????????????????element?=?new?Element(cacheKey,?(Serializable)?result);??
?????????????????????Class?targetClass?=?Class.forName(targetName);??
?????????????????????Method[]?method?=?targetClass.getMethods();??
?????????????????????int?second?=?0;??
?????????????????????for(Method?m:method){??
?????????????????????????if?(m.getName().equals(methodName))?{??
?????????????????????????????Class[]?tmpCs?=?m.getParameterTypes();??
?????????????????????????????if(tmpCs.length==arguments.length){??
?????????????????????????????????MethodCache?methodCache?=?m.getAnnotation(MethodCache.class);??
?????????????????????????????????second?=?methodCache.second();??
?????????????????????????????????break;??
?????????????????????????}??
?????????????????????if(second>0){?//?annotation沒有設second值則使用ehcache.xml中自定義值??
?????????????????????????element.setTimeToIdle(second);??
?????????????????????????element.setTimeToLive(second);??
?????????????????????cache.put(element);??
?????????????????}catch(Exception?e){??
?????????????????????logger.info("!!!!!!!!!"+cacheKey+"!!!!!!!!!未能執行方法緩存"+e);??
?????????????}??
?????????return?element.getValue();??
???
??????private?String?getCacheKey(String?targetName,?String?methodName,??
?????????????Object[]?arguments)?{??
?????????StringBuffer?sb?=?new?StringBuffer();??
?????????sb.append(targetName).append(".").append(methodName);??
?????????if?((arguments?!=?null)?&&?(arguments.length?!=?0))?{??
?????????????for?(int?i?=?0;?i?<?arguments.length;?i++)?{??
?????????????????if?(arguments[i]?instanceof?Date)?{??
?????????????????????sb.append(".").append(??
?????????????????????????????DateUtil.datetoString((Date)?arguments[i]));??
?????????????????}?else?{??
?????????????????????sb.append(".").append(arguments[i]);??
?????????????}??
?????????return?sb.toString();??
?}?
@Pointcut("@annotation(com.netease.shine.cache.MethodCache)")
對有應用com.netease.shine.cache.MethodCache進行注解的方法進行橫切面攔截
@Around("methodCachePointcut()")
并在Advice中處理這個Pointcut,這里的的Advice使用的是Around(環繞通知)
String cacheKey = getCacheKey(targetName, methodName,
arguments);
接下來使用類型,方法名,參數為key進入緩存處理
Element element = cache.get(cacheKey);
當然如果在cache隊列中取得非null對象則直接返回該對象
MethodCache methodCache = m.getAnnotation(MethodCache.class);
second = methodCache.second();
取得second的值(緩存的時間,如在@annotation中無重寫只為int second() default 0)
element.setTimeToIdle(second);
element.setTimeToLive(second);
如果非零則重新設置緩存時間
@MethodCache(second=300)??
public?List<Sort>?getSort(int?type,int?parentid){??
????
System.out.println("!!!!!!!!!!!!!沒緩存到");??
?????Row?row?=?new?Row();??
?????row.put("type",?type);??
?????row.put("parentid",?parentid);??
?????return?(List<Sort>)gz_Template.queryForList("sort.getSort",?row);??
----------------------------------------
陳于喆
Mail: chenyz@corp.netease.com

總結

以上是生活随笔為你收集整理的使用自定义annotation接口进行aspectj动态缓存的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本一道本在线 | 欧美精品在线观看一区二区 | 99热亚洲| 黄色av网站免费在线观看 | 在线观看成人一区 | 国产剧情久久 | 精品国产一区二区三区久久久蜜臀 | 波多野结衣 在线 | 中文字幕+乱码+中文字幕明步 | 韩国91视频 | 久草热视频 | 18视频在线观看男男 | 寂寞少妇让水电工爽hd | 黑人黄色一级片 | 欧美深性狂猛ⅹxxx深喉 | 中文字幕在线视频一区 | 午夜影院欧美 | 中文字幕二区在线观看 | www 在线观看视频 | jizz欧美性20| 网友自拍第一页 | 91九色视频在线观看 | 性色AV无码久久一区二区三 | 正在播放经典国语对白 | 宇都宫紫苑在线播放 | 欧美丰满一区二区免费视频 | 69堂免费视频| 一区二区视频网 | 欧美亚洲另类在线 | 国产又爽又黄视频 | 1024国产视频 | 91最新视频| 东方欧美色图 | 国产精品二区三区 | 精品少妇一区二区 | 天天操夜夜操视频 | 欧美午夜一区二区三区 | 欧美日韩专区 | 免费av大片| 久久精品国产亚洲AV黑人 | 国产成人av一区二区三区 | 国产aⅴ无码片毛片一级一区2 | av片免费看 | 人妻熟人中文字幕一区二区 | 国产精品高潮呻吟AV无码 | 成人午夜精品一区二区 | 性欧美大战久久久久久久免费观看 | 黄色片在线免费观看视频 | xx69欧美| 午夜免费小视频 | 欧美 国产 日本 | 国产日韩在线看 | 国产精品午夜福利视频234区 | 欧美色啪 | 亚洲а∨天堂久久精品2021 | 免费看日批 | 黄免费在线观看 | 黄色日韩视频 | 伊人伊人伊人 | 一卡二卡三卡四卡五卡 | 高潮流白浆在线观看 | 最新av在线网址 | 福利免费视频 | 97精品人妻一区二区三区香蕉 | 午夜精品亚洲 | 日本黄网站在线观看 | 夜福利视频 | 婷婷九月丁香 | 午夜精品久久久久久久99黑人 | 嫩草99| a毛片在线观看 | 日本小视频网站 | 免费伊人网| 一级香蕉视频在线观看 | 国产一级特黄视频 | 日韩成人一区二区三区 | 色综合天天操 | 亚洲伦理网站 | 午夜精品一区二区三区在线观看 | 成人免费视频国产在线观看 | 色香av| 2019中文字幕在线视频 | 久久久久九九九 | 国产精品成人久久久久 | 男人用嘴添女人下身免费视频 | 美女精品 | 涩涩在线观看 | 18禁男女爽爽爽午夜网站免费 | 国产精品一区二区三区久久久 | 天天干一干 | 少妇精品视频一区二区 | 欧美成人精品一区二区免费看片 | 久久天天操 | 日本激情小视频 | 亚洲日本欧美精品 | 国产精品一区二区久久国产 | 国产无码精品一区二区 | 精品国产中文字幕 | 中国免费观看的视频 |