从spring恢复代理实例

时间:2009-09-11 06:08:24

标签: java spring proxy

我有兴趣从春天开始代理课程,而不是代理。

即:

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 {
  ...
}

1 个答案:

答案 0 :(得分:1)

您是否因为ClassCastException而尝试获取代理bean?如果你可以施展到Bar,你会对此感到满意吗?

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

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

您可以强制Spring始终代理目标类,但是如何执行此操作取决于您创建Bar代理的方式,并且您没有告诉我们。

通常首选的解决方案是通过接口引用代理bean,一切运行良好。如果您的Bar类实现了接口,那么Foo可能不会引用该接口吗?