我有兴趣从春天开始代理课程,而不是代理。
即:
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 {
...
}
答案 0 :(得分:1)
您是否因为ClassCastException
而尝试获取代理bean?如果你可以施展到Bar
,你会对此感到满意吗?
当Spring创建代理时,它会检查bean类是否实现了任何接口。如果是,那么生成的代理也将实现这些接口,但它不会扩展目标bean的类。它使用标准java.lang.reflect.Proxy
执行此操作。在您的示例中似乎就是这种情况。
如果目标bean的类没有实现任何接口,那么Spring将使用CGLIB生成一个代理类,它是目标bean类的子类。这是代理非接口bean的一种权宜之计。
您可以强制Spring始终代理目标类,但是如何执行此操作取决于您创建Bar
代理的方式,并且您没有告诉我们。
通常首选的解决方案是通过接口引用代理bean,一切运行良好。如果您的Bar类实现了接口,那么Foo
可能不会引用该接口吗?