[springboot——01] AOP方式管理
目录
AOP 概念:
- 切入点 pointcut
- 通知 advice
- 切面 aspect = 切入点 + 通知
- 织入 weaving 将切面加入对象,并创建出代理对象的过程
- 环绕通知 【最强大、灵活的通知】
1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.创建增强类
execution 表达式相关文章:AOP(execution表达式)
package com.example.demo.aop;
import lombok.extern.log4j.Log4j2;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
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.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
* @author: fly
* @Date: 2023-03-19 14:50
* @Description: 切面类
*/
@Aspect
@Component
@Log4j2
public class AopLog {
// 线程局部的变量,用于解决多线程中相同变量的访问冲突问题
ThreadLocal<Long> startTime = new ThreadLocal<>();
// 定义切点 com.example.demo 下面的当前包和子包下面的所有类中的所有方法
// @Pointcut("execution(* com.example.demo..*.*(..))")
// 针对 controller 层的 AopLog 类的 aopTest方法进行测试
@Pointcut("execution(String com.example.demo.controller.AopLogController.aopTest())")
public void aopWebLog() {}
// 前置通知
@Before("aopWebLog()")
public void doBefore(JoinPoint joinPoint) {
// 记录开始时间
startTime.set(System.currentTimeMillis());
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes)
RequestContextHolder.getRequestAttributes();
assert attributes != null;
HttpServletRequest request = attributes.getRequest();
log.info("URL: " + request.getRequestURL().toString());
log.info("HTTP方法: " + request.getMethod());
log.info("IP地址: " + request.getRemoteAddr());
log.info("类的方法: " + joinPoint.getSignature().getDeclaringTypeName() + "." +
joinPoint.getSignature().getName());
log.info("参数: " + request.getQueryString());
}
// 方法抛出异常退出时执行的通知
@AfterThrowing(pointcut = "aopWebLog()",throwing = "exception")
public void addAfterThrowingLog(JoinPoint joinPoint,Exception exception) {
log.error("执行 " + "异常",exception);
}
}
拓展知识:通知的分类
- @Before 前置通知
- @AfterReturning 后置通知
- @After 最终通知
- @AfterThrowing 异常通知
- @Around 环绕通知 【与上面的通知的写法稍微有点区别】
public void around(ProceedingJoinPoint pjp) throws Throwable { System.out.println("[增强类]环绕通知前..."); pjp.proceed(); System.out.println("[增强类]环绕通知后..."); }
3.写我们的被增强类
根据切入点,我们可以定位到 被增强类
@Pointcut("execution(String com.example.demo.controller.AopLogController.aopTest())")
@RestController
public class AopLogController {
@RequestMapping("/aoptest")
public String aopTest() {
return "hello aop test!";
}
}
4.运行我们的程序,访问 /aoptest
5.应用场景
- 将重复代码进行抽取,即代码简化
- 增加特定性功能,即代码增强
拓展资料:
分类:
springboot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)