spring aop获取被代理对象工具类

硅谷探秘者 2225 0 0

标题是什么意思呢?

比如现在有一个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 1410 "spring在ioc容器中aop的受",这句话是什么意思呢?有时候我们会在spring项目中一下进行,比如我们会用springaop和自定义注解一些接口访问添加日志,再比如
工具 3988 一个即可packagecom.dzqc.yx.util;importorg.springframework.beans.BeansException
spring/springmvc 1933 WebApplicationContextwebApplicationContext=ContextLoader.getCurrentWebApplicationContext();ServletContextcontext=webApplicationContext.getServletContext();
spring/springmvc 1616 Bean的别名只能维持一个实例,而不是每次都产生一个新的使用Singleton模式产生单一实例,在spring中,singleton属性默认是true,只有设定为false,则每次指定别名得的Be
spring/springmvc 2659 目接着就开始配置spring,springmvc,mybatis等1.首先目录结构如下因为上次没有在model-web模块中添加model-common的依赖,所以这次我们在model-web的pom
框架 3704 springaop实现操作日志记录此次的目的是实现controller中的方法执行情况进行记录,记录的有方法执行时间,操作人,请求的路径,方法的入参,模块,功能等。并实现利用注解的方式实现操作
official 2434   BeanPostProcessor是SpringIOC容器给我们提供的一个扩展接口。,他的作用主要是如果我们需要在Spring容器完成Bean的实例化、配置和其他的初始化前后添加一些自己的逻辑处
算法基础 1001 参考:https://segmentfault.com/a/1190000013341344事务传播行为型说明PROPAGATION_REQUIRED如果当前没有事务,就新建一个事务,如果已经存在
归档
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
标签
算法基础 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
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。