我感兴趣的是从 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/