gpt4 book ai didi

java - 您如何确定CLASS是否是Spring代理?

转载 作者:行者123 更新时间:2023-12-02 12:49:39 24 4
gpt4 key购买 nike

简而言之
AopUtils中,我们有

    /**
* Check whether the given object is a JDK dynamic proxy or a CGLIB proxy.
* <p>This method additionally checks if the given object is an instance
* of {@link SpringProxy}.
* @param object the object to check
* @see #isJdkDynamicProxy
* @see #isCglibProxy
*/
public static boolean isAopProxy(@Nullable Object object) {
return (object instanceof SpringProxy && (Proxy.isProxyClass(object.getClass()) ||
object.getClass().getName().contains(ClassUtils.CGLIB_CLASS_SEPARATOR)));
}
现在,要检查是否在 BeanFactoryPostProcessor中实例化bean类(而不是实例化bean)的情况下是否代理了bean类。
我以为我可以“翻译”上面的方法:
    private fun <T> isAopProxyClass(candidate: Class<T>): Boolean {
return SpringProxy::class.java.isAssignableFrom(candidate)
&& (
Proxy.isProxyClass(candidate)
|| candidate.name.contains(CGLIB_CLASS_SEPARATOR)
)
}
但这不能检测到代理,因为即使对于明显的代理类, SpringProxy::class.java.isAssignableFrom(candidate)也是 false
我该如何工作?
全图
我在 BeanFactoryPostProcessor中,我需要未代理的bean类来通过反射访问某些带注释的方法。
访问发生在lambda函数中,该函数将首先使用 ApplicationContext检索该类的bean。不得在此 BeanFactoryPostProcessor中强制实例化该Bean(实际上,如果这样做,则应抛出异常,因为某些Bean是基于 session 范围的)。
screenshot of misbehaving code

最佳答案

有趣的问题。 😀
屏幕快照中突出显示的三个类是CGLIB代理,但不是 AOP代理。查看它们的类名称:它们都是Spring配置类。但这并不能使它们成为正常的Spring代理,尤其是AOP代理。有关@Component@Configuration之间的区别以及代理和自调用行为方面的区别,请阅读my answer here
因此,Spring @Configuration类也不会像普通的Spring代理那样实现SpringProxy
因此,据我所知,您的解决方案基本上可以正常工作,无需担心。
附注:我是Java人士,而不是Kotlin人。因此,我用Java屏幕快照重新实现了您的代码,因此我可以对其进行调试并重现您的情况。但是即使在Kotlin,我也不得不重新输入所有内容。请下次将代码发布为可复制的文本,而不仅仅是图像。

更新:如果您检查类似内容的内容

beanClasses.stream()
.filter(aClass ->
aClass.getName().contains(CGLIB_CLASS_SEPARATOR) &&
aClass.getSuperclass().getAnnotation(Configuration.class) == null
)
.collect(Collectors.toList())
您应该会看到一个空集合,而
beanClasses.stream()
.filter(aClass ->
aClass.getName().contains(CGLIB_CLASS_SEPARATOR) &&
aClass.getSuperclass().getAnnotation(Configuration.class) != null
)
.collect(Collectors.toList())
应该产生与简单相同的类列表
beanClasses.stream()
.filter(aClass -> aClass.getName().contains(CGLIB_CLASS_SEPARATOR))
.collect(Collectors.toList())
即实际上, beanClasses中所有其余的CGLIB代理应该是配置,而不是常规的Spring代理。

关于java - 您如何确定CLASS是否是Spring代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64026990/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com