当前位置: 首页 > 知识库问答 >
问题:

scoped proxy在Spring中如何在内部工作

居琛
2023-03-14

考虑这样一种情况:将原型范围的bean注入到单例范围的bean中,

当我们尝试使用单例范围的bean访问原型范围的bean时,每次返回的都是相同的bean,即在单例初始化时注入的bean。

如果我们希望每次使用作用域代理时获得不同的实例。

我不知道这个作用域代理是如何在stage后面工作的,以及它是如何神奇地给我们提供一个新实例的,即使bean存在于单例中。

共有1个答案

方韬
2023-03-14

在Spring文档中:

能够定义一个范围为HTTP请求或会话的bean(或者您自己设计的自定义范围)是非常好的,但是Spring IoC容器的主要增值之一是它不仅管理对象(bean)的实例化,而且还管理协作者(或依赖项)的连接。如果您想将一个(例如)HTTP请求作用域bean注入到另一个bean中,您将需要注入一个AOP代理来代替作用域bean。也就是说,您需要注入一个代理对象,该代理对象公开与作用域对象相同的公共接口,但该代理对象足够聪明,能够从相关作用域(例如HTTP请求)检索真实的目标对象,并将方法调用委托到真实对象上。

要创建这样的代理,您只需要将子元素插入到作用域bean定义中(您可能还需要类路径上的CGLIB库,以便容器可以实现基于类的代理;您还需要使用附录a,基于XML模式的配置)。那么,为什么在请求、会话、全局会话和“在这里插入自定义范围”级别的bean定义中需要这个元素呢?找出以下bean定义(请注意,下面的“用户首选项”bean定义是不完整的)可以最好地解释其原因:

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

<bean id="userManager" class="com.foo.UserManager">
  <property name="userPreferences" ref="userPreferences"/>
</bean>
 类似资料:
  • 问题内容: 我正在阅读有关Java中并发性的Oracle官方文档,但我想知道返回的返回值之间可能有什么区别? 并使用例如 。我假设我用一个。我知道,一般而言,同步集合对于我来说只是一个装饰器,因此很明显a 的内部结构有所不同。您是否有关于这些实施细节的信息? 编辑:我意识到源代码是公开可用的: ConcurrentHashMap.java 问题答案: 我会阅读ConcurrentHashMap的源

  • 问题内容: 我正在使用Eclipse服务器功能进行热代码部署。使用tomcat作为Web服务器。但是我不确定它是如何工作的。我有自己的理解,它必须如何在内部工作。 我的理解:- 当开发人员更改代码(例如,类Employee)时,Eclipse将在正确的位置(必须是特定的Web /应用服务器,将其称为热部署目录(HDD))放置/发布修改后的已编译类。 。现在将显示Web服务器特定的类加载器。它在HD

  • 问题内容: 该功能在内部如何工作?考虑到内核确实具有访问用户内存空间的特权,它是否使用任何缓冲区还是完成了任何内存映射? 问题答案: 的实现高度依赖于体系结构。 在x86和x86-64上,它只是直接从用户空间地址进行读取并写入内核空间地址,同时如果已配置,则暂时禁用SMAP(超级用户模式访问阻止)。它的棘手部分是将代码放置在特殊区域中,以便页面错误处理程序可以识别其中何时发生错误。发生的内存保护错

  • 异常处理就是这样工作的吗?

  • 问题内容: “现代” 守护程序如何在 内部 安排作业?有些人经常通过来安排一次跑步。因此,在写出crontab之后,会执行以下操作: 解析crontab以了解所有将来的事件,并hibernate间隔时间? 每分钟轮询一次汇总的crontab数据库,以确定当前时间是否与计划模式匹配? 其他? 谢谢, 问题答案: 在这个问题上听到了几声。不错的RTFC,其中包含一些离散事件模拟论文和Wikipedia

  • 将如何在内部工作以将请求映射到方法?