首先,定义自定义注解@CustomLog
:
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 CustomLog {
String value() default ""; // 可以为注解定义一个value属性,用于存储日志信息
}
然后,定义AOP切面类CustomLogAspect
,并使用@Aspect
、@Component
等注解来声明它是一个切面组件:
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class CustomLogAspect {
private static final Logger logger = LoggerFactory.getLogger(CustomLogAspect.class);
// 定义一个切点,匹配所有带有@CustomLog注解的方法
@Pointcut("@annotation(com.lj.demo.annotation.CustomLog)")
public void customLogPointcut() {
}
// 环绕通知,用于在方法执行前后记录日志
@Around("customLogPointcut()")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
// 获取注解上的value值
CustomLog customLog = joinPoint.getSignature().getAnnotation(CustomLog.class);
String logValue = customLog.value();
// 在方法执行前记录日志
logger.info("开始执行方法: {},日志信息: {}", joinPoint.getSignature().getName(), logValue);
// 执行方法
long startTime = System.currentTimeMillis();
//这是环绕通知的关键部分。调用proceed方法将执行被通知的方法,并返回其结果。
Object result = joinPoint.proceed();
long endTime = System.currentTimeMillis();
// 在方法执行后记录日志
logger.info("方法执行结束: {},耗时: {}ms", joinPoint.getSignature().getName(), endTime - startTime);
return result;
}
}
接下来,在需要记录日志的方法上使用这个自定义注解:
@Service
public class demoService {
@CustomLog(value = "这是一条自定义日志信息")
public String doSomething() {
// 模拟业务逻辑
System.out.println("执行doSomething方法...");
return "执行成功";
}
}
最后,确保你的Spring Boot项目已经包含了AOP的依赖(spring-boot-starter-aop
),并且Spring AOP的自动配置没有被禁用。
现在,当你运行你的Spring Boot应用并调用demoService
中的doSomething
方法时,你应该会在日志中看到由CustomLogAspect
切面打印的日志信息。这些信息包括方法开始执行的日志、自定义的日志信息,以及方法执行结束和耗时信息。