春天范围的代理bean

春天范围的代理bean,第1张

春天范围的代理bean

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

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

<bean id="userPreferences"  scope="session"/><bean id="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"  scope="session">    <aop:scoped-proxy/></bean><bean id="userManager" >    <property name="userPreferences" ref="userPreferences"/></bean>


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5560502.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存