SpringAOP和AspectJ,什么区别?

87 阅读1分钟

具体区别:

  • 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 功能,适合复杂项目。