当前位置: 首页 > 面试题库 >

春天范围的代理bean

麹耘豪
2023-03-14
问题内容

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

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


问题答案:

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>


 类似资料:
  • 问题内容: 假设两个类为ClassA和ClassB。假设ClassB依赖于ClassA。在配置文件中,如果将ClassA的范围定义为单例,将ClassB的范围定义为Prototype,那么每次创建ClassA的bean实例时,ClassB的实例会发生什么?每次返回ClassA实例时,将返回相同的ClassB实例还是创建新实例? 谢谢!!! 问题答案: 如果ClassB是原型,则始终创建ClassB

  • 问题内容: 我想运行一个查询 并返回如下数据: 问题答案: 此解决方案不使用 循环,过程或临时表 。子查询会生成最近10,000天的日期,并且可以扩展为任意向前或向后的日期。 输出: 性能说明 在这里对其进行测试,其性能令人惊讶地良好: 上面的查询花费了0.0009秒。 如果我们扩展子查询以生成近似值。100,000个数字(因此约有274年的日期),运行时间为0.0458秒。 顺便说一句,这是一种

  • 有一个非常常见且简单的任务是在两个方向上通过某个范围进行循环迭代: 上面的代码运行完美,但我花了大约一个小时试图摆脱双重检查。 有没有办法解决如果没有如果?也许是一句话?

  • 问题内容: 我想运行一个查询 并返回如下数据: 问题答案: 此解决方案不使用 循环,过程或临时表 。子查询会生成最近10,000天的日期,并且可以扩展为任意向前或向后的日期。 输出: 性能说明 在这里对其进行测试,其性能出奇地好: 上面的查询花费了0.0009秒。 如果我们扩展子查询以生成近似值。100,000个数字(因此约有274年的日期),运行时间为0.0458秒。 顺便说一句,这是一种非常可

  • 我们知道Spring框架提供了单例、原型、请求、会话、全局会话bean范围。 我们还知道Spring Web流提供了flow Scope、viewScope、Request estScope、flash Scope、versationScope。 因此,如果我在spring MVC项目中提到一个组件,比如说Student,作为@Component@Scope=singleton。对于每个请求,它会

  • 我得到的错误是: 我检查的内容: > 已启用批注处理,否则AnyService根本不会实例化 AnyBean不是最终的 请求作用域在AnyBean中与AspectJ代理(ScopedProxyMode.target_class)一起定义 存在EnableAspectJAutoproxy批注 类路径上有以下JAR: Web XML还包含RequestContextListener: 当我向org.s