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================");}
}

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

相关内容

热门资讯

林芝桃花节夜游全攻略:灯光、篝... 林芝桃花节夜游全攻略:灯光、篝火、星空与安全指南 每年三月下旬到四月初,当西藏大部分地区还未完全褪去...
致广大消费者(游客)的一封信 亲爱的游客朋友们: 岁聿云暮,春祺已至。恰逢“苍山皑雪映朝阳,洱海烟波迎宾至”的诗意时节,大理这座千...
上海之巅序展厅重启——在云端之... 2月13日焕新开放的上海中心B1序展厅,在历时一年多的升级后,以“一江一河”为叙事主线,曾经略显单调...
新春走基层|登上开往“童话世界...   九寨风光,美不胜收。以往,从成都开车前往九寨沟景区需要6个多小时,自川青铁路镇江关至黄胜关段开通...
从“返乡囤货”到“春节不打烊”... 深圳商报·读创客户端记者 周良成 以好特卖、零食有鸣、零食很忙等为代表的折扣零食店,正成为深圳人返乡...