首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Spring AOP @AspectJ 注解式切面不生效的根因與修復

     編輯:程式設計綜合問答

問題現象

使用 @Aspect 注解定義切面,配置了 <aop:aspectj-autoproxy/> 和組件掃描,但切面方法 before() 從未執行,業務邏輯直接輸出「執行業務邏輯」。

代碼回顧

@Aspect
public class SpringAspect {
    @Before("execution(* * com.aop_spring.Business.*(..))")
    public void before() {
        System.out.println("before");
    }
}

Spring 配置:

<context:component-scan base-package="com.*" annotation-config="true"/>
<aop:aspectj-autoproxy/>
<bean id="business" class="com.aop_spring.Business"/>

核心原因

切面類 SpringAspect 未被 Spring 容器識別為 Bean。

  • @Aspect 僅標識這是一個切面,不包含 @Component 語義
  • <context:component-scan> 默認掃描 @Component、@Service、@Repository、@Controller,不掃描 @Aspect
  • 因此 SpringAspect 實例未創建,切面邏輯未註冊

修復方案

方案一:添加 @Component(推薦)

@Aspect
@Component  // 關鍵:讓組件掃描識別並創建 Bean
public class SpringAspect {
    @Before("execution(* com.aop_spring.Business.*(..))")
    public void before() {
        System.out.println("before");
    }
}

方案二:XML 顯式聲明 Bean

<bean class="com.aop_spring.SpringAspect"/>

切面表達式優化建議

原表達式 execution(* * com.aop_spring.Business.*(..)) 中間多一個 *(返回類型與類名之間),標準寫法:

@Before("execution(* com.aop_spring.Business.*(..))")
// 或針對接口方法
@Before("execution(* com.aop_spring.IBusiness.*(..))")

驗證步驟

  1. 啟動項目,觀察控制台是否輸出 before
  2. 或在 SpringAspect 構造函數加日誌確認 Bean 創建
  3. 啟用 Spring AOP 調試日誌:logging.level.org.springframework.aop=DEBUG

避坑指南

誤區正確認知
@Aspect 就能自動生效必須是 Spring Bean(@Component 或 XML 配置)
component-scan 會掃描所有註解默認只掃描 stereotype 註解,不含 @Aspect
表達式寫錯不報錯Spring 啟動時不驗證切點匹配,運行時才發現不匹配

添加 @Component 後重啟,切面即可正常攔截業務方法執行。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved