springboot10、AOP
前言
Spring 最重要的两个功能,就是依赖注入和面向切面编程(AOP)。 AOP 为我们提供了处理问题的全局化视角,使用得当可以极大提高编程效率。 Spring Boot 中使用 AOP 与 Spring 中使用 AOP 几乎没有什么区别,只是建议尽量使用 Java 配置代替 XML 配置。
目录
编辑springboot09、AOP
前言
1、pom依赖
2、AOP控制器【com.item.aop】
3、测试apo效果
4、使用 AOP 监控性能
1、pom依赖
代码语言:javascript复制<!-- AOP -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2、AOP控制器【com.item.aop】
代码语言:javascript复制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 的环绕通知,监控服务方法的执行时间。
代码语言:javascript复制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;
}
}