現象:切面配置 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 環境因切面失效導致事務缺失。
*Impl 模式,或調整切點為 execution(* com.proj..service..*.*(..)) 針對 service 包。org.springframework.aop 觀察切面匹配情況。tx:annotation-driven 或 aop:config 正確加載,且事務管理器配置正確。此問題揭示了 AOP 配置錯誤靜默失效的隱蔽性,需通過日志驗證切面織入情況。