2015-10-13 79 views
0

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

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

proxyMode = ScopedProxyMode.TARGET_CLASS 

proxyMode = ScopedProxyMode.INTERFACES 

它们之间有什么区别,会发生什么?何时使用哪一个?

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

+0

这就是你告诉框架要做的是总是创建基于类的代理以及基于cglib的代理。 –

回答

2

通常,在原型范围的bean被注入到单例范围的bean中的场景中不需要代理。

reference documentation状态:

你并不需要结合与和作用域为singleton或prototype的bean使用<aop:scoped-proxy/>

没有代理发生了什么?

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

为什么你需要代理?

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

代理模式

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

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

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

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

+0

你觉得答案有帮助吗? –