spring aop获取被代理对象工具类
标题是什么意思呢?
比如现在有一个service类,通过@Service注解加入到ioc容器中,那么此时在程序运行中去ioc容器中获取这个service对象,获取的就是原滋原味的service。但是如果对这个service通过aop代理后(比如用到了事物等),再次在程序运行过程中获取这个service,那么获取的就是代理后的service,这时再去通过反射获取service的属性,方法等获取到的就是代理后的对象的属性或方法,就无法获取我们想要的数据。但是spring提供了一下接口,可以通过代理对象获取到被代理的对象。
import org.springframework.aop.framework.AdvisedSupport;
import org.springframework.aop.framework.AopProxy;
import org.springframework.aop.support.AopUtils;
import java.lang.reflect.Field;
/**
* @ClassName SpringAopTargetUtil
* @Description 在 spring aop 对容器中的对象代理以后 通过spring的接口获取的对象都是代理后的对象
* 该工具类能获取到被代理的对象
* @Author Jiajiajia
* @Date 2020/12/20 14:42
**/
public class SpringAopTargetUtil {
/**
* 获取被代理类的Object
*/
public static Object getTarget(Object proxy) throws Exception {
if(!AopUtils.isAopProxy(proxy)) {
/**
* 不是代理对象
*/
return proxy;
}
if(AopUtils.isJdkDynamicProxy(proxy)) {
/**
* jdk代理
*/
return getJdkDynamicProxyTargetObject(proxy);
} else {
/**
* cglib 代理
*/
return getCglibProxyTargetObject(proxy);
}
}
/**
* @MethodName: getCglibProxyTargetObject
* @Description: CGLIB方式被代理类的获取
* @Author: Jiajiajia
* @Params: * @param proxy
* @Return {@link Object}
* @date 2020/12/20
*/
private static Object getCglibProxyTargetObject(Object proxy) throws Exception {
Field h = proxy.getClass().getDeclaredField("CGLIB$CALLBACK_0");
h.setAccessible(true);
Object dynamicAdvisedInterceptor = h.get(proxy);
Field advised = dynamicAdvisedInterceptor.getClass().getDeclaredField("advised");
advised.setAccessible(true);
Object target = ((AdvisedSupport)advised.get(dynamicAdvisedInterceptor)).getTargetSource().getTarget();
return target;
}
/**
* @MethodName: getJdkDynamicProxyTargetObject
* @Description: JDK动态代理方式被代理类的获取
* @Author: Jiajiajia
* @Params: * @param proxy
* @Return {@link Object}
* @date 2020/12/20
*/
private static Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception {
Field h = proxy.getClass().getSuperclass().getDeclaredField("h");
h.setAccessible(true);
AopProxy aopProxy = (AopProxy) h.get(proxy);
Field advised = aopProxy.getClass().getDeclaredField("advised");
advised.setAccessible(true);
Object target = ((AdvisedSupport)advised.get(aopProxy)).getTargetSource().getTarget();
return target;
}
}
猜你喜欢
spring/springmvc
60
"spring在ioc容器中获取aop的受理对象",这句话是什么意思呢?有时候我们会在spring项目中对一下类进行代理,比如我们会用spring的aop和自定义注解对一些接口访问添加日志,再比如对
工具
1751
一个工具类即可packagecom.dzqc.yx.util;importorg.springframework.beans.BeansException
spring/springmvc
782
WebApplicationContextwebApplicationContext=ContextLoader.getCurrentWebApplicationContext();ServletContextcontext=webApplicationContext.getServletContext();
blog
spring的生命周期
spring/springmvc
508
Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Singleton模式产生单一实例,在spring中,singleton属性默认是true,只有设定为false,则每次指定别名取得的Be
spring/springmvc
1461
目接着就开始配置spring,springmvc,mybatis等1.首先目录结构如下因为上次没有在model-web模块中添加对model-common的依赖,所以这次我们在model-web的pom
blog
spring aop实现操作日志记录
框架
2242
springaop实现操作日志记录此次的目的是实现对controller中的方法执行情况进行记录,记录的有方法执行时间,操作人,请求的路径,方法的入参,模块,功能等。并实现利用注解的方式实现对被操作
工具
550
packagecom.yunzhi.exam.util;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpSession;importorg.springframework.web.context.request.RequestContextHolder;importorg.springframewor
spring/springmvc
2225
有时项目在初始化是会有一些配置类(bean)加入ioc容器,在项目加载完成后该bean就没有用了,可以从ioc容器中销毁。具体如下
最近发表
归档
2018年11月
12
2018年12月
33
2019年01月
28
2019年02月
28
2019年03月
32
2019年04月
27
2019年05月
33
2019年06月
6
2019年07月
12
2019年08月
12
2019年09月
21
2019年10月
8
2019年11月
15
2019年12月
25
2020年01月
9
2020年02月
5
2020年03月
16
2020年04月
4
2020年06月
1
2020年07月
7
2020年08月
13
2020年09月
9
2020年10月
4
标签
算法基础
linux
前端
c++
数据结构
框架
数据库
计算机基础
储备知识
java基础
ASM
其他
深入理解java虚拟机
nginx
git
undefined
undefined
sdf
sdf
dsdf
sdfasdfasd
sdf
ppp
sdf
fggdgsd
kkk
kkk
kkk
sdddf
456