日韩性视频-久久久蜜桃-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面向切面编程(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 国内自拍视频在线观看 | 青青青在线 | 日本123区| 91视频免费在观看 | 色开心 | 亚洲视频黄 | 夜色快播 | 夜av| 欧美日韩一区二区视频观看 | 欧美人妻精品一区二区免费看 | 福利社区一区二区 | 天天av综合 | 一区二区 中文字幕 | 日韩三级视频在线观看 | 成人在线激情 | 青青草视频观看 | 三级在线免费 | 日本在线视频中文字幕 | a视频在线观看免费 | 韩国一区二区在线播放 | 国产口爆吞精一区二区 | 99xav | 日批小视频 | 一个色在线 | 国产成人超碰人人澡人人澡 | 超碰人人人人 | 日本一区二区三区电影在线观看 | 污视频在线观看网站 | 手机在线小视频 | 一级伦理农村妇女愉情 | 国偷自产视频一区二区久 | 综合久久伊人 | 亚洲精品久久久久久宅男 | 日韩sese | 日韩啪啪网站 | 日日摸夜夜 | 久久伊人av | 国产h视频| 都市激情自拍偷拍 | 锕锕锕锕锕锕锕锕 | 日本理论片午伦夜理片在线观看 | 在线免费黄 | 精品国产久 | 欧美成人小视频 | 娇妻被肉到高潮流白浆 | 欧美人与性动交α欧美片 | 乱日视频 | 免费成人看片 | 日日碰狠狠添天天爽无码 | 国产www免费观看 | 少妇高潮迭起 | 欧美手机在线视频 | 精品欧美色视频网站在线观看 | 日韩精品一区二区三区中文在线 | 想要xx在线观看 | 天天综合网久久 | 国产成人日韩 | 秋霞毛片少妇激情免费 | 好吊视频一区二区三区 | 日日噜噜噜夜夜爽爽狠狠 | 国产激情久久久久久熟女老人av | 在线中文字幕网站 | 阿v天堂2014| 性猛交富婆╳xxx乱大交麻豆 | 奇米在线观看 | 欧美成人精品一区二区综合免费 | 玖玖玖精品 | 亚洲aⅴ乱码精品成人区 | 欧美视频日韩视频 | 成人mv在线观看 | 日韩av中文字幕在线 | 国模大胆一区二区三区 | 又黄又骚的视频 | 国产精品欧美亚洲 | 插插插av | 国产精品www| 一级黄色片免费观看 | 国产做受高潮 | 大尺度电影在线 | 亚洲国产激情 | 久久97久久97精品免视看 | 91av福利| 三级av在线播放 | 免费在线观看视频a | 精品福利视频一区二区 | 三年中国片在线高清观看 | 久久久在线观看 | 中出中文字幕 | 无码精品人妻一二三区红粉影视 | 97综合视频 | 91在现看| 亚洲成人第一页 | 国产黄色片在线观看 | 黄色性网站 | 日本少妇裸体 | 亚洲熟伦熟女新五十路熟妇 | 欧美精品一级片 | 亚洲综合天堂 | 五月天色综合 |