27

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

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

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

4

3 回答 3

40

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

如文档中所述,含义如下:

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

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

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

此外,您应该能够通过使用为特定组件制作“目标代理”

proxyMode=ScopedProxyMode.TARGET_CLASS
于 2013-03-22T10:49:29.773 回答
22

尽管控制器正式实现了接口(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 注释

于 2015-08-06T13:10:38.120 回答
5

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

@EnableAspectJAutoProxy(proxyTargetClass = true)

于 2017-05-27T13:11:54.267 回答