怎么获取spring的非代理对象

worktile 其他 84

回复

共3条回复 我来回复
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Spring的非代理对象可以通过以下几种方法获得:

    1. 使用getBean()方法获取非代理对象。在Spring容器中,使用getBean()方法可以获取指定名称的Bean对象。默认情况下,getBean()方法返回的是Bean对象的代理对象(如果有的话)。如果要获取非代理对象,可以使用以下代码:
    MyBean myBean = (MyBean) applicationContext.getBean("myBean");
    

    这样就可以获取到非代理对象了。需要注意的是,这种方法只适用于那些没有使用AOP进行切面处理的Bean对象。

    1. 使用AopProxyUtils.ultimateTargetClass()方法获取非代理对象。如果Bean对象通过AOP进行了切面处理,那么直接使用getBean()方法获取的对象仍然是代理对象。可以使用AopProxyUtils.ultimateTargetClass()方法来获取非代理对象。示例如下:
    MyBean myBean = (MyBean) AopProxyUtils.ultimateTargetClass(applicationContext.getBean("myBean"));
    

    这种方法适用于使用了AOP进行切面处理的Bean对象。

    1. 使用@Autowire注解获取非代理对象。在使用Spring的依赖注入功能时,可以直接使用@Autowire注解进行注入,并且可以指定依赖对象的类型。示例如下:
    @Autowired
    private MyBean myBean;
    

    这样就可以直接获取到非代理对象了。

    总结起来,获取Spring的非代理对象的方法有:使用getBean()方法、使用AopProxyUtils.ultimateTargetClass()方法和使用@Autowire注解。根据具体情况选择合适的方法进行使用即可。

    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    要获取Spring的非代理对象,可以按照以下步骤进行操作:

    1. 确定目标对象是否被代理:首先要确定目标对象是否被Spring代理了,Spring框架有两种代理方式,一种是基于JDK的动态代理,另一种是基于CGLIB的代理。如果目标对象被代理了,那么获取非代理对象的方式有所不同。

    2. 使用AopProxyUtils.ultimateTargetClass()方法获取最终目标类:如果目标对象是被基于JDK的动态代理方式代理的,可以使用Spring框架提供的AopProxyUtils.ultimateTargetClass()方法来获取最终的目标类。该方法会递归地解析代理对象,直到获取到最终的目标类。代码示例如下:

    Object target = AopProxyUtils.ultimateTargetClass(proxy);
    
    1. 使用CGLIB的Enhancer类获取目标类:如果目标对象是被基于CGLIB的代理方式代理的,可以使用CGLIB库中的Enhancer类来获取目标类。Enhancer类是CGLIB库的核心类,可以用来生成代理类和获取目标类。代码示例如下:
    Object target = Enhancer.create(proxy.getClass()).getCallback(0);
    
    1. 使用ProxyTargetClassUtils.isProxyTargetClass()方法判断是否为目标类:在获取到目标类后,可以使用Spring框架提供的ProxyTargetClassUtils.isProxyTargetClass()方法来判断获取到的类是否为目标类。该方法会判断类是否为CGLIB生成的代理类。代码示例如下:
    boolean isTargetClass = ProxyTargetClassUtils.isProxyTargetClass(target.getClass());
    
    1. 使用ClassUtils.isCglibProxyClass()方法判断是否为CGLIB代理类:如果无法使用上述方法来判断是否为CGLIB代理类,可以使用Spring框架提供的ClassUtils.isCglibProxyClass()方法来进行判断。该方法会判断类是否为CGLIB生成的代理类。代码示例如下:
    boolean isCglibProxyClass = ClassUtils.isCglibProxyClass(target.getClass());
    

    需要注意的是,以上方法仅适用于Spring框架代理对象的获取,对于其他代理方式生成的代理对象可能无法使用以上方法获取非代理对象。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    获取Spring的非代理对象可以通过以下方法来实现:

    1. 使用AOP工具类来获取非代理对象:
      Spring AOP默认使用代理对象进行切面操作,因此如果想要获取非代理对象,可以使用AopProxyUtils.ultimateTargetClass()方法来获取真正的目标对象。该方法会递归地获取最终的非代理对象。示例代码如下:
    import org.springframework.aop.framework.AopProxyUtils;
    
    Object target = AopProxyUtils.ultimateTargetClass(proxy);
    
    1. 使用AdvisorChainFactory类获取非代理对象:
      Spring提供了AdvisorChainFactory类来获取非代理对象。该类可以获取代理链中的所有Advisor,然后再获取目标对象。示例代码如下:
    import org.springframework.aop.framework.Advised;
    import org.springframework.aop.framework.AopProxyUtils;
    
    public Object getTarget(Object proxy) {
        if (AopProxyUtils.isJdkDynamicProxy(proxy)) {
            return getJdkDynamicProxyTargetObject(proxy);
        } else {
            return getCglibProxyTargetObject(proxy);
        }
    }
    
    private Object getJdkDynamicProxyTargetObject(Object proxy) {
        try {
            return ((Advised) proxy).getTargetSource().getTarget();
        } catch (Exception e) {
            throw new RuntimeException("Failed to get target object from JDK dynamic proxy.", e);
        }
    }
    
    private Object getCglibProxyTargetObject(Object proxy) {
        try {
            Class<?> proxyClass = proxy.getClass();
            Field hField = proxyClass.getSuperclass().getDeclaredField("CGLIB$CALLBACK_0");
            hField.setAccessible(true);
            Object dynamicAdvisedInterceptor = hField.get(proxy);
            Field advisedField = dynamicAdvisedInterceptor.getClass().getDeclaredField("advised");
            advisedField.setAccessible(true);
            return ((AdvisedSupport) advisedField.get(dynamicAdvisedInterceptor)).getTargetSource().getTarget();
        } catch (Exception e) {
            throw new RuntimeException("Failed to get target object from CGLIB proxy.", e);
        }
    }
    
    1. 使用ClassUtils类获取非代理对象:
      Spring提供了ClassUtils类,可以使用它的getUserClass()方法来获取非代理对象。该方法会返回给定对象的实际类,而不是代理类。示例代码如下:
    import org.springframework.util.ClassUtils;
    
    Object target = ClassUtils.getUserClass(proxy);
    

    以上就是获取Spring的非代理对象的几种方法,可以根据实际情况选择合适的方法来获取非代理对象。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部