java基于AspectJ(面向切面编程)编码示例分享


在Java中,使用AspectJ进行面向切面编程(AOP)是一种强大的方式,可以用来实现横切关注点(如日志、事务管理等)的模块化。以下是一个简单的AspectJ编码示例,该示例演示了如何使用AspectJ来拦截方法调用前后的操作。

首先,确保你的项目中包含了AspectJ的依赖。如果你使用Maven,可以在`pom.xml`中添加以下依赖(以AspectJ 1.9.x为例):


<!-- AspectJ Runtime -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.9.7</version>
</dependency>
<!-- AspectJ Weaver -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.7</version>
</dependency>

然后,创建一个切面(Aspect),这个切面将定义你的横切关注点。下面是一个简单的切面示例,它将在调用任何标记了`@Loggable`注解的方法前后打印日志:


import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class LoggingAspect {

    // 定义切入点表达式,匹配所有带有@Loggable注解的方法
    @Pointcut("@annotation(Loggable)")
    public void loggableMethods() {}

    // 在方法执行前执行
    @Before("loggableMethods()")
    public void beforeLoggableMethod(JoinPoint joinPoint) {
        System.out.println("Entering method: " + joinPoint.getSignature().getName());
    }

    // 在方法执行后执行
    @After("loggableMethods()")
    public void afterLoggableMethod(JoinPoint joinPoint) {
        System.out.println("Exiting method: " + joinPoint.getSignature().getName());
    }
}

接下来,创建一个注解`@Loggable`,用于标记那些需要被拦截的方法:


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Loggable {
    // 这是一个标记性注解,无需属性
}

最后,你可以在任何方法上使用`@Loggable`注解,以便AspectJ切面能够拦截这些方法。例如:


public class BusinessService {

    @Loggable
    public void processBusinessLogic() {
        System.out.println("Processing business logic...");
    }
}

当`BusinessService`的`processBusinessLogic`方法被调用时,`LoggingAspect`切面将首先打印一条进入方法的日志,然后执行方法体,最后打印一条退出方法的日志。

注意:要使AspectJ正常工作,你还需要在Spring配置中启用AspectJ自动代理(如果你使用的是Spring框架),或者在Java应用中通过其他方式(如使用AspectJ编译器)来确保切面被正确织入。这个示例假设你已经在你的项目中正确配置了AspectJ环境。