1、pom依赖
<!-- AOP --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
2、AOP控制器【com.item.aop】
package com.item.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; /** * 日志切面 */ @Component @Aspect // 标注为切面 public class LogAspect { private Logger logger = LoggerFactory.getLogger(this.getClass()); // 切入点表达式,表示切入点为控制器包中的所有方法 @Pointcut("within(com.item.controller..*)") public void LogAspect() { } // 切入点之前执行 @Before("LogAspect()") public void doBefore(JoinPoint joinPoint) { logger.info("访问时间:{}--访问接口:{}", new Date(), joinPoint.getSignature()); } }
3、测试apo效果
可以根据返回的路径进行接口控制
4、使用 AOP 监控性能
在研发项目的性能测试阶段,或者项目部署后,我们会希望查看服务层方法执行的时间。以便精准的了解项目中哪些服务方法执行速度慢,后续可以针对性的进行性能优化。
此时我们就可以使用 AOP 的环绕通知,监控服务方法的执行时间。
package com.item.aop; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 服务层方法切面 */ @Component @Aspect // 标注为切面 public class ServiceAspect { private Logger logger = LoggerFactory.getLogger(this.getClass()); // 切入点表达式,表示切入点为服务层包中的所有方法 @Pointcut("within(com.item.controller..*)") public void ServiceAspect() { } @Around("ServiceAspect()") // 环绕通知 public Object deAround(ProceedingJoinPoint joinPoint) throws Throwable { long startTime = System.currentTimeMillis();// 记录开始时间 Object result = joinPoint.proceed(); logger.info("接口层方法:{}--执行时间:{}毫秒", joinPoint.getSignature(), System.currentTimeMillis() - startTime); return result; } }