如今,大多数Java开发人员都定期与Spring打交道,而我们当中的许多人已经熟悉了Spring的功能和局限性。

最近,我遇到了一个我从未遇到过的问题:引入了基于运行时引入的配置来重新连接Bean内部的功能。 这对于简单的配置更改或交换掉诸如StrategyFactory类之类的东西非常有价值,而不是重建应用程序上下文的复杂部分。

我能够找到一些有关如何执行此操作的注释,但是我认为有些人可能会发现我的注释和代码示例很有用,特别是因为我可以确认该技术在Spring 1.2.6之前的版本中可以使用。 不幸的是,并不是我们所有人都有幸成为每个图书馆中最新最好的图书馆。

问题范围

我将概述的方法主要是针对单个bean的更改,尽管可以轻松扩展此代码以更改多个bean。 可以通过JMX或向管理员公开的其他UI调用它。

它没有涉及的一件事是在整个应用程序中重新布线单例–可以想到,这可以通过对当前应用程序上下文的某种反射和检查来完成,但是在大多数应用程序中,除非它们具有某种临时关闭或关闭的方式,否则可能不安全。在整个应用程序中进行更改时,将一段时间内的所有处理都阻塞。

编码

这是示例代码。 它将获取一个包含bean定义的字符串列表,并将它们连接到新的临时Spring上下文中。 您将看到可以提供父上下文,这在您的新bean定义需要引用应用程序中已经配置的bean时很有用。

public static <T> Map<String, T> extractBeans(Class<T> beanType,List<String> contextXmls, ApplicationContext parentContext) throws Exception {List<String> paths = new ArrayList<String>();try {for (String xml : contextXmls) {File file = File.createTempFile("spring", "xml");// ... write the file using a utility methodFileUtils.writeStringToFile(file, xml, "UTF-8");paths.add(file.getAbsolutePath());}String[] pathArray = paths.toArray(new String[0]);return buildContextAndGetBeans(beanType, pathArray, parentContext);} finally {// ... clean up temp files immediately if desired}
}private static <T> Map<String, T> buildContextAndGetBeans(Class<T> beanType,String[] paths, ApplicationContext parentContext) throws Exception {FileSystemXmlApplicationContext context =new FileSystemXmlApplicationContext(paths, false, parentContext) {@Override  // suppress refresh events bubbling to parent contextpublic void publishEvent(ApplicationEvent event) { }};try {// avoid classloader errors in some environmentscontext.setClassLoader(beanType.getClassLoader());context.refresh(); // parse and load contextMap<String, T> beanMap = context.getBeansOfType(beanType);return beanMap;} finally {try {context.close();} catch (Exception e) {// ... log this}}
}

如果查看buildContextAndGetBeans() ,您将看到它通过使用提供的XML bean定义文件构建Spring上下文来完成大部分工作。 然后,它返回所请求类型的构造bean的映射。

注意:由于临时Spring上下文已被破坏,因此请确保您的bean没有生命周期方法,该方法会导致它们在停止或破坏时处于无效状态。

这是一个Spring上下文的示例,可用于重新连接组件。 想象一下,我们有一个电子商务系统,可以进行欺诈检查,但是可以使用多种策略来检查欺诈。 我们可能希望从服务类中交换这些内​​容,而不必停止并重新配置应用程序,因为这样做会造成业务损失。 也许我们正在发现对该系统的特定滥用,可以通过更改用于定位欺诈性订单的策略来更好地解决。

这是一个示例XML定义,可用于重新连接我们的FraudService

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans><bean id="fraudStrategy" class="com.example.SomeFraudStategory"><!-- example of a bean defined in the parent application context that we can reference --><property name="fraudRuleFactory" ref="fraudRuleFactory"/></bean>
</beans>

这是您可以使用对定义的欺诈策略的引用来重新连接Bean的代码,假设您已将其包含在名为SpringUtils的实用工具类中:

public class FraudService implements ApplicationContextAware {private ApplicationContext context;// volatile for thread safety (in Java 1.5 and up only)private volatile FraudStrategy fraudStrategy;@Override // get a handle on the the parent contextpublic void setApplicationContext(ApplicationContext context) {this.context = context;}public void swapFraudStategy(String xmlDefinition) throws Exception {List<Sting> definitions = Arrays.asList(xmlDefinition);Map<String, FraudStrategy> beans =SpringUtils.extractBeans(FraudStrategy.class, definitions, context);if (beans.size() != 1) {throw new RuntimeException("Invalid number of beans: " + beans .size());}this.fraudStrategy = beans.values().iterator().next();}}

在那里,您拥有了! 可以适当地扩展此示例以满足您的需求,但是我认为它展示了如何动态创建Spring上下文并使用其bean重新配置应用程序而无需停机的基础知识。

参考:在Carfey Software博客上 ,我们的JCG合作伙伴提供了在运行时交换Spring Bean配置的信息 。

相关文章 :
  • 零XML的Spring配置
  • Spring依赖注入技术的发展
  • Spring MVC3 Hibernate CRUD示例应用程序
  • 使用Spring AOP进行面向方面的编程
  • Spring MVC开发–快速教程

翻译自: https://www.javacodegeeks.com/2011/09/swapping-out-spring-bean-configuration.html

在运行时交换出Spring Bean配置相关推荐

  1. spring bean配置_在运行时交换出Spring Bean配置

    spring bean配置 如今,大多数Java开发人员都定期与Spring打交道,而我们当中的许多人都已经熟悉了它的功能和局限性. 最近,我遇到了一个我从未遇到过的问题:引入了基于运行时引入的配置来 ...

  2. Spring Bean 配置相关的注意事项

    数据访问注意事项 本部分介绍与访问事务中的数据的 Spring Bean 配置相关的注意事项. Spring Framework 实际上使用一个容器管理层(在 J2EE 环境中委托给基础 J2EE 运 ...

  3. Spring bean配置的六种方式

    本文将详细介绍Spring Bean配置的六种不同方式的特点与使用条件. 一,Spring 的配置文件概述 其实,Spring的配置文件是Spring容器对Bean进行生产以及关系注入的图纸,他是Sp ...

  4. Spring bean配置继承

    在 Spring,继承是用为支持bean设置一个 bean 来分享共同的值,属性或配置. 一个子 bean 或继承的bean可以继承其父 bean 的配置,属性和一些属性.另外,子 Bean 允许覆盖 ...

  5. Spring Bean配置细节author: 惠惠

    ## 字面值 可用字符串表示的值,可以通过元素标签或value属性进行注入. 如果字面值包含特殊字符,可以使用 使用utility schema定义集合 使用基本的集合标签定义集合时,不能将集合作为独 ...

  6. Spring Bean配置方式之一:Java配置

    简介: Spring bean 是使用传统的 XML 方法配置的.在这篇文章中,您将学习使用基于纯 Java 的配置而非 XML 来编写 Spring bean 并配置它们.本文将介绍可用来配置 be ...

  7. Spring Bean配置默认为单实例 pring Bean生命周期

    Bean默认的是单例的. 如果不想单例需要如下配置: <bean id="user" class="..." scope="singleton& ...

  8. Spring Bean配置依赖注入

    Bean配置 属性 值 注释 id 自自定义,一般为类名 Bean ID name 自自定义,一般为类名,与id作用相同 Bean别名,多个别名逗号分隔 class 指定的类路径,com.xx.xx. ...

  9. 混合模式程序集是针对“v1.1.4322”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。

    看到一个kinect大牛编写的一个水果忍者的体感游戏版本,让我为自己一直以来只用现有的网页游戏来模拟kinect体感游戏控制感到惭愧,没办法,我还是菜鸟.学习一段后自己模仿星际大战这个游戏,自己写了一 ...

最新文章

  1. 【小项目关键技术二】UGV电机编码测速
  2. 在Windows 2008 R2下部署SQL Server 2008 R2 群集(一)
  3. 北风设计模式课程---享元模式
  4. 1595 hdu find the longest of the shortest
  5. java服务器端编程
  6. CF1511G-Chips on a Board【倍增】
  7. 来啦~ C++学习建议和学习资料
  8. 构建适用于Oracle 11.2.0.x的Linux单数据库实例的DataGuard
  9. 思科模拟器 简单网络连接操作
  10. 活动预告|一个重塑区块链行业生态的新物种即将诞生!
  11. 渣渣的leetcode刷题笔记-树(1)
  12. outlook常见错误分析指南
  13. 计算机会计报表管理,职称计算机考试用友财务教程:会计报表子系统的主要功能...
  14. python基础-读写txt文件
  15. 当面试官问到以后的职业规划,这样回答绝对称赞你是高手!(二)
  16. Linux下载神器XDM,代替IDM
  17. python模块-win32clipboard-访问windows剪切板-实现复制粘贴
  18. Java基础 DAY02
  19. 计算机配置好一点的,怎么了解电脑配置好坏 电脑配置怎么样算好
  20. Windows 安装 Enthought Canopy

热门文章

  1. 算法设计与分析:(二)动态规划
  2. java第三阶段源代码_有效Java第三版的源代码已更新为使用较新的功能
  3. 自动化测试特定区域滑动_自动化用户特定实体的访问控制
  4. Spring再次涵盖了您:继续进行消费者驱动的消息传递合同测试
  5. jboss eap_带有自定义模块的JBoss EAP上的骆驼
  6. Jakarta EE贡献–入门
  7. web 项目集成福昕_项目学生:Web服务集成
  8. 模型服务:流处理与使用Java,gRPC,Apache Kafka,TensorFlow的RPC / REST
  9. specs.4.8.gz_使用Specs2和客户端API 2.0进行富有表现力的JAX-RS集成测试
  10. 使用“另类” Cloud Foundry Gradle插件无需停机