首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何动态修改 spring aop 切面信息?让自动日志输出框架更好用

业务背景

很久以前开源了一款 auto-log[1]自动日志打印框架。

其中对于 spring 项目,默认实现了基于 aop 切面的日志输出。

但是发现一个问题,如果切面定义为全切范围过大,于是 v0.2 版本就是基于注解  实现的。

只有指定注解的类或者方法才会生效,但是这样使用起来很不方便。

如何才能动态指定 pointcut,让用户使用时可以自定义切面范围呢?

自定义注解切面原理

常规 aop 方式

发现这里的  注解属性是一个常量,无法方便地动态修改。

于是去查资料,找到了另一种更加灵活的方式。

可以指定 pointcut 的方式

我们通过  获取属性配置的切面值,给定默认值。这样用户就可以很方便的自定义。

当然,这里的 Advice 和以前的 aop 不同,需要重新进行实现。

AutoLogAdvice

只需要实现 MethodInterceptor 接口即可。

介绍完了原理,我们一起来看下改进后的日志打印组件的效果。

spring 整合使用

完整示例参考 SpringServiceTest[2]

maven 引入

注解声明

使用  启用自动日志输出

测试代码

•输出结果

切面自定义

原理解释

spring aop 的切面读取自 ,默认为值

也就是默认是读取被  指定的方法或者类。

当然,这并不够方便,我们希望可以想平时写 aop 注解一样,指定 spring aop 的扫描范围,直接在 spring 中指定一下  的属性值即可。

测试例子

完整测试代码[3]

我们在配置文件  中自定义下包扫描的范围:

自定义测试 service

自定义 spring 配置,指定我们定义的配置文件。springboot 啥的,可以直接放在 application.properties 中指定,此处仅作为演示。

测试

开源地址

为了便于大家学习,项目已开源。

Github: https://github.com/houbb/auto-log

Gitee: https://gitee.com/houbinbin/auto-log

小结

这个项目很长一段时间拘泥于注解的方式,我个人用起来也不是很方便。

最近才想到了改进的方法,人还是要不断学习进步。

关于日志最近还学到了 aspect 的编译时增强,和基于 agent 的运行时增强,这 2 种方式都很有趣,有机会会做学习记录。

References

auto-log:https://github.com/houbb/auto-log

SpringServiceTest:https://github.com/houbb/auto-log/tree/master/auto-log-test/src/test/java/com/github/houbb/auto/log/spring/SpringServiceTest.java

完整测试代码:https://github.com/houbb/auto-log/blob/master/auto-log-test/src/test/java/com/github/houbb/auto/log/dynamic/SpringDynamicServiceTest.java

  • 发表于:
  • 原文链接https://page.om.qq.com/page/ODY1IrarSW8vBRbyPMYhNw0Q0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券