具体区别:
-
Spring AOP:
- 基于代理机制(JDK 动态代理或 CGLIB)。
- 只支持方法级别的拦截。
- 运行时织入,配置简单,适用于常见的 Spring 项目。
-
AspectJ:
- 基于字节码修改,功能更强大。
- 支持方法、构造器、字段等多种切入点。
- 编译时或类加载时织入,适合复杂的 AOP 需求。
代码案例:
Spring AOP 使用示例
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Spring AOP: Before method " + joinPoint.getSignature().getName());
}
}
@Service
public class MyService {
public void perform() {
System.out.println("Performing service...");
}
}
AspectJ 使用示例
@Aspect
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("AspectJ: Before method " + joinPoint.getSignature().getName());
}
}
public class MyService {
public void perform() {
System.out.println("Performing service...");
}
}
// AspectJ配置(通常在pom.xml中配置)
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.12.0</version>
<configuration>
<complianceLevel>1.8</complianceLevel>
<source>1.8</source>
<target>1.8</target>
<aspectLibraries>
<aspectLibrary>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
总结:
- Spring AOP 适合简单的 AOP 使用场景,配置方便。
- AspectJ 提供更强大和细粒度的 AOP 功能,适合复杂项目。