博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring AOP注解为什么失效?90%Java程序员不知道
阅读量:7109 次
发布时间:2019-06-28

本文共 704 字,大约阅读时间需要 2 分钟。

使用Spring Aop注解的时候,如@Transactional, @Cacheable等注解一般需要在类方法第一个入口的地方加,不然不会生效。

如下面几种场景

1、Controller直接调用Service B方法:Controller > Service A

在Service A 上加@Transactional的时候可以正常实现AOP功能。

2、Controller调用Service A方法,A再调用B方法:Controller > Service A > Service B

在Service B上加@Transactional的时候不能实现AOP功能,因为在Service A方法中调用Service B方法想当于使用this.B(),this代表的是Service类本身,并不是真实的代理Service对象,所以这种不能实现代理功能。

所以,如果不是直接调用的方式,是不能实现代理功能的,非常需要注意。

但确实有这种不是直接调用的试,也需要实现代理功能,怎么做呢?很简单,只需要暴露当前代理对象给当前线程就行了,如下配置,注解粗体的部分。

expose-proxy="true"/>

protected final T proxy() {

return (T)AopContext.currentProxy();

}

这样就能拿到代理对象了,在Service A中可以通过proxy().B()即可正常实现B方法上面的代理功能。

看下AopContext源码,Spring会将当前代理对象绑定到当前线程ThreadLocal上面。

关于线程绑定变量参考昨天分享的ThreadLocal文章。

转载地址:http://agvhl.baihongyu.com/

你可能感兴趣的文章
P/Invoke Interop 实例
查看>>
百分比宽度div如何水平居中
查看>>
最后一位
查看>>
Vue学习笔记(1)——在页面右上角实现可悬浮/隐藏的系统菜单
查看>>
Java Thread 的使用
查看>>
[Noip2016]换教室(期望+DP)
查看>>
【译】使用 React,TypeScript 和 Webpack 开始一个项目
查看>>
3555: [Ctsc2014]企鹅QQ
查看>>
Mysql分库分表方案之spider存储引擎(一)
查看>>
【BZOJ】2502 清理雪道
查看>>
NSProxy的简单使用
查看>>
【CodeForces】704 C. Black Widow 动态规划+模拟
查看>>
找一个数组中特别的数
查看>>
BestCoder Round #25 1002 Harry And Magic Box [dp]
查看>>
leetcode-189-Rotate Array
查看>>
SQL Server 2008 排序函数 ROW_NUMBER和RANK 用法总结
查看>>
使用 nginx 同域名下部署多个 vue 项目,并使用反向代理
查看>>
[leetcode] 13. Roman to Integer
查看>>
centos7 下载eclipse的镜像站点
查看>>
MySQL ('root'@'%') does not exist的问题
查看>>