SpringAop之日志(读配置文件方式)
读配置文件的目的在于减少代码上的冗余,这个冗余通常指加注解之类的。
比方说,我们原来的代码是这样:
@GetMapping("/list") @Log(title = "查询用户列表", businessType = BusinessType.QUERY) public AjaxResult list() { return AjaxResult.success(userService.queryUserListInfo()); }
相当于每个我都要加上@Log,我才能在aop中将其插入日志表(识别功能),现在我觉得这样太麻烦了。所以我可以这样做,也就是将@Log抽取一个配置文件,这个配置文件,团队定个规矩,上线前统一更改即可。
于是我的AOP代码就变成这样:
@Aspect @Component public class LogAspect { public static LogAspect logAspect; @PostConstruct public void init() { logAspect = this; } @Pointcut("execution(public * com.eqics.blog.controller..*.*(..))") public void Pointcut() { System.out.println("切点"); } //@Around:环绕通知 @Around("Pointcut()") @Transactional(isolation = Isolation.DEFAULT) public Object Around(ProceedingJoinPoint pjp) throws Throwable { Map<String, Object> data = new HashMap<>(); //获取目标类名称 String clazzName = pjp.getTarget().getClass().getName(); //获取目标类方法名称 String methodName = pjp.getSignature().getName(); // 请求的地址 String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); String apiUrl = ServletUtils.getRequest().getRequestURI(); //关键核心代码 InputStream path = getClass().getResourceAsStream("/api.properties"); BufferedReader reader = new BufferedReader(new InputStreamReader(path)); System.out.println("reader:" + reader); Properties pro = new Properties(); pro.load(reader); System.out.println("pro:" + pro.getProperty(apiUrl)); data.put("apiUrl", apiUrl); //IP地址 data.put("ip", ip); //记录类名称 data.put("clazzName", clazzName); //记录对应方法名称 data.put("methodName", methodName); //记录请求参数 data.put("params", pjp.getArgs()); //开始调用时间 // 计时并调用目标函数 long start = System.currentTimeMillis(); Object result = pjp.proceed(); Long time = System.currentTimeMillis() - start; //记录返回参数 data.put("result", result); //设置消耗总时间 data.put("consumeTime", time); try { System.out.println("日志输出:" + data); } catch (Exception e) { e.printStackTrace(); } return result; } }
api.properties配置文件如下:
# 用户管理 /blog_user/list=get user manage /blog_user/list_test=用户管理测试
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述