Jef*_*rey 96 java proxy spring
有人可以解释一下spring @ScopedProxy注释的用法吗?我认为它与会话范围的bean有关,但我不太确定是什么.
在我使用范围时,我使用了没有@ScopedProxy注释的会话范围bean (或没有aop范围的代理),所以我真的很确定如何正确使用它.
Gus*_*Gus 241
春季文档的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>
Run Code Online (Sandbox Code Playgroud)
从上面的配置可以看出,单例bean'userManager'被注入了对HTTP Session-scoped bean'userPreferences'的引用.这里的重点是'userManager'bean是一个单独的 ...它将在每个容器中实例化一次,并且它的依赖关系(在这种情况下只有一个,'userPreferences'bean)也将被注入(一次! ).
这意味着'userManager'将(在概念上)仅对完全相同的'userPreferences'对象进行操作,即最初注入的对象.
当您将HTTP会话范围的bean作为依赖项注入协作对象(通常)时,这不是您想要的.相反,我们想要的是每个容器的单个"userManager"对象,然后,在HTTP会话的生命周期中,我们希望查看并使用特定于所述HTTP会话的"userPreferences"对象.
而你需要的是注入某种类型的对象,它暴露与UserPreferences类完全相同的公共接口(理想情况下是一个UserPreferences实例的对象),并且足够聪明,可以关闭并获取真正的UserPreferences对象从我们选择的任何基础范围机制(HTTP请求,会话等).然后我们可以安全地将这个代理对象注入到'userManager'bean中,该bean很幸运地没有意识到它所持有的UserPreferences引用是一个代理.
在我们的例子中,当一个UserManager实例在依赖注入的UserPreferences对象上调用一个方法时,它实际上将在代理上调用一个方法 ......然后代理将关闭并从中获取真正的UserPreferences对象(在这种情况下) HTTP会话,并将方法调用委托给检索到的真实UserPreferences对象.
这就是为什么在将request-,session-和globalSession-scoped 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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
56437 次 |
| 最近记录: |