【发布时间】:2020-09-24 12:15:20
【问题描述】:
简而言之
在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)));
}
现在想检查一个 bean 类是否被代理而不在 BeanFactoryPostProcessor 中实例化 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 是会话范围的)。
【问题讨论】:
-
为什么
Classobject 会成为 Spring 代理?您的意思是 可以 类实例由 Spring 代理吗?您必须检查它们是否带有@Component注释,例如我猜。或者绑定到 Spring 内部以检测它将扫描哪些类。 -
@Kayaman 让我再试一次......我想弄清楚 Spring 是否会代理组件而不创建 bean 来检查它,只使用类对象。您链接到的问题需要一个实例化的 bean。
-
Class永远不会是 instanceof 或可分配给任何“有用”的东西。只有从中出来的 bean(或带有例如.newInstance()的非 bean)才会响应这些。所以你基本上只能访问元数据。 -
@Kayaman 你确定吗?因为我对你的评论想得更多,这对我来说听起来不对。
Class::isAssignableFrom检查,引用“如果此 Class 对象表示的类或接口与指定的 Class 参数表示的类或接口相同,或者是其超类或超接口”。所以如果 AopUtils 检查object instanceof SpringProxy,那么它的类应该满足这个检查,不是吗?
标签: java spring kotlin reflection spring-aop