春天范围的代理bean


98

有人可以解释spring @ScopedProxy注释的用法吗?我以为这与会话范围的Bean有关,但是我不太确定是什么。

在作用域的使用中,我使用了没有@ScopedProxy注解(或没有aop作用域代理)的会话作用域bean ,所以我真的确定如何正确使用它。


查看bean文档。会话是作用域之一,但不是唯一的作用域
2013年

1
@Gus,我知道范围,只是不确定范围代理是如何发挥作用的
Jeff Storey 2013年

1
我认为第3.4.4.5节很好地解释了范围代理的作用。-两个示例之间的联系很重要。
2013年

2
是的,可以解释,谢谢。如果您想为问题添加答案,我会接受。
杰夫·斯托里

Answers:


248

spring文档的3.4.4.5节对此进行了很好的解释:

(请注意,以下“ userPreferences” Bean定义不完整):

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>

<bean id="userManager" class="com.foo.UserManager">
    <property name="userPreferences" ref="userPreferences"/>
</bean>

从以上配置中可以明显看出,单例bean'userManager'是通过对HTTP会话作用域bean'userPreferences'的引用注入的。这里的重点是'userManager'bean是单例的 …… 每个容器将被实例化一次并且它的依赖项(在这种情况下,只有一个'userPreferences'bean)也将被注入(一次! )

这意味着“(概念上)”“ userManager”将仅对完全相同的“ userPreferences”对象进行操作,即最初注入该对象的对象。

当您将HTTP会话范围的bean作为依赖项(通常)注入协作对象时,这不是您想要的。相反,我们想要的是每个容器一个单独的“ userManager”对象,然后,在HTTP会话的整个生命周期中,我们希望查看和使用特定于所述HTTP会话的“ userPreferences”对象

然后,您需要注入某种对象,该对象公开与UserPreferences类完全相同的公共接口(理想情况下是一个UserPreferences实例的对象),并且足够聪明,可以启动并获取实际的UserPreferences对象从我们选择的任何基本范围界定机制(HTTP请求,会话等)中选择。然后,我们可以将该代理对象安全地注入到'userManager'bean中,这将很高兴地不会意识到它所持有的UserPreferences引用是一个proxy

在我们的案例中,当UserManager实例在依赖项注入的UserPreferences对象上调用方法时,它将实际上在代理上调用方法 ...然后,代理将关闭并从中获取真实的UserPreferences对象(在这种情况下) HTTP会话,并将方法调用委托到检索到的真实UserPreferences对象上。

这就是为什么在将请求范围,会话范围和globalSession作用域的Bean注入协作对象时需要以下正确且完整的配置的原因:

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session">
    <aop:scoped-proxy/>
</bean>

<bean id="userManager" class="com.foo.UserManager">
    <property name="userPreferences" ref="userPreferences"/>
</bean>

因此,当我使用@ScopedProxy批注时,将自动使用Proxy,仅此而已?ScopedProxy的意思是->不要按原样使用此类,而是使用Proxy?
Koray Tugay 2015年

3
我正在使用spring-web:4.3.3,看起来注解@ScopedProxy已替换为@RequestScope和其他。您可以在此处找到示例:logicbig.com/tutorials/spring-framework/spring-core/…–
adebasi

1
我们可以说使用符号时@Scope(value="session", proxyMode = ScopedProxyMode.TARGET_CLASS),SpringMVC不使用WebApplicationContext进行自动装配,而是使用CGLIB创建代理?举例这里其他的解释
酷拉皮卡

0

在尝试了这里指定的各种不同选项和spring文档之后,由于某种原因,我弄清楚了Spring MVC在使用@Controller注释并且在webapp中有多个这样的控制器时会自动装配控制器。将注释修改为@RestController(value =“ UniqueControllerv1”),此问题已解决。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.