Spring上下文动态变化

2024-04-04

我已经阅读了动态 bean 定义的更改。我在一个简单的代码示例中尝试了它(参见下面的代码),我发现它在我不想停止服务器但添加/更改 bean 定义的情况下非常有吸引力。

问题:


这样做安全吗(参见下面的代码)?

你必须定义safe.

The AbstractApplicationContext#refresh()方法 javadoc 声明

由于这是一个启动方法,它应该销毁已经创建的 如果失败,则使用单例,以避免悬空资源。换句话说, 调用该方法后,要么全部单例,要么根本没有单例 应该被实例化。

基本上,上下文中的每个 bean 都将被销毁,并且对它们的所有引用都将被删除,使它们成为垃圾收集的候选者。您需要确保这些 Bean 有适当的方法来释放它们可能拥有的任何资源。有不同的方法可以做到这一点 http://docs.spring.io/spring/docs/4.0.0.RELEASE/spring-framework-reference/html/beans.html#beans-factory-lifecycle-default-init-destroy-methods

  • 让你的班级实现DisposableBean界面。
  • Add a destroy-method归因于你的<bean> or @Bean定义。
  • 用注释方法@PreDestroy.

注意refresh()通常会急切地刷新您的ApplicationContext, IE。立即重新实例化所有 bean。发生这种情况时,您可能会注意到应用程序速度有所减慢。

我读到可以实现 bean 定义的更改 运行时的帮助StaticApplicationContext or BeanPostProcessor or BeanFactoryPostProcessor?那么区别是什么呢?

StaticApplicationContext其中一个ApplicationContext您自己注册 bean 定义的类。在您的示例中,bean 定义是从 XML 文件中解析并在幕后注册的。和StaticApplicationContext http://docs.spring.io/spring/docs/4.0.0.RELEASE/javadoc-api/org/springframework/context/support/StaticApplicationContext.html, 你用registerBeanDefinition(..) http://docs.spring.io/spring/docs/4.0.0.RELEASE/javadoc-api/org/springframework/context/support/GenericApplicationContext.html#registerBeanDefinition-java.lang.String-org.springframework.beans.factory.config.BeanDefinition-或其他registerXxx()显式注册 bean 定义的方法。

A BeanFactoryPostProcessor可以访问BeanFactory正在使用,因此所有已注册的 bean 定义。因此,您可以检索任何BeanDefinition你想要并修改它。作为javadocBeanFactoryPostProcess#postProcessBeanFactory(..) http://docs.spring.io/spring/docs/4.0.0.RELEASE/javadoc-api/org/springframework/beans/factory/config/BeanFactoryPostProcessor.html#postProcessBeanFactory-org.springframework.beans.factory.config.ConfigurableListableBeanFactory- states

所有 bean 定义都将被加载,但没有任何 bean 会被加载 尚未实例化。这允许覆盖或添加属性 甚至是急于初始化的bean。

您可以在之前更改 bean 定义ApplicationContext实际上使用它。

最后,一个BeanPostProcessor不改变 bean 定义。您可以使用BeanPostProcessor改变 bean 的创建方式,但底层BeanDefinition将保持不变。


对于您的编辑(比实际答案更大:))

据我了解 BeanPostProcess 允许您修改已经存在的 通过使用代理包装对象,在运行时生成 bean 实例。我是吗 正确的?

它不仅仅是用于代理,您可以对对象执行任何您想要的操作:修改其属性,在其他上下文中注册它,使其null等等。这围绕着 bean 定义进行。

AbstractApplicationContext#refresh()删除所有单例 bean 并 重新创建它们。

但是如果我想更改原型/自定义范围的定义 豆角,扁豆?如果我有两个 bean:A 和 B。A 引用了 B。如果我 更改 bean 定义,使其不包含 定义B.那么B的实例就会被销毁,但是新的实例 不会被创建。比 A 将获得空依赖项。我对吗?

In an ApplicationContext,您声明您的 bean 定义。如果您要更改 bean 定义,请在BeanFactoryPostProcessor或者在上下文配置中以不同方式声明它。

对于依赖项,如果您销毁Bbean 定义,不会有要注入的 beanASpring 会抱怨,抛出NoSuchBeanDefinitionException。 Bean注入永远不会注入null除非你明确告诉它。

StaticApplicationContext and BeanFactoryPostProcessor两者都允许我 在运行时更改 bean 定义。但有什么区别, 优点缺点?

两者的目的完全不同。StaticApplicationContext is an ApplicationContext执行。在这里,您声明 bean 定义。 ABeanFactoryPostProcessor用于根据您想要实现的任何条件以任何方式修改这些 bean 定义。

为什么Spring有3种机制来实现相同的目标。你能做一个 之间的简短比较(或用例示例)AbstractApplicationContext#refresh(), StaticApplicationContext and BeanFactoryPostProcessor please.

目标不一样。一个ApplicationContext不同于BeanFactoryPostProcessor并在上下文生命周期的不同时间发挥作用(请参阅上一个问题中的漂亮图表)。

我没有适合您的用例。了解上述各项的作用,当您遇到特定要求时,您就会知道何时应用它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring上下文动态变化 的相关文章

随机推荐

  • 如何测试载波文件是否更改?

    我正在尝试测试代码中的图像是否随载波更改 但我找不到方法来执行此操作 即使文件无效 对象似乎也被标记为已更改 因此它并未真正更改 查看以下输出 rdb 1 job translated xliff
  • Java:计算两点之间的角度(以度为单位)

    我需要计算我自己的 Point 类的两点之间的角度 以度为单位 点 a 应为中心点 Method public float getAngle Point target return float Math toDegrees Math ata
  • Django REST Framework 自定义字段验证

    我正在尝试为模型创建自定义验证 以检查其start date在其之前end date事实证明这几乎是不可能的 我尝试过的东西 内置 Django 验证器 没有对此进行检查 我自己写的 就像这样 def validate date self
  • 更新 flutter 和 Xcode 后,Xcode 14.3 中缺少文件“libarclite_iphoneos.a”

    我有 flutter 项目 我正在尝试运行 iOS 版本 但在将 flutter 和 Xcode 更新到最新版本后出现错误 我使用 firebase core 插件 error Could not build the precompiled
  • 爱国者导弹浮动指向误差

    从计算机系统 程序员的角度http csapp cs cmu edu http csapp cs cmu edu 练习题2 51 我们在问题 2 46 中看到 爱国者导弹软件近似为 0 1 因为 x 0 000110011001100110
  • Azure 相同的 FTP URL 适用于共享相同应用程序服务计划的所有 Azure 网站

    我为单一应用程序服务计划创建了几个 Web 应用程序 对于所有这些应用程序 我看到一个 FTP URL 问题是 当我转到 URL 时 我可以看到一个 Site wwwroot 文件夹 其中仅显示一个应用程序 不是可以访问其他Web应用程序的
  • 在 Python 或 MATLAB 中从等值线图的像素中提取数据

    我有一个这样的等高线图 Now 如果我没有生成等值线图的数据 而我拥有的只是图像 如何从图像中提取每个像素的值并将其存储在数组中 MATLAB Python 中的任何建议或示例都会有帮助 如果您知道像素值 请使用find 您可以找到您想要的
  • 文本修饰:外观和计算值之间的明显差异

    我在处理与以下内容相关的代码时注意到了这一点 奇怪 a div 周围的链接 div 内的样式 https stackoverflow com questions 13595357 alink around div styling insid
  • EC2 Ubuntu 14 默认密码

    我有一个EC2实例运行Ubuntu 14我经常使用它连接SSH 现在我尝试使用 Windows 中的远程桌面连接到此实例 如图所示here https askubuntu com questions 592537 can i access
  • ggplot2交错轴标签

    我正在制作一个ggplot x 轴是因子 标签很长 我无法缩短标签 它们已经尽可能短了 我有兴趣使标签垂直偏移 我的偏好是让每个奇数标签的高度为 0 每个偶数标签的高度距离 x 轴更远 2 个单位 我看过这里 ggplot 希望帮助 htt
  • Rails 4.0 安装错误 -require: 无法加载此类文件 -- active_support (LoadError)

    我安装了新的 Ruby 2 0 和 Rails 4 0 当我执行 Rails new test app 时 我得到以下信息 有人遇到这个吗 devuser devbox rails 新 test app usr local lib ruby
  • 将二进制字符串转换为字节

    我有一个由 0 255 字节值组成的字符串 我需要将其转换为字节数组 我不想将范围 128 255 转换为 utf 8 事实上 该字符串已经以 utf 8 编码 我到底该如何解决令人沮丧的 不在 0 128 范围内 错误 gt gt gt
  • 如何在 Swift 中生成随机 unicode 字符?

    我当前尝试创建随机 unicode 字符生成失败 并出现错误 例如我的其他问题中提到的错误here https stackoverflow com questions 32158381 fatal error high and low su
  • 从 std::string 解析整数,但如果是浮点则失败

    在 C 和 C 中 有多种方法可以将字符串转换为整数 但我还没有找到解析浮点数时失败的转换方法 const float fnum std stof 1 5 std cout lt lt fnum lt lt std endl prints
  • 如何按顺序调用多个异步 javascript 函数?

    我试图按顺序调用以下函数 但它们不一定以正确的顺序返回 然后我了解了可以使用 回调 顺序调用的异步函数 如何使用回调使这些函数按顺序执行 getJSON http localhost search data php title title
  • WPF 进度栏未显示正确的进度

    我有一个应用程序 我正在其中分块上传文件 我的前端是WPF 我有一个进度条来显示文件上传进度 上传是由单独的线程完成的 进度条采用单独的形式 在上传开始时由子线程调用 我找到了文件中的块总数来设置进度条的最大属性 现在 对于上传的每个块 我
  • 在 HttpConfiguration 实例中的 ASP.NET Web API 应用程序中处理 json 漂亮的打印参数

    我需要在 ASP NET Web API 应用程序中添加和处理可选的 pretty 参数 当用户发送 pretty true 时 应用程序响应应该看起来像带有缩进的人类可读的 json 当用户发送 pretty false 或者根本不发送该
  • 使用环境变量调用python中的子进程

    我正在尝试编写一个 python 脚本来使用 Plex 媒体扫描仪自动扫描 plex 的一部分 为此 我必须以运行 plex 的用户身份运行扫描仪 在本例中为 plex 并为其提供环境变量 LD LIBRARY PATH 我尝试过使用 su
  • 参数化查询.....需要参数“@units”,但未提供该参数

    我收到这个异常 参数化查询 Name nvarchar 8 type nvarchar 8 units nvarchar 4000 rang 需要参数 units 但未提供该参数 我的插入代码是 public int insertType
  • Spring上下文动态变化

    我已经阅读了动态 bean 定义的更改 我在一个简单的代码示例中尝试了它 参见下面的代码 我发现它在我不想停止服务器但添加 更改 bean 定义的情况下非常有吸引力 问题 这样做安全吗 参见下面的代码 你必须定义safe The Abstr