【问题标题】:Using proxy-target-class="true" with Spring beans将 proxy-target-class="true" 与 Spring bean 一起使用
【发布时间】:2020-06-06 05:22:34
【问题描述】:

我正在使用 Jersey Rest 并希望 Jersey 过滤器能够访问一些 spring bean。

但是,正如我从其他线程中发现的那样,如果它们是 Java 代理而不是生成的 Java 代理,Jersey 不会获得 Spring bean。我想添加proxy-target-class="true"

这样做有什么影响,也可以只在单个 bean 上设置还是需要在所有引用的 bean 上设置?

【问题讨论】:

    标签: spring jersey


    【解决方案1】:

    通过设置proxy-target-class="true",您将使用CGLIB2 作为代理,而不是jdk 代理。

    含义如下,如documentation 中所述:

    • 无法建议最终方法,因为它们无法被覆盖。

    • 您的类路径中需要 CGLIB 2 二进制文件,而动态代理可用于 JDK。春天会自动 当它需要 CGLIB 并且 CGLIB 库类不是时会发出警告 在类路径中找到。

    • 代理对象的构造函数将被调用两次。这是 CGLIB 代理模型的自然结果,其中子类 为每个代理对象生成。对于每个代理实例,两个 创建对象:实际的代理对象和 实现建议的子类。没有表现出这种行为 使用 JDK 代理时。通常,调用 代理类型两次,这不是问题,因为通常只有 分配发生,没有真正的逻辑被实现 构造函数。

    此外,您应该能够使用

    为特定组件创建“目标代理”
    proxyMode=ScopedProxyMode.TARGET_CLASS
    

    【讨论】:

    • 请注意,为单例 bean 创建 aop 范围的代理是错误的。
    • 这是一个例子。编辑以避免混淆。
    • 但我究竟如何在 bean 上设置它?例如 这将无法抱怨代理目标引用的出现
    • 我还需要在所有引用的 bean 上设置它吗?
    • @NavdeepSingh 错误消息很清楚:不能子类化最终类类 com.mchange.v2.c3p0.ComboPooledDataSource。该类是最终类,最终类不能子类化。
    【解决方案2】:

    尽管控制器正式实现了一个接口(SpringBoot 1.2.3.RELEASE 和 Spring 4.1.6.RELEASE),但强制使用 CGLib-Proxy:

    @Controller
    @Scope( proxyMode = ScopedProxyMode.TARGET_CLASS )
    public class ServiceImpl implements ServiceIntf
    { .... }
    

    这会启用有效且有效的@RequestMapping 和@Transactional 注释

    【讨论】:

      【解决方案3】:

      在 Java Spring Config 类中使用如下注解:

      @EnableAspectJAutoProxy(proxyTargetClass = true)

      【讨论】:

      • 不起作用:通过调试我可以看到它总是 jdkProxy
      猜你喜欢
      • 1970-01-01
      • 2014-11-26
      • 2016-01-29
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 2011-01-09
      相关资源
      最近更新 更多