// 自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogExecution {
}
@Aspect // 切面类
@Order(1000) // 数字越小,优先级越高
@Component // 也要注册到容器
public class LoggingAspect {
// 定义切点
@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceMethods() {}
// 前通知
@Before("serviceMethods()")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Executing method...");
System.out.println("Before method: " + joinPoint.getSignature());
}
// 后通知
@After("serviceMethods()")
public void logAfter(JoinPoint joinPoint) {
System.out.println("Method execution completed.");
}
// 返回通知
@AfterReturning(pointcut = "serviceMethods()", JoinPoint joinPoint, returning = "result")
public void logAfterReturning(Object result) {
System.out.println("Method returned: " + result);
}
// 异常通知
@AfterThrowing(pointcut = "serviceMethods()", throwing = "ex")
public void logAfterThrowing(Throwable ex) {
System.out.println("Method threw an exception: " + ex);
}
// 环绕通知(四合一通知)
@Around("serviceMethods()")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Before..."); // 前通知
Object[] args = joinPoint.getArgs(); // 参数
try {
Object result = joinPoint.proceed(); // 执行目标方法
System.out.println("AfterReturning"); // 返回通知
} catch {
System.out.println("AfterThrowing..."); // 异常通知
} finally {
System.out.println("After..."); // 后通知
}
return result;
}
// 使用自定义注解的通知
@Before("@annotation(LogExecution)")
public void logBeforeAnnotatedMethod() {
System.out.println("Executing annotated method...");
}
}
标签:示例,void,joinPoint,System,public,AOP,println,AspectJ,out
From: https://www.cnblogs.com/cyrushuang/p/18486959