打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Spring AOP注解为什么失效?90%Java程序员不知道
userphoto

2022.07.28 江苏

关注

使用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对象,所以这种不能实现代理功能。

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

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

<!-- aspect -->

<aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true"/>

protected final T proxy() {

return (T) AopContext.currentProxy();

}

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

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

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Spring 5 AOP 代理对象方式默认改用 CGLIB 了吗?
[AOP] 2. AOP的两种实现-Spring AOP以及AspectJ
《Spring设计思想》AOP设计思想与原理(图文并茂)
Spring:(二) -- 春风拂面之 核心 AOP
2#spring_aop
花了20天的时间给粉丝整理的一套"最全"的Java求职笔记(四)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服