有人可以解释spring @ScopedProxy
批注的用法吗?我以为这与 session 范围的Bean有关,但是我不太确定是什么。
在使用范围时,我使用了没有@ScopedProxy
批注(或没有aop范围的代理)的 session 范围的bean,因此我确实确定如何正确使用它。
最佳答案
spring文档的Section 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 session 作用域bean'userPreferences'的引用注入(inject)的。这里的重点是'userManager'bean是一个单例 ...它将每个实例化一次,每个容器,及其依赖关系(在这种情况下,只有一个,'userPreferences'bean)也只能被注入(inject)(一次!)。
这意味着“(概念上)”“userManager”将仅对完全相同的“userPreferences”对象进行操作,即最初注入(inject)该对象的对象。
当您将HTTP session 范围的bean作为依赖项(通常)注入(inject)协作对象时,这不是您想要的。相反,我们想要的是每个容器一个单独的'userManager'对象,然后在HTTP session 的整个生命周期中,我们想要查看和使用特定于上述HTTP session 的'userPreferences'对象。
然后,您需要注入(inject)某种对象,该对象公开与UserPreferences类完全相同的公共(public)接口(interface)(理想情况下是一个UserPreferences实例的对象),并且足够聪明,可以启动并获取真实的UserPreferences对象从我们选择的任何基本范围界定机制(HTTP请求, session 等)中选择。然后,我们可以将该代理对象安全地注入(inject)到'userManager'bean中,这将很高兴地不知道其持有的UserPreferences引用是代理。
在我们的例子中,,当UserManager实例在依赖项注入(inject)的UserPreferences对象上调用方法时,它实际上将在代理上调用方法...然后,代理将关闭并从(在此获取真正的UserPreferences对象HTTP session ),并将方法调用委托(delegate)给检索到的真实UserPreferences对象。
因此,在将请求范围, session 范围和globalSession范围的bean注入(inject)协作对象时,需要以下正确且完整的配置:
<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>