Springboot中使用AOP
创始人
2025-05-30 15:27:20

1. AOP术语说明

  1. 切面
    springboot中使用@Aspect注解标注的类,通俗地理解就是一个实现了要增强方法的增强操作的实现类,类中定义了增强方法执行前后等情况要进行的操作。

  2. 连接点
    表示AOP增强方法的执行,即被AOP切面类增强的方法。

  3. 通知
    表示连接点执行前后或遇到异常等情况要执行的操作,用不同的注解来表示,有如下5中通知类型:
    | 注解 | 描述 |
    | @Before | 前置通知, 在方法执行之前执行 |
    | @After | 后置通知, 在方法执行之后执行 |
    | @AfterReturn | 返回通知, 在方法返回结果之后执行|
    | @AfterThrowing | 异常通知, 在方法抛出异常之后 |
    | @Around | 环绕通知,围绕方法的执行 |

  4. 切入点
    匹配连接点的断言,表示要在什么样的方法进行AOP增强,形式如下:

execution(修饰符 返回值类型 方法名(参数)异常)

通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行。

2. Springboot使用AOP

AOP常用来记录一些方法的执行日志,下面以记录控制类的执行日志为例子来说明Springboot如何使用AOP。

  1. 引入AOP依赖
org.springframework.bootspring-boot-starter-aop2.5.0
  1. 定义AOP注解
import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
public @interface LogAnnotation {String module() default "";String operator() default "";
}
  1. 定义切面类
@Component
@Aspect
@Slf4j
public class LogAspect {// 定义切点,表示被该注解注释的方法要被增强@Pointcut("@annotation(com.tplink.blog.common.aop.LogAnnotation)")public void pt() {}@Around("pt()")public Object around(ProceedingJoinPoint point) throws Throwable {long start = System.currentTimeMillis();// 执行原来的方法Object obj = point.proceed();long end = System.currentTimeMillis();// 保存日志recordLog(point, end - start);return obj;}// 记录日志private void recordLog(ProceedingJoinPoint point, long time) {// 获取署名信息对象MethodSignature signature = (MethodSignature)point.getSignature();// 通过反射获取Method对象Method method = signature.getMethod();// 获取方法上的注解对象LogAnnotation annotation = method.getAnnotation(LogAnnotation.class);log.info("============================log start==========================");log.info("module:{}", annotation.module());log.info("operator:{}", annotation.operator());// 获取请求方法名String className = point.getTarget().getClass().getName();String name = signature.getName();log.info("request method:{}",className + "." + name + "()");// 请求参数Object[] args = point.getArgs();String params = JSON.toJSONString(args[0]);log.info("params:{}", params);// 获取ipHttpServletRequest request = HttpContextUtils.getServletRequest();log.info("ip:{}", IpUtils.getIpAddr(request));log.info("执行时间:{}ms", time);log.info("============================log stop==========================");}
}
  1. 定义控制类进行测试
@RestController
@RequestMapping("test")
public class TestController {private Logger logger = LoggerFactory.getLogger(TestController.class);@GetMapping("logAOP")@LogAnnotation(module = "AOP测试", operator = "进行日志AOP")public void testAOP(@RequestParam String param1) {logger.info("===============进行日志AOP================");}
}

执行结果如下:
在这里插入图片描述

相关内容

热门资讯

原创 葡... 随着社会经济的飞速发展,越来越多的人拥有了富足的生活。这个时代,让我们不仅仅停留在物质的满足上,精神...
永宁县必须品尝的小吃都有哪些 永宁县,这座充满烟火气的城市,以其独具特色的小吃而闻名。若你来到此地,这些令人垂涎三尺的小吃绝对值得...
年夜饭,素菜要占‘半边天’!健... 年夜饭,素菜要占‘半边天’!健康吃法+10道营养菜谱 你知道吗?78%的家庭年夜饭都是大鱼大肉唱...
清鲜为魂,技法为翼:杭帮菜的烹... 杭帮菜作为浙菜的核心分支,植根于杭州“三面云山一面城”的地理优势,坐拥西湖、富春江、千岛湖的鲜美食材...
新春走基层·忙年|凌晨3点出摊... 你见过凌晨3点的早市吗? 凌晨2点50分,菜贩朱微微便已整装出发,骑上电动三轮车前往四平万邦农副产...