记一次 由 Spring CJLib 动态代理 引发的 AOP 失效 BUG

最近在写一个接口
业务逻辑是开发一个 RestFul 接口 , 接收 JSON,之后将 JSON 结构化到 MYSQL 数据库A中
业务之外 , 还要将以上数据到存储结果 , 结构化到 数据库B中


为了 将 业务存储 与 日志存储 隔离开 , 这块 我采用了动态代理到设计模式
Service 层 用自定义注解 做了切面处理

@LogAnnotation 为 切面注解,有这个注解到方法做环绕切面 , 单独将处理结果记录日志

这套东西 这么处理是没有问题到 , 一个 api 接收一条 json 数据, 入库处理
但是 后期 更改需求了, 需要api 接收批量数据

为了 保证批量数据,每一条都能单独处理, 所以 我这里直接写了个循环,循环调用上面当 save 单条方法,

又鉴于是批量数据, 为了快速响应, 这块用了异步处理 , 加了 Async注解!

但, 这个时候 就出问题了, 保存业务数据是没有问题但 , 但是log数据是空但 ,
就是说 aop 但切面处理 没有切到..


DEBUG 了很长时间 才发现
Spring 集成的 动态代理Proxy , 在 做了切面配置后
@Autowired 获取到的 已经是 代理对象了,
而 在saveStoreTracks 方法中 的 this 是代理前的原对象,所以相当与没有增强,

举个例子 storeTrack.equers(this) 为 false

要解决的办法也很简单 , 在 Controller 由 @Autowired 获取到到 Service 参数传递过来,
因为 这个对象 极为 代理后到对象

或者使用 AopContext.currentProxy()) 获取当前对象到代理对象

voidm

在黑暗中支撑和平的无名者

留下你的评论

*评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

相关推荐