spring中配置aop日志统计需引入spring-boot-starter-aop依赖,定义@aspect切面类,用@pointcut指定切点,@around等通知实现执行时间、参数、结果及异常记录,并确保目标类由spring管理且避免自调用失效。

Spring 中配置 AOP 实现日志统计,核心是定义切面(@Aspect)、指定切点(@Pointcut)、编写通知(如 @Around 或 @AfterReturning),并确保 AOP 自动代理生效。下面分步骤说明关键配置和实践要点。
启用 AOP 支持
确保项目中已引入 Spring AOP 依赖(如 Maven):
<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-aop</artifactid></dependency>
Spring Boot 项目默认开启 AOP;若为传统 Spring XML 配置,需添加:<aspectj-autoproxy></aspectj-autoproxy>
定义日志统计切面类
创建一个被 @Aspect 和 @Component 标注的类,例如:
@Aspect
@Component
public class LogStatsAspect {
<pre class="brush:java;toolbar:false;">private static final Logger log = LoggerFactory.getLogger(LogStatsAspect.class);
// 定义切点:拦截所有 service 包下 public 方法
@Pointcut("execution(public * com.example.demo.service..*.*(..))")
public void serviceMethod() {}
// 环绕通知:记录执行时间、入参、返回值、异常等
@Around("serviceMethod()")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
String methodName = joinPoint.getSignature().toShortString();
Object result;
try {
result = joinPoint.proceed(); // 执行目标方法
long duration = System.currentTimeMillis() - start;
log.info("[STATS] {} executed in {} ms, result: {}", methodName, duration, result);
return result;
} catch (Exception e) {
long duration = System.currentTimeMillis() - start;
log.error("[STATS] {} failed after {} ms: {}", methodName, duration, e.getMessage(), e);
throw e;
}
}}
说明:
-
@Pointcut可复用,避免重复写表达式 -
@Around最灵活,能控制执行时机、获取参数与返回值、捕获异常 - 若只需统计成功调用,可用
@AfterReturning;若只关注异常,可用@AfterThrowing
增强日志统计维度(可选)
实际业务中常需补充更多上下文信息:
- 记录用户 ID:从 ThreadLocal 或 SecurityContext 获取当前登录人
- 标记接口来源:解析请求头中的
X-Source或User-Agent - 按方法分类打点:结合自定义注解(如
@LogStats)精准控制切点 - 异步上报:将统计结果发往 Kafka 或写入 Redis,避免阻塞主流程
注意代理机制与限制
Spring AOP 默认使用 JDK 动态代理(针对接口)或 CGLIB(针对类),需注意:
- 目标类必须由 Spring 容器管理(即被
@Service/@Component等标注) - 自调用(同一个类内方法调用)不会触发 AOP,因未经过代理对象
- 私有方法、静态方法、final 方法无法被拦截
- 若需更底层织入,应考虑 AspectJ 编译期/加载期织入(非 Spring AOP 范畴)
不复杂但容易忽略。关键是切点表达式写对、通知逻辑清晰、不干扰业务主干。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











