java - 从 spring 检索代理实例

标签 java spring proxy

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

相关文章:

java - 在具有可接受/惯用的静态初始值设定项的类中使用空静态方法吗?

java - 我如何在 jmx 记录器 LogConsole 中使用过滤器表达式?

java - 如何拦截java中的方法

java - Spring Injection - 线程安全

java - 你能在java中一次使用多个代理吗?

java - JPA:即使使用了 getter 方法,延迟加载也不会加载。希望如此?

proxy - 如何在 JMeter 中使用多个代理

java - 如何禁止使用带有某些注释的类

java - Maven-surefire-plugin 与 junit-platform-surefire-provider for Java 9 模块

java - 如何在Spring Security中配置内存身份验证和jdbc身份验证