【Spring学习】AOP实现日志记录
AOP知识点
AOP的核心原理
AOP中主要概念理解
AOP五种通知工作
实现AOP的三种方式
Spring里执行步骤
1、定义一个切面类Aspect
2、定义切点Pointcut
3、定义Advice通知
使用Spring实现AOP
<!--AOP依赖包--> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> </dependency>
import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; @RestController @RequestMapping("/api/aop") public class AopUserController { @GetMapping("/getUserByName") public String name(@RequestParam("name") String name) { return "Hello:" + name; } @GetMapping("/getUserList") public List<String> getUser() { List<String> list = new ArrayList<>(); list.add("张三"); list.add("李四"); list.add("王五"); return list; } }
import com.fasterxml.jackson.databind.ObjectMapper; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; @Aspect @Component public class AopLog { private Logger logger = LoggerFactory.getLogger(this.getClass()); ThreadLocal<Long> startTime = new ThreadLocal<>(); //定义切点 @Pointcut(value = "execution(* com.binlog.study.aop.controller.*.*(..))") public void aopWebLog() { } //使用环绕通知 @Around("aopWebLog()") public Object myLogger(ProceedingJoinPoint pjp) throws Throwable { startTime.set(System.currentTimeMillis()); //使用ServletRequestAttributes请求上下文获取方法更多 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); String className = pjp.getSignature().getDeclaringTypeName(); String methodName = pjp.getSignature().getName(); //使用数组来获取参数 Object[] array = pjp.getArgs(); ObjectMapper mapper = new ObjectMapper(); //执行函数前打印日志 logger.info("调用前:{}:{},传递的参数为:{}", className, methodName, mapper.writeValueAsString(array)); logger.info("URL:{}", request.getRequestURL().toString()); logger.info("IP地址:{}", request.getRemoteAddr()); //调用整个目标函数执行 Object obj = pjp.proceed(); //执行函数后打印日志 logger.info("调用后:{}:{},返回值为:{}", className, methodName, mapper.writeValueAsString(obj)); logger.info("耗时:{}ms", System.currentTimeMillis() - startTime.get()); return obj; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)