spring在ioc容器中获取aop的受理对象
"spring在ioc容器中获取aop的受理对象",这句话是什么意思呢?有时候我们会在spring项目中对一下类进行代理,比如我们会用spring的aop和自定义注解对一些接口访问添加日志,再比如对service层添加事物。这些操作spring都会自动帮我们生成代理对象。当我们需要在spring容器启动后获取ioc容器中的对象时,这个时候获取的确实代理对象了。已经不是我们的原生对象了。这时再去获取对象的类型,以及该类型的属性,方法等获取的都是代理对象的属性和方法。那么如何获取受理(不是代理)对象呢?使用下面的一个工具类即可。
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;
}
}
调用getTarget
方法传入代理对象,即可获得受理对象。
评论区
请写下您的评论...
猜你喜欢
工具
4206
一个工具类即可packagecom.dzqc.yx.util;importorg.springframework.beans.BeansException;importorg.springframework.context.ApplicationContext;importorg.springframework.context.ApplicationContextAware;importorg.s
spring/springmvc
2151
WebApplicationContextwebApplicationContext=ContextLoader.getCurrentWebApplicationContext();ServletContextcontext=webApplicationContext.getServletContext();
blog
springboot常用(或不常用)注解
spring/springmvc
1543
(A.class):加此注解的bean会在A加载之后加载 @ConditionalOnMissingBean(A.class):当ioc容器中含有A类型的对象时,那么ioc则会忽略@Component注解,
ofc
什么是BeanFactory
official
772
BeanFactory是一种“Spring容器”,BeanFactory翻译过来就是Bean工厂,顾名思义,它可以用来创建Bean、获取Bean,BeanFactory是Spring中非常核心的
框架
1632
最近在项目中遇到了一个批量导入excel的功能,excel导入用到的是esaypoi,可以轻松将excel中的数据封装成对象,但是不知为何,突然转换对象的过程变得很慢,一万条数据得转换一分钟。无奈只
框架
1962
springboot获取项目中所有对外提供的接口信息@ComponentpublicclassTestimplementsApplicationRunner
official
2837
BeanPostProcessor是SpringIOC容器给我们提供的一个扩展接口。,他的作用主要是如果我们需要在Spring容器完成Bean的实例化、配置和其他的初始化前后添加一些自己的逻辑处
java虚拟机(jvm)
2463
这里以HotSpot为例,且所说的对象指普通的Java对象,不包括数组和Class对象等。参考资料深入理解java虚拟机《周志明》1.对象的内存布局HotSpot虚拟机中,对象在内存中存储的布局可以
最新发表
归档
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
5
2020-12
3
2021-01
1
2021-02
5
2021-03
7
2021-04
4
2021-05
4
2021-06
1
2021-07
7
2021-08
2
2021-09
8
2021-10
9
2021-11
16
2021-12
14
2022-01
7
2022-05
1
2022-08
3
2022-09
2
2022-10
2
2022-12
5
2023-01
3
2023-02
1
2023-03
4
2023-04
2
2023-06
3
2023-07
4
2023-08
1
2023-10
1
2024-02
1
2024-03
1
2024-04
1
2024-08
1
标签
算法基础
linux
前端
c++
数据结构
框架
数据库
计算机基础
储备知识
java基础
ASM
其他
深入理解java虚拟机
nginx
git
消息中间件
搜索
maven
redis
docker
dubbo
vue
导入导出
软件使用
idea插件
协议
无聊的知识
jenkins
springboot
mqtt协议
keepalived
minio
mysql
ensp
网络基础
xxl-job
rabbitmq
haproxy
srs
音视频
webrtc
javascript
加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。