【问题标题】:CGLib based proxy is created though class implements interface尽管类实现了接口,但创建了基于 CGLib 的代理
【发布时间】:2015-10-13 10:05:46
【问题描述】:

我的印象是,每当一个类实现一个接口时,就会创建基于 JDK 的代理。

我有一个 bean,它实现了一个带有 prototype scope 的接口,它被注入到一个具有 singleton 范围的 bean 中。我尝试使用 proxyMode = ScopedProxyMode.INTERFACES 创建了 JDK 代理,这是正确的,但是当我厌倦了 proxyMode = ScopedProxyMode.TARGET_CLASS 时,即使我的 bean 实现了一个接口,也会创建基于 CGLIB 的代理。

什么时候发生

proxyMode = ScopedProxyMode.TARGET_CLASS

proxyMode = ScopedProxyMode.INTERFACES

它们之间有什么区别?什么时候用哪个?

我还有一个问题是将原型 bean 注入单例 bean 的正确方法是什么?

【问题讨论】:

  • 您告诉框架要做的就是始终创建基于类的代理,从而创建基于 cglib 的代理。

标签: java spring proxy


【解决方案1】:

一般来说,在原型作用域 bean 被注入到单例作用域 bean 的场景中,不需要代理。

reference documentation 声明:

您不需要将 <aop:scoped-proxy/> 与范围为单例或原型的 bean 结合使用。

没有代理会怎样?

当创建 Spring 上下文并实例化单例 bean 时,会创建原型 bean 的新实例并将其注入到单例中。现在,我们单例的每个调用都使用原型的相同实例。

为什么需要代理?

也许您想更改默认行为并为单例 bean 的每次调用创建一个新的原型 bean 实例。使用代理,单例 bean 将为所有调用保留相同的代理实例。每次调用时,代理都会从 Spring 上下文中获取一个新的原型 bean 实例。

代理模式

代理模式是自描述的。见ScopeProxyModeJavadoc:

  • ScopeProxyMode.INTERFACES - 创建一个 JDK 动态代理,实现目标对象的类公开的所有接口。
  • ScopeProxyMode.TARGET_CLASS - 创建基于类的代理(使用 CGLIB)。

单例 bean 是否依赖于原型 bean 实现的接口?使用ScopeProxyMode.INTERFACES。否则,请使用ScopeProxyMode.TARGET_CLASS

method injection 将是获得与代理相同行为的替代方法。

【讨论】:

  • 你觉得这个答案有帮助吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 2012-01-18
  • 1970-01-01
  • 2012-08-31
相关资源
最近更新 更多