SpringAop切面執(zhí)行順序?qū)嵺`
用過SpringAop的人都知道,這玩意是非常的強大,可以實現(xiàn)我們很多橫切面的功能,包括Spring自己的很多東西,比如事務(@Transactional)和緩存(@Cacheable)等功能的實現(xiàn)都是依賴于切面,那么一個方法被多個切面注解修飾后,切面的執(zhí)行順序到底是什么樣的?如果改變Spring里已有切面的執(zhí)行順序,我們下面來一一實踐一下。
一、自定義切面的執(zhí)行順序
定義兩個切面注解@AopOne @AopTwo
寫兩個切面的邏輯
package chen.huai.jie.springboot.aop.aspect;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* @author chenhj_sh
*/
@Slf4j
@Aspect
@Component
@Order(value = 20)
public class AopOneAspect {
/**
* @Description 定義切入點
*/
@Pointcut(value = "@annotation(chen.huai.jie.springboot.aop.annotation.AopOne)")
public void pointCut() {
}
/**
* 環(huán)繞通知
*
* @param joinPoint
* @return
* @throws Throwable
*/
@Around("pointCut()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("切面1執(zhí)行前");
Object result = joinPoint.proceed();
log.info("切面1執(zhí)行后");
return result;
}
}package chen.huai.jie.springboot.aop.aspect;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* @author chenhj_sh
*/
@Slf4j
@Aspect
@Component
@Order(value = 11)
public class AopTwoAspect {
/**
* @Description 定義切入點
*/
@Pointcut(value = "@annotation(chen.huai.jie.springboot.aop.annotation.AopTwo)")
public void pointCut() {
}
/**
* 環(huán)繞通知
*
* @param joinPoint
* @return
* @throws Throwable
*/
@Around("pointCut()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("切面2執(zhí)行前");
Object result = joinPoint.proceed();
log.info("切面2執(zhí)行后");
return result;
}
}方法執(zhí)行:
package chen.huai.jie.springboot.aop.service;
import chen.huai.jie.springboot.aop.annotation.AopOne;
import chen.huai.jie.springboot.aop.annotation.AopTwo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @author chenhuaijie
*/
@Slf4j
@Service
public class AopService {
@AopOne
@AopTwo
public void aop() {
log.info("執(zhí)行業(yè)務邏輯");
}
}執(zhí)行結果:

因為切面2的order為11,比切面1的order要小,所以切面2先執(zhí)行,注意,切面的執(zhí)行其實是一個同心圓模樣,先執(zhí)行的后結束,如下圖:

二、自定義切面和Spring內(nèi)置切面的執(zhí)行順序
除了上述我們自定義的切面注解外,很多時候我們自定義的注解可能會跟Spring里已經(jīng)做好的注解一起使用,比如:我做了一個分布式鎖的注解@DistributedLock,它可能會跟@Transactional @Cacheable注解一起使用.
跟事務注解一起使用的時候,我們希望分布式鎖注解要早于事務注解執(zhí)行,晚于事務注解結束。
跟緩存注解一起使用的時候,為了防止緩存擊穿,我們需要緩存注解優(yōu)先于分布式鎖注解執(zhí)行。
怎么做到呢?怎么改變Spring內(nèi)置的一些切面的執(zhí)行邏輯呢?如下:
@EnableCaching(order = 10) @EnableTransactionManagement(order = 15)
這兩個注解里的orderz字段可以改變各自切面的執(zhí)行順序,可以滿足我們的要求。
舉例自定義注解和事務注解:
事務優(yōu)先于自定義注解執(zhí)行:

事務晚于自定義注解執(zhí)行:

總結:
到此這篇關于SpringAop切面執(zhí)行順序?qū)嵺`的文章就介紹到這了,更多相關SpringAop切面執(zhí)行順序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring創(chuàng)建BeanDefinition之路徑掃描詳解
這篇文章主要介紹了Spring創(chuàng)建BeanDefinition之路徑掃描方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04
Java如何自定義類數(shù)組的創(chuàng)建和初始化
這篇文章主要介紹了Java如何自定義類數(shù)組的創(chuàng)建和初始化,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
Jenkins+git+maven+tomcat自動打包部署全過程
文章介紹了如何在CentOS 7系統(tǒng)上配置網(wǎng)絡和防火墻,安裝和配置Jenkins、Git、Maven和Tomcat,以及如何進行多分支構建和配置Jenkins觸發(fā)器,文章還解決了在Spring Boot項目、Maven打包和Tomcat啟動過程中遇到的一些常見問題2025-12-12
SpringBoot實現(xiàn)redis延遲隊列的示例代碼
延時隊列場景在我們?nèi)粘I(yè)務開發(fā)中經(jīng)常遇到,它是一種特殊類型的消息隊列,本文就來介紹一下SpringBoot實現(xiàn)redis延遲隊列的示例代碼,具有一定的參考價值,感興趣的可以了解一下2024-02-02

