网站建设服务提供商,企业宣传片视频模板,免费域名如何建站,wordpress分类目录进不去转载自 Spring AOP注解为什么失效#xff1f;90%Java程序员不知道
使用Spring Aop注解的时候#xff0c;如Transactional, Cacheable等注解一般需要在类方法第一个入口的地方加#xff0c;不然不会生效。
如下面几种场景
1、Controller直接调用Service A方法#xff1a;…转载自 Spring AOP注解为什么失效90%Java程序员不知道
使用Spring Aop注解的时候如Transactional, Cacheable等注解一般需要在类方法第一个入口的地方加不然不会生效。
如下面几种场景
1、Controller直接调用Service A方法Controller Service A Method
在Service A 上加Transactional的时候可以正常实现AOP功能。 2、Controller调用Service A方法A再调用B方法Controller Service A Method Service B Method
在Service B Method上加Transactional的时候不能实现AOP功能因为在Service A方法中调用Service B方法就是使用this.B()this代表的是Service类本身并不是真实的代理Service对象所以这种不能实现代理功能。
所以如果不是直接调用的方式是不能实现代理功能的非常需要注意。
但确实有这种不是直接调用的试也需要实现代理功能怎么做呢很简单只需要暴露当前代理对象给当前线程就行了如下配置注解粗体的部分。
!-- aspect --
aop:aspectj-autoproxy proxy-target-classtrue expose-proxytrue/
protected final T proxy() {return (T) AopContext.currentProxy();
}
这样就能拿到代理对象了在Service A中可以通过proxy().B()即可正常实现B方法上面的代理功能。 看下AopContext源码Spring会将当前代理对象绑定到当前线程ThreadLocal上面。
关于线程绑定变量参考昨天分享的ThreadLocal文章。