spring bean配置

如今,大多数Java开发人员都定期与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重新配置应用程序而无需停机的基础知识。

参考: 在运行时从我们的JCG合作伙伴的Carfey Software博客上 交换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配置

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

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

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

  2. bean validation校验方法参数_项目启动时首先校验Spring Boot配置参数

    1. 概述 在项目实际开发过程中,为了更好的复用,我们参考Spring Boot Starters,封装了许多企业内部中间件的starter.这些中间件的接入都需要申请并在项目中配置一些特定的参数.我 ...

  3. spring解密_在运行时更新代码(已Spring解密)

    spring解密 当从编译到部署再到测试的开发周期花费太长时间时,人们希望能够及时替换正在运行的代码,而无需重新启动应用程序服务器并等待部署完成. 在这种情况下,像JRebel这样的商业解决方案或像G ...

  4. applicationcontext添加配置_让小白也能懂的Bean配置方法

    今天整理了一些注入和Bean的知识点,希望能帮助到屏幕前的你 依赖注入(Dependency Injection,DI)和控制反转含义相同,它们是从两个角度描述的同一个概念. 当某个 Java 实例需 ...

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

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

  6. VS2010 混合模式程序集是针对v1.1.4322版的运行时生成的 在没有配置其他信息的情况下 无法再4.0运行中

    VS报错,百度之解决方案:原文出处 http://www.cnblogs.com/zcftech/archive/2013/03/22/2976385.html 看到一个kinect大牛编写的一个水果 ...

  7. java零碎要点001--深入理解JVM_Java的堆内存_栈内存_以及运行时数据区的作用

    程序计数器:可以看做当前线程运行所执行的字节码的行号指示器,在虚拟机的概念模型中,字节码解释器工作时就是 通过改变这个计数器的值来选取下一条需要执行的字节码指令.由于JVM多线程是通过线程轮流切换并分 ...

  8. java 运行时修改类_在运行时修改类定义的注释字符串参数

    在OSX上测试过.效果很好. 由于我还需要在运行时更改注释值,所以我重新讨论了这个问题. 下面是@assylias方法的修改版本(非常感谢您的启发)./** * Changes the annotat ...

  9. 2020 idea 查看内存消耗_查看运行时某个java对象占用JVM大小及通过idea查看java的内存占用情况...

    一.如果想看运行时某个java对象占用JVM内存大小,可以先将对象转换成字节类型,然后计算: List bizGroupRelatedEventInfos = bizEventVersionMappe ...

最新文章

  1. 这款开源测试神器,圆了我玩游戏不用动手的梦想
  2. 64位环境启用ASP.net 2.0的32位扩展
  3. 理解 Android 的 Binder 机制
  4. U3D包大小优化之microlib
  5. Android中实现SQLite数据库CRUD操作的两种方式
  6. java从入门到精通_Java入门到精通、学习路线、就业方向、薪资及前景分析(上篇)...
  7. 分布式系统中的进程标识
  8. 【Pytorch神经网络实战案例】01 CIFAR-10数据集:Pytorch使用GPU训练CNN模版-方法①
  9. linux中vi基础知识,Vim入门基础知识集锦
  10. extundelete安装_Linux下高效数据恢复软件extundelete应用实战
  11. 动物识别系统 c语言代码_C ++程序员避不开虚函数的,就像C语言程序员避不开指针一样...
  12. 华为鸿蒙系统备用,就只有华为有备用系统?其实谷歌也准备了一个,不输鸿蒙系统!...
  13. JavaScript声明全局变量的三种方式
  14. ctags的如何生成tags文件
  15. RubyOnRails环境搭建
  16. ceph 运维操作 - POOL
  17. 什么是驻点和拐点_临界点、驻点、拐点的定义是什么?
  18. html怎么清除背景颜色,怎么去除Word复制网页内容的背景色?
  19. 阿里云香港服务器配置选择帮助文档(超详细)
  20. Android studio课程设计开发实现---日记APP

热门文章

  1. 英语不会读怎么办?它来教你……
  2. PhotoShop基础知识
  3. Servlet使用适配器模式进行增删改查案例(Emp.java)
  4. Map的两种遍历方法
  5. 配置phython环境
  6. 服务器ubuntu系统版本选型原则,系统集成 - 选择Ubuntu服务器版操作系统的六大理由_服务器应用_Linux公社-Linux系统门户网站...
  7. jvm(13)-线程安全与锁优化
  8. java 键入_在Java中键入Safe SQL
  9. aws ec2 选择可用区_AWS Messaging Services:选择合适的服务
  10. 测试反模式冰激凌模式的不足_单元测试反模式,完整列表