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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

大数据WEB阶段Spring框架 AOP面向切面编程(二)

發布時間:2024/4/30 javascript 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大数据WEB阶段Spring框架 AOP面向切面编程(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Spring AOP面向切面編程(二)

一、切入點的execution表達式

  • execution的表達形式: execution(修飾符? 返回值類型 所在包類? 方法名(參數列表) 異常?)

  • ?表示可有可無
    ? execution(public * *(..))
    工程中所有的public方法
    ?execution(* set*(..))
    工程中所有方法名以set開頭的方法
    ?execution(* com.xyz.service.AccountService.*(..))
    com.xyz.service.AccountService類下面的所有方法
  • ?execution(* com.xyz.service..(..))

    com.xyz.service包下所有類的所有方法

    ?execution(* com.xyz.service...(..))
    com.xyz.service包下及其子包下所有類的所有方法
    execution(* com.xyz..service..(..))
    報名以com.xyz開頭的所有子包一直子到service下的所有類的所有方法
    舉例:com.xyz.a.b.service com.xyz.a.service com.xyz.a.b.c.service 會滿足上面的條件

    二、五大通知的具體實現

  • 環繞通知 around
  • 5個中最強大的通知,唯一一個能在通知中控制目標方法是否執行的通知
  • 前置通知
  • 配置文件配置
  • 后置通知
  • 配置文件配置
  • 異常通知
  • 異常通知可以控制出現異常后事務回滾 , 和記錄日志
  • 配置文件配置
  • 注意: JoinPoint參數必須放在第一位
  • 最終通知
  • 不管是么情況都會執行
  • 三、AOP注解

  • 在配置文件中把aop注解開關打開
  • 通過注解配置切面類
  • 通過注解配置通知方法
  • 前置通知
  • 后置通知
  • 環繞通知
  • 異常通知
  • 最終通知
  • 四、通過注解生成切入點表達式的引用

  • 創建一個空方法
  • 使用@Pointcut注解生成一個切入點的引用
  • 使用
  • 五、環繞嵌套問題

    六、自定義注解

  • 聲明一個注解
  • 使用
  • 判斷是否有注解
  • 七、各種示例

  • 異常

    代碼結構如圖所示PersonServletPersonServicePersonDao 用異常通知捕獲servlet的所有的方法拋出的異常: 目標對象所在的類 cn.tedu.big1601.servlet.PersonServlet 拋出異常所在的方法 save() 拋出異常的名稱 XxxException 異常信息 message意義: 異常處理類和業務邏輯類完全松耦合。 時刻捕獲生產生產環境中所有的錯誤,實時監控該系統,異常收集。@Component @Aspect public class ExceptionAspect {@AfterThrowing(value = "execution(* com.tj..*(..))" ,throwing = "throwable" )public void after(JoinPoint jp , Throwable throwable){System.out.println("異常發生在:"+jp.getTarget().getClass());System.out.println(jp.getSignature().getName()+"()發生了異常!");System.out.println("發生異常類型:"+throwable.getClass());System.out.println("異常信息:"+throwable.getMessage());} }
  • 統計方法執行時間

    計算servlet的各個類的各個方法的執行時間 1.類的名稱 2.方法的名稱 3.執行的時間 控制臺輸出意義:用來監控程序的性能問題 @Component @Aspect public class RuntimeAspect {@Around("execution(* com.tj..*(..))")public Object around(ProceedingJoinPoint pjp) throws Throwable{Long begin = System.currentTimeMillis();Object result = pjp.proceed();Long end = System.currentTimeMillis();System.out.println(pjp.getTarget().getClass()+"類"+pjp.getSignature().getName()+"方法執行了"+ (end - begin)+"毫秒!");return result;} }
  • 事務控制

    當方法上有事務的注解,該方法就有事務。寫一個切面來完成事務控制類 public class TxManage {/*** 開啟事務* */public static void stattx(){System.out.println("開啟了事務");}/*** 提交事務* */public static void commitTx(){System.out.println("提交事務");}/*** 回滾事務* */public static void rollback(){System.out.println("事務回滾");} }自定義事務注解 @Target(value = { ElementType.METHOD }) @Retention(value = RetentionPolicy.RUNTIME) public @interface TxAnnotation {String value() default "";}給需要事務控制的地方添加注解 @Component public class PersonServiceImpl implements PersonService{@Autowiredprivate PersonDao dao;@TxAnnotation@Cacheable("add")@Overridepublic void savePerson(Person person) {dao.savePerson(person);}@TxAnnotation@Cacheable("get")@Overridepublic Person getPerson(int id) {Person person = dao.getPerson(id);return person;}@TxAnnotation@Cacheable("del")@Overridepublic void delPerson(int id) {dao.delPerson(id);}}事務控制切面 @Component @Aspect public class TxAspect {@Around(value = "execution(* com.tj..*(..)) && @annotation(ann)")public Object around(ProceedingJoinPoint pjp ,TxAnnotation ann ) throws Throwable{Object result = null;try{TxManage.stattx();result = pjp.proceed();TxManage.commitTx();}catch(Exception e){TxManage.rollback();}return result; } }
  • 權限控制

    說明:每個方法上添加能夠執行該方法的注解@PrivilegeInfo 并且要指明 PrivilegeInfo(name=”add”) 那么將來這個方法只能執行還有add權限的方法自定義權限控制注解 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface PrivilegeInfo {String value() ; }給需要控制權限的地方添加權限控制注解 @Component public class PersonServlet {@Autowiredprivate PersonService ps;/*** 保存用戶信息* */@PrivilegeInfo("add")public void savePerson(Person person){ // int i = 1/0;ps.savePerson(person);}/*** 獲取用戶信息* */@PrivilegeInfo("get")public Person getPerson(int id){Person person = ps.getPerson(id);return person ; }/*** 刪除用戶信息* */@PrivilegeInfo("del")public void delPerson(int id ){ps.delPerson(id);} }權限控制切面類@Component @Aspect public class PrivilegInfoAspect {//當前用戶的權限List<String> list =Arrays.asList("add" , "get");@Around("execution(* com.tj..*(..)) && @annotation(ann)")public Object around(ProceedingJoinPoint pjp , PrivilegeInfo ann) throws Throwable{String value = ann.value();Object result = null;if(list.contains(value)){System.out.println("尊敬的飛秋會員你好!");result = pjp.proceed();}else{System.out.println("你沒有這個權限 ,滾");}return result;}}
  • 數據緩存

    緩存需求:1.savePerson的時候需要往數據庫里保存一份然后再往內存(Map)中保存一份 2.getPerson的時候先從Map中獲取 如果有則返回則不用執行目標方法,如果內存中沒有則執行目標方法從數據庫取 3.如果第一次調用getPerson內存中沒有的話 執行目標方法從數據庫取 取出來后同時把獲取到的Person對象保存到內存中,以便后續獲取時直接從內存中取自定義 緩存控制注解 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Cacheable {String value(); }給需要緩存的地方添加注解 @Component public class PersonServiceImpl implements PersonService{@Autowiredprivate PersonDao dao;@TxAnnotation@Cacheable("add")@Overridepublic void savePerson(Person person) {dao.savePerson(person);}@TxAnnotation@Cacheable("get")@Overridepublic Person getPerson(int id) {Person person = dao.getPerson(id);return person;}@TxAnnotation@Cacheable("del")@Overridepublic void delPerson(int id) {dao.delPerson(id);}}緩存控制切面類 @Component @Aspect public class CacheableAspect {//緩存Map<Integer , Person> map = new HashMap<Integer,Person>();@Around("execution(* com.tj..*(..))&& @annotation(ann)")public Object befer(ProceedingJoinPoint jp , Cacheable ann) throws Throwable{Object result = null;String v = ann.value();if(v.equals("add")){Person person = (Person) jp.getArgs()[0];int id = person.getId();if(map.containsKey(id)){System.out.println("該用戶已存在");}else{System.out.println("存入 緩存");map.put(id, person);result = jp.proceed();}}else if(v.equals("get")){int id = (Integer) jp.getArgs()[0];if(map.containsKey(id)){System.out.println("從緩存中獲取");result = map.get(id);}else{result = jp.proceed();Person person = (Person) result;map.put(person.getId(), person);}}return result;} }
  • 總結

    以上是生活随笔為你收集整理的大数据WEB阶段Spring框架 AOP面向切面编程(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 亚洲精品视频在线播放 | 亚洲人性生活视频 | 日本不卡网 | 奇米狠狠 | 女尊高h男高潮呻吟 | 大陆熟妇丰满多毛xxxⅹ | 天天草天天草 | 丝袜美腿中文字幕 | 91麻豆成人| 久久网av | 亚洲欧美色视频 | 亚洲欧美色图在线 | 肥臀熟女一区二区三区 | 一区二区导航 | 中国性老太hd大全69 | 国产一级色 | 亚洲第一成人av | 日韩影视一区 | 日韩欧美无| 精品三级电影 | 亚洲AV成人无码精电影在线 | 精品人妻无码一区二区三区 | 一区二区精品在线观看 | 综合久久一区二区 | 国产aa毛片 | 内射无码专区久久亚洲 | 三级黄色片免费 | 天天色天天| 蜜臀少妇久久久久久久高潮 | 91精品久久久久久久久中文字幕 | 欧美黄色一级 | 成人毛片在线视频 | 美女网站免费观看视频 | 亚洲欧美在线视频免费 | 亚洲第一偷拍 | 香蕉小视频 | 成年人网站在线 | 91中文字幕在线视频 | 中文字幕第9页 | 爱啪啪av | 国产精品成人网 | 成人精品视频一区 | 齐天大性床战铁扇公主 | 9i免费看片黄 | 在线射| 亚洲精品视频在线观看视频 | 国产免费成人av | jizz国产| 欧美日本亚洲 | av网址在线 | 国产一区一一区高清不卡 | 四色最新网址 | 欧美男女激情 | 香蕉成人av | 成人在线免费网站 | 成人午夜剧场视频网站 | 国产伦精品一区三区精东 | 三级自拍 | 白浆一区| 后进极品美女圆润翘臀 | 老女人一区 | 国产精品夜夜躁视频 | 亚洲综合激情五月久久 | 91日批 | 亚洲黄色免费在线观看 | 亚洲欧美中文日韩在线v日本 | 日本精品一二三 | av观看国产| 最新超碰 | 黄色在线视频网址 | 91porny九色 | 臭脚猛1s民工调教奴粗口视频 | 精品一区李梓熙捆绑 | 日韩精品在线播放 | 久艹在线观看视频 | 欧洲成人一区二区三区 | 99热这里只有精品7 青青草社区 | 欧美日韩中文国产一区发布 | 欧洲日韩一区二区三区 | www.-级毛片线天内射视视 | 欧美二三区| 性一交一乱一色一免费无遮挡 | 四虎久久| 中文字幕第315页 | 亚洲涩色 | av合集| 老妇free性videosxx | 18成人免费观看视频 | 欧美精品99久久久 | 无码视频在线观看 | 国产精品自拍偷拍 | 一区二区在线观看免费视频 | 性生活一级大片 | 久草免费在线视频 | 美女精品一区二区 | 国产强伦人妻毛片 | 国产福利在线导航 | 91麻豆精品一区二区三区 | 欧美在线视频第一页 |