您好,登錄后才能下訂單哦!
本篇內容主要講解“SpringAOP的注解方式是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“SpringAOP的注解方式是什么”吧!
SpringAOP不是一門技術而是一種設計思想,稱為面向切面編程,是利用橫切技術剖析對象內部,將業務之間共同調用的邏輯提取并封裝為一個可復用的模塊,這個模塊被命名為切面(Aspect),該模塊減少系統中的重復代碼,降低模塊間的耦合度,可用于日志、權限認證、事務管理等
AOP是基于代理實現的,Java默認采用的是JDK動態代理,但是JDK動態代理只能代理接口不能代理類。因此springAOP會在JDK動態代理和CGLIB代理之間進行動態切換。
動態代理:在運行時借助于JDk動態代理、CGLIB等再內存中臨時臨時生成AOP代理類,也被成為運行時增強
靜態代理:指使用AOP框架的命令進行編譯,從而在編譯階段就可以生成AOP代理類,也被成為編譯增強
代理目標對象實現了接口,默認采用JDK動態代理,也可以強制使用CGLIB
代理目標對象沒有實現接口,必須使用CGLIB
Spring會自動在JDK動態代理和CGLIB代理直接轉換
切面(Aspect):切面是通知和切點的結合,通知和切點共同定義了切面的全部內容。
通知(Advice):定義了切面何時使用,通知分為以下幾種類型
前置通知(Before):在目標方法被調用之前調用通知功能
后置通知(After):在目標方法執行完成之后調用通知,此時不會關心方法的輸出是什么
返回通知(After-returning):在目標方法成功執行之后調用通知
異常通知(After-throwing):在目標方法拋出異常后調用通知
環繞通知(Around):在被通知的方法調用之前和調用之后執行自定義的行為
切點(PointCut):定義了在何處應用連接點,通常明確使用在類和方式名稱上,或者使用正在匹配或者注解方式
連接點(JoinPoin):連接點是在應用程序運行中能夠插入切面的一個點,具體插入方式根據通知的不同而不同
目標對象(Target): 需要被搭理的對象,由切點定義出來的
織入(Weaving):把切面應用到目標對象并創建新的代理對象的過程
編譯時織入
類加載時織入
運行時織入
博主以日志收集為例演示注解方式的實現
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency>
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 "";}
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());}}
1、對于環繞通知使用對象是 ProceedingJoinPoint
2、 在使用類似以下方式時,切記加粗部分的名稱要完全一致
@Before(value = “logPointCut() && @annotation(logInfo)”, argNames = “point,logInfo”)
public void before(JoinPoint point, LogAnnotation logInfo) {}
到此,相信大家對“SpringAOP的注解方式是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。