延續上篇 XML 配置,本文展示基於 @AspectJ 註解的 AOP 配置方式,並給出完整 Maven 依賴管理、項目結構與核心代碼,適合偏好註解風格的團隊。
<properties>
<spring-framework.version>3.2.3.RELEASE</spring-framework.version>
<aspectj.version>1.6.6</aspectj.version> <!-- 必須與 Spring 版本兼容 -->
<java.version>1.7</java.version>
</properties>
<dependencies>
<!-- Spring 核心 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<!-- AspectJ 織入器 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
<!-- 日誌與測試 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:context="https://www.springframework.org/schema/context"
xmlns:aop="https://www.springframework.org/schema/aop"
xsi:schemaLocation="...省略...">
<!-- 掃描切面與目標 Bean -->
<context:component-scan base-package="com.lee.spring003.aop.annotation"/>
<!-- 自動創建代理(核心開關) -->
<aop:aspectj-autoproxy/>
</beans>
僅需兩行:組件掃描 + <aop:aspectj-autoproxy/> 啟用 @AspectJ 自動代理。
public interface ITeacherDAO {
String saveTeacher();
}
@Repository("teacherDAO")
public class TeacherDAOImpl implements ITeacherDAO {
@Override
public String saveTeacher() {
System.out.println("TeacherDAOImpl - saveTeacher()");
return "save successfully";
}
}
@Component("transaction")
@Aspect
public class Transaction {
@Pointcut("execution(* com.lee.spring003.aop.annotation.TeacherDAOImpl.*(..))")
public void beginTransactionPointCut() {} // 方法簽名即切點標識
@Before("beginTransactionPointCut()")
public void beginTransaction() {
System.out.println("Begin transaction...");
}
@AfterReturning("beginTransactionPointCut()")
public void commit() {
System.out.println("Transaction commit...");
}
// 可擴展:@After、@AfterThrowing、@Around
}
| 維度 | XML 配置 | 註解配置 |
|---|---|---|
| 集中管理 | ✓ 所有切面集中在 XML,易審計 | ✗ 分散在各切面類中 |
| 重構友好 | ✗ 重命名方法/包需同步修改 XML | ✓ IDE 重構自動同步切點表達式 |
| 可讀性 | ✓ 配置與業務分離 | ✓ 切面邏輯自包含 |
| 靈活性 | ✓ 部署時可替換切面不動代碼 | ✗ 需重新編譯 |
| 團隊建議 | 大型項目、多團隊協作、需運行時動態調整 | 中小項目、敏捷迭代、開發自運維 |
完整 Maven 專案(含 XML 與註解雙版本):
https://github.com/leechenxiang/maven-spring002-aop