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

硅谷探秘者 1053 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 642 "spring在ioc容器中aop的受",这句话是什么意思呢?有时候我们会在spring项目中一下进行,比如我们会用springaop和自定义注解一些接口访问添加日志,再比如
工具 3071 一个即可packagecom.dzqc.yx.util;importorg.springframework.beans.BeansException
spring/springmvc 1314 WebApplicationContextwebApplicationContext=ContextLoader.getCurrentWebApplicationContext();ServletContextcontext=webApplicationContext.getServletContext();
spring/springmvc 976 Bean的别名只能维持一个实例,而不是每次都产生一个新的使用Singleton模式产生单一实例,在spring中,singleton属性默认是true,只有设定为false,则每次指定别名得的Be
spring/springmvc 1929 目接着就开始配置spring,springmvc,mybatis等1.首先目录结构如下因为上次没有在model-web模块中添加model-common的依赖,所以这次我们在model-web的pom
框架 2813 springaop实现操作日志记录此次的目的是实现controller中的方法执行情况进行记录,记录的有方法执行时间,操作人,请求的路径,方法的入参,模块,功能等。并实现利用注解的方式实现操作
official 405   BeanPostProcessor是SpringIOC容器给我们提供的一个扩展接口。,他的作用主要是如果我们需要在Spring容器完成Bean的实例化、配置和其他的初始化前后添加一些自己的逻辑处
算法基础 501 参考: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月  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio
目录
祝愿神州十三飞行乘组平安归来