首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

SpringMVC + MyBatis 架構中 AOP 切面表達式匹配失效問題排查

     編輯:C++ 入門

SpringMVC + MyBatis:AOP 切面表達式匹配失效導致事務管理失效

現象:切面配置 execution(* com.proj..*Impl.*(..)) 無法匹配 com.proj.module.service.impl 下的類,導致事務不生效(日志顯示 SqlSession not registered for synchronization、連接不被 Spring 管理),但 JUnit 測試正常。改為 execution(* com.proj..*.*(..)) 即正常。

根因分析

AspectJ 切點表達式 *Impl.* 要求類名以 Impl 結尾且方法任意。實際類名可能不以 Impl 結尾,或包結構不符。
關鍵點:切面表達式匹配失敗不報錯,導致事務代理未創建,MyBatis 退回到無事務模式(自動提交),連接池正常但無回滾能力。JUnit 加載完整上下文(含事務配置)故正常,Web 環境因切面失效導致事務缺失。

解決與建議

  1. 檢查實現類命名是否符合 *Impl 模式,或調整切點為 execution(* com.proj..service..*.*(..)) 針對 service 包。
  2. 啟用 DEBUG 日志 org.springframework.aop 觀察切面匹配情況。
  3. 確保 tx:annotation-driven 或 aop:config 正確加載,且事務管理器配置正確。

此問題揭示了 AOP 配置錯誤靜默失效的隱蔽性,需通過日志驗證切面織入情況。

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