【发布时间】:2020-06-06 05:22:34
【问题描述】:
我正在使用 Jersey Rest 并希望 Jersey 过滤器能够访问一些 spring bean。
但是,正如我从其他线程中发现的那样,如果它们是 Java 代理而不是生成的 Java 代理,Jersey 不会获得 Spring bean。我想添加proxy-target-class="true"
这样做有什么影响,也可以只在单个 bean 上设置还是需要在所有引用的 bean 上设置?
【问题讨论】:
我正在使用 Jersey Rest 并希望 Jersey 过滤器能够访问一些 spring bean。
但是,正如我从其他线程中发现的那样,如果它们是 Java 代理而不是生成的 Java 代理,Jersey 不会获得 Spring bean。我想添加proxy-target-class="true"
这样做有什么影响,也可以只在单个 bean 上设置还是需要在所有引用的 bean 上设置?
【问题讨论】:
通过设置proxy-target-class="true",您将使用CGLIB2 作为代理,而不是jdk 代理。
含义如下,如documentation 中所述:
无法建议最终方法,因为它们无法被覆盖。
您的类路径中需要 CGLIB 2 二进制文件,而动态代理可用于 JDK。春天会自动 当它需要 CGLIB 并且 CGLIB 库类不是时会发出警告 在类路径中找到。
代理对象的构造函数将被调用两次。这是 CGLIB 代理模型的自然结果,其中子类 为每个代理对象生成。对于每个代理实例,两个 创建对象:实际的代理对象和 实现建议的子类。没有表现出这种行为 使用 JDK 代理时。通常,调用 代理类型两次,这不是问题,因为通常只有 分配发生,没有真正的逻辑被实现 构造函数。
此外,您应该能够使用
为特定组件创建“目标代理”proxyMode=ScopedProxyMode.TARGET_CLASS
【讨论】:
尽管控制器正式实现了一个接口(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 注释
【讨论】:
在 Java Spring Config 类中使用如下注解:
@EnableAspectJAutoProxy(proxyTargetClass = true)
【讨论】: