91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringAOP的注解方式是什么

發布時間:2021-10-14 10:17:59 來源:億速云 閱讀:159 作者:iii 欄目:編程語言

本篇內容主要講解“SpringAOP的注解方式是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“SpringAOP的注解方式是什么”吧!

1、概述

SpringAOP不是一門技術而是一種設計思想,稱為面向切面編程,是利用橫切技術剖析對象內部,將業務之間共同調用的邏輯提取并封裝為一個可復用的模塊,這個模塊被命名為切面(Aspect),該模塊減少系統中的重復代碼,降低模塊間的耦合度,可用于日志、權限認證、事務管理等

2、實現方式

AOP是基于代理實現的,Java默認采用的是JDK動態代理,但是JDK動態代理只能代理接口不能代理類。因此springAOP會在JDK動態代理和CGLIB代理之間進行動態切換。

2.1 代理方式分為兩種:動態代理靜態代理

  • 動態代理:在運行時借助于JDk動態代理、CGLIB等再內存中臨時臨時生成AOP代理類,也被成為運行時增強

  • 靜態代理:指使用AOP框架的命令進行編譯,從而在編譯階段就可以生成AOP代理類,也被成為編譯增強

2.2 代理方式的選擇

  • 代理目標對象實現了接口,默認采用JDK動態代理,也可以強制使用CGLIB

  • 代理目標對象沒有實現接口,必須使用CGLIB

Spring會自動在JDK動態代理和CGLIB代理直接轉換

3、名詞解釋

  • 切面(Aspect):切面是通知和切點的結合,通知和切點共同定義了切面的全部內容。

  • 通知(Advice):定義了切面何時使用,通知分為以下幾種類型

    • 前置通知(Before):在目標方法被調用之前調用通知功能

    • 后置通知(After):在目標方法執行完成之后調用通知,此時不會關心方法的輸出是什么

    • 返回通知(After-returning):在目標方法成功執行之后調用通知

    • 異常通知(After-throwing):在目標方法拋出異常后調用通知

    • 環繞通知(Around):在被通知的方法調用之前和調用之后執行自定義的行為

  • 切點(PointCut):定義了在何處應用連接點,通常明確使用在類和方式名稱上,或者使用正在匹配或者注解方式

  • 連接點(JoinPoin):連接點是在應用程序運行中能夠插入切面的一個點,具體插入方式根據通知的不同而不同

  • 目標對象(Target): 需要被搭理的對象,由切點定義出來的

  • 織入(Weaving):把切面應用到目標對象并創建新的代理對象的過程

    • 編譯時織入

    • 類加載時織入

    • 運行時織入

4、具體實現

博主以日志收集為例演示注解方式的實現

4.1 新建springboot項目并映入AOP依賴

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId></dependency>

4.2 編寫注解類

import java.lang.annotation.*;/** * 日志注解 * * @author chilx */@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface LogAnnotation {   /** * 方法名稱 */String title() default "";/** * 操作類型 {@link LogTypeConsts} */String type() default "";/** * 操作描述 */String remark() default "";}

4.3 編寫切面類

import com.chilx.aop.annotation.LogAnnotation;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;import org.springframework.stereotype.Component;/** * @author chilx * @date 2021/3/31 **/@Aspect@Componentpublic class LogAnnotationAspect {   /** * 切點 */@Pointcut("@annotation(com.chilx.aop.annotation.LogAnnotation)")public void logPointCut() {   }/** * 前置通知: 方法執行前調用 * 注意: 在配置value:的時候可以使用@Annotation(參數名稱)的方式來使用我們自定的注解 * 切記前后的參數名稱要一致 */@Before(value = "logPointCut() && @annotation(logInfo)", argNames = "point,logInfo")public void before(JoinPoint point, LogAnnotation logInfo) {   // 參數Object[] args = point.getArgs();System.out.println();System.out.println("前置通知" + "-->" + logInfo.title() + "--" + logInfo.remark());}/** * 后置通知: 方法執行后調用,若方法出現異常,不執行 */@After(value = "logPointCut() && @annotation(logInfo)", argNames = "point,logInfo")public void after(JoinPoint point, LogAnnotation logInfo) {   System.out.println("后置通知" + "-->" + logInfo.title() + "--" + logInfo.remark());}/** * 返回: 方法執行后調用,若方法出現異常,不執行 */@AfterReturning(value = "logPointCut() && @annotation(logInfo)", argNames = "point,logInfo")public void afterReturning(JoinPoint point, LogAnnotation logInfo) {   System.out.println("后置通知" + "-->" + logInfo.title() + "--" + logInfo.remark());}/** * 環繞通知: */@Around(value = "logPointCut() && @annotation(logInfo)", argNames = "point,logInfo")public void around(ProceedingJoinPoint point, LogAnnotation logInfo) throws Throwable {   System.out.println("執行方法前");Object proceed = point.proceed(point.getArgs());System.out.println("執行方法后");System.out.println("環繞通知" + "-->" + logInfo.title() + "--" + logInfo.remark());}/** * 異常通知:方法拋出異常時執行 */@AfterThrowing(value = "logPointCut() && @annotation(logInfo)", argNames = "point,logInfo,e", throwing = "e")public void afterThrowing(JoinPoint point, LogAnnotation logInfo, Exception e) {   System.out.println("異常通知" + "-->" + logInfo.title() + "--" + logInfo.remark());System.out.println(e.getMessage());}}

4.4 注意事項

1、對于環繞通知使用對象是 ProceedingJoinPoint

2、 在使用類似以下方式時,切記加粗部分的名稱要完全一致

@Before(value = “logPointCut() && @annotation(logInfo)”, argNames = “point,logInfo”)

public void before(JoinPoint point, LogAnnotation logInfo) {}

到此,相信大家對“SpringAOP的注解方式是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兴国县| 伊吾县| 北流市| 峨眉山市| 广丰县| 华蓥市| 苍梧县| 惠州市| 玉山县| 元朗区| 潮安县| 九江县| 和硕县| 开阳县| 阿尔山市| 松潘县| 北安市| 凤山市| 溆浦县| 曲松县| 东海县| 名山县| 江达县| 化德县| 卓资县| 凌海市| 平遥县| 景德镇市| 垦利县| 通化市| 建昌县| 城市| 阿图什市| 和田市| 宁远县| 太仆寺旗| 富平县| 中山市| 河北区| 犍为县| 濮阳市|