码迷,mamicode.com
首页 > 编程语言 > 详细

spring aop无法拦截类内部的方法调用

时间:2018-06-29 14:02:04      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:解决方案   aop切面   str   事务   pos   ice   问题   注解   top   

1.概念

拦截器的实现原理就是动态代理,实现AOP机制。Spring 的代理实现有两种:一是基于 JDK Dynamic Proxy 技术而实现的;二是基于 CGLIB 技术而实现的。如果目标对象实现了接口,在默认情况下Spring会采用JDK的动态代理实现AOP

2.问题

在类C中,方法A调用方法B,

B方法被AOP拦截。(可能是方法B上在另外的@Aspect切面定义上了切点/也可能是加了@Transactional事务注解,底层原理也是AOP实现),最终A-》B ,B并不会触发AOP。

3.解决方案

1.手动获取代理对象

1.将当前的代理类暴露给线程使用,以下2种自己选一个实现即可。

注解实现方案:springboot:启动类上加注解:@EnableAspectJAutoProxy(exposeProxy=true):

配置实现方案:<aop:aspectj-autoproxy expose-proxy="true" />

2.A中调用B:不要直接用this(因为this是目标对象,自然无法实现代理类的增强方法@before等),而是先去尝试获取代理类:UserServiceImpl service = AopContext.currentProxy() != null ? (UserService)AopContext.currentProxy() : this;

2.去除AOP切面增强,把切面方法单独封装接口方法,在需要的地方调用

 

spring aop无法拦截类内部的方法调用

标签:解决方案   aop切面   str   事务   pos   ice   问题   注解   top   

原文地址:https://www.cnblogs.com/dennyzhangdd/p/9242148.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!