gpt4 book ai didi

java - 从 spring 检索代理实例

转载 作者:行者123 更新时间:2023-12-01 16:10:34 24 4
gpt4 key购买 nike

我感兴趣的是从 spring 代理类,而不是代理。

即:

public class FooImpl<KittyKat> {

@Transactional
public void doStuff() {
getBar();
// java.lang.ClassCastException: $Proxy26 cannot be cast to
// com.my.foo.Bar
}

}

public abstract class AbstractFoo<T extends AbstractBar> {

public String barBeanName;

protected T getBar() {
// java.lang.ClassCastException: $Proxy26 cannot be cast to
// com.my.foo.Bar
return (T)appContext.getBean(barBeanName);
}
}

public class KittyCat extends AbstractBar {
...
}

public abstract class AbstractBar {
...
}

最佳答案

您是否只是因为 ClassCastException 才尝试获取代理 bean?如果您可以转换到 Bar,您会满意吗?

当 Spring 创建代理时,它会检查 bean 类是否实现了任何接口(interface)。如果是这样,那么生成的代理也将实现这些接口(interface),但不会扩展目标 bean 的类。它使用标准的 java.lang.reflect.Proxy 来完成此操作。您的示例似乎就是这种情况。

如果目标bean的类没有实现任何接口(interface),那么Spring将使用CGLIB生成一个代理类,该代理类是目标bean的类的子类。这是代理非接口(interface) Bean 的权宜之计。

您可以强制 Spring 始终代理目标类,但具体操作方式取决于您最初创建 Bar 代理的方式,而您还没有告诉我们这一点。

通常首选的解决方案是通过代理 bean 的接口(interface)来引用它们,并且一切都运行良好。如果您的 Bar 类实现接口(interface),您的 Foo 是否可以不引用该接口(interface)?

关于java - 从 spring 检索代理实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1409231/

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