Springboot 中AOP的使用


面向切面編程(Aspect Oriented Programming) 是軟件編程思想發展到一定階段的產物,是面向對象編程的有益補充。AOP一般適用於具有橫切邏輯的場合,如訪問控制、事務管理、性能檢測等。

日志、異常處理、事務控制等都是一個健壯的業務系統所必須的。但是為了保證系統健壯可用,就要再眾多業務方法中反復編寫類似的代碼,使得原本就很復雜的業務處理代碼變得更加復雜。業務功能的開發者還要考兩次這些額外的代碼是否處理正確,是否有遺漏的地方,如果需要修改日志信息的格式或者安全驗證的規則,或者再增加輔助功能,都會導致業務代碼頻繁而大量的修改。

面向切面編程,就是在不改變原程序的基礎上為代碼增加新的功能,對代碼段進行增強處理。他的設計思想來源於代理設計模式。

 

 

 

1.在原對象方法之前插入的增強處理為前置增強

2.該方法執行完以后插入的增強處理為后置增強

3.環繞在方法前后的增強處理為環繞增強,是最強大的增強處理,可以獲取或者修改目標方法的參數、返回值、異常處理、甚至決定目標方法是否執行。

4.該方法拋出異常時的增強處理為異常拋出增強 

5.最終增強處理,無論方法拋出異常還是正常退出都會得到執行,類似於異常處理機制中finally塊的作用,一般用於釋放資源

 

在Springboot中使用注解

需要引入所需要的jar :spring-boot-starter-aop

創建一個aop增強處理類

@Slf4j
@Aspect
@Component
public class LoggerAspect {

    // 匹配 com.lzz.lzzapp.common.user包及子包下所有類的所有方法
    @Pointcut("execution(* com.lzz.lzzapp.common.user..*.*(..))")
    public void logPointCut(){

    }
    //前置增強 在連接點執行之前執行的通知
    @Before("logPointCut()")
    public void before(){
        log.info("即將調用業務方法");
    }
    //最終增強 在連接點執行之后執行的通知(返回通知和異常通知的異常)
    @After("logPointCut()")
    public void after(){
        log.info("業務方法調用完成");
    }

    /**
     * 后置增強 在連接點執行之后執行的通知(返回通知)
     */
    @AfterReturning(value="logPointCut()",returning="result")
    public void doAfterReturning(JoinPoint joinPoint, Object result){
        String methodName = joinPoint.getSignature().getName();
        log.info("調用"+joinPoint.getTarget()+"的"+methodName+"方法。參數:"+Arrays.toString(joinPoint.getArgs())
                +"。方法返回值:"+result);
    }

    /**
     * 異常增強 在連接點執行之后執行的通知(異常通知)
     */
    @AfterThrowing("logPointCut()")
    public void doAfterThrowing(){
        log.info("異常處理完成");
    }

    /**
     * 環繞增強
     */
    @Around("logPointCut()")
    public void doAround(ProceedingJoinPoint jp){
        log.info("調用"+jp.getTarget()+"的"+jp.getSignature().getName()+"方法。參數:"+Arrays.toString(jp.getArgs()));
        try {
            Object result=jp.proceed();//執行目標方法
            log.info("方法返回值:"+result);
        }catch (Throwable e){
            log.error(jp.getSignature().getName()+"方法發生異常");
            e.printStackTrace();
        }
    }

}

 

使用@Aspect定義切面,@Pointcut定義切入點

切入點匹配的執行點為連接點為JointPoint,Spring會自動注入該實例,通過joinpoint 的getTarget()方法可以得到被代理對象,getSignature()方法返回被代理的目標方法。getArgs()方法返回傳遞給目標方法的參數數組

對於后置增強,還可以定義一個用於接收被代理方法的返回值,必須在 @AfterReturning 注解中通過returning 屬性指定該參數的名稱

execution是切入點指示符,他括號中是一個切入點表達式,可以配置要切入的方法,切入點表達式支持模糊匹配

public * addUser(com.entity.User)     * 表示匹配所有類型的返回值
public void *(com.entity.User)           * 表示匹配所有方法名 public void addUser(..) .. 表示匹配所有參數個數和類型 * com.user.*.*(..) 表示匹配com.entity包下所有類的所有方法 * com.user..*.*(..) 表示匹配com.entity包及其子包下所有類的所有方法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM