最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringAop切面執(zhí)行順序?qū)嵺`

 更新時間:2026年04月22日 08:31:08   作者:A沐風001  
本文介紹Spring AOP中自定義切面與內(nèi)置切面的執(zhí)行順序控制方法,通過@Order注解設置切面優(yōu)先級,確保業(yè)務邏輯正確執(zhí)行,感興趣的可以了解一下

用過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之路徑掃描詳解

    這篇文章主要介紹了Spring創(chuàng)建BeanDefinition之路徑掃描方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Java如何自定義類數(shù)組的創(chuàng)建和初始化

    Java如何自定義類數(shù)組的創(chuàng)建和初始化

    這篇文章主要介紹了Java如何自定義類數(shù)組的創(chuàng)建和初始化,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java原子操作CAS原理解析

    Java原子操作CAS原理解析

    這篇文章主要介紹了Java原子操作CAS原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • 詳解Java?中的函數(shù)式接口

    詳解Java?中的函數(shù)式接口

    這篇文章主要為大家介紹了Java中的函數(shù)式接口,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助<BR>
    2021-12-12
  • Jenkins+git+maven+tomcat自動打包部署全過程

    Jenkins+git+maven+tomcat自動打包部署全過程

    文章介紹了如何在CentOS 7系統(tǒng)上配置網(wǎng)絡和防火墻,安裝和配置Jenkins、Git、Maven和Tomcat,以及如何進行多分支構建和配置Jenkins觸發(fā)器,文章還解決了在Spring Boot項目、Maven打包和Tomcat啟動過程中遇到的一些常見問題
    2025-12-12
  • java截取網(wǎng)頁圖片的方法

    java截取網(wǎng)頁圖片的方法

    這篇文章主要介紹了java截取網(wǎng)頁圖片的方法,涉及java調(diào)用第三方控件實現(xiàn)截圖的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 在lambda中使用外部變量的一些心得分享

    在lambda中使用外部變量的一些心得分享

    這篇文章主要介紹了在lambda中使用外部變量的一些心得,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • SpringBoot實現(xiàn)redis延遲隊列的示例代碼

    SpringBoot實現(xiàn)redis延遲隊列的示例代碼

    延時隊列場景在我們?nèi)粘I(yè)務開發(fā)中經(jīng)常遇到,它是一種特殊類型的消息隊列,本文就來介紹一下SpringBoot實現(xiàn)redis延遲隊列的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • 解讀nacos獲取配置文件的大致過程

    解讀nacos獲取配置文件的大致過程

    這篇文章主要介紹了nacos獲取配置文件的大致過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Spring AI集成DeepSeek的詳細步驟

    Spring AI集成DeepSeek的詳細步驟

    DeepSeek 作為一款卓越的國產(chǎn) AI 模型,越來越多的公司考慮在自己的應用中集成,對于 Java 應用來說,我們可以借助 Spring AI 集成 DeepSeek,非常簡單方便,本文給大家介紹了Spring AI集成DeepSeek的詳細步驟,需要的朋友可以參考下
    2025-02-02

最新評論

崇阳县| 龙陵县| 汤原县| 永定县| 镇康县| 磴口县| 丹东市| 清徐县| 乌审旗| 铁力市| 吴桥县| 巍山| 永康市| 新安县| 五华县| 资阳市| 池州市| 山西省| 安西县| 宜宾市| 桐柏县| 石景山区| 赤壁市| 平湖市| 成安县| 康马县| 东平县| 中超| 定安县| 阿巴嘎旗| 开阳县| 德惠市| 钟山县| 咸丰县| 堆龙德庆县| 体育| 界首市| 水富县| 乌兰察布市| 称多县| 合川市|