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

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配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML教程(看完这篇就够了)

目录结构 HTML教程 HTML 简介HTML 编辑器HTML基础 HTML 元素HTML 属性HTML 标题HTML 段落HTML 文本格式化HTML 链接HTML headHTML CSSHTML 图像HTML 表格HTML 列表HTML 块级元素HTML 布局HTML 表单

Metasploit入门用法(主动攻击)

–作者&#xff1a;CV 本文主要讲metasploit的入门用法&#xff0c;还有一些渗透细节和思路&#xff0c;有不足的&#xff0c;欢迎互相学习研究。本人区别于书籍的特点是&#xff1a;书籍以模块为划分&#xff0c;我是以连续的步骤进行书写&#xff0c;更突出一次渗透的思路&a…

java 计时器_Java多线程并发容器之并发倒计时器

从火箭发场景来学习Java多线程并发闭锁对象倒计时器场景在我们开发过程中&#xff0c;有时候会使用到倒计时计数器。最简单的是&#xff1a;int size 5; 执行后&#xff0c;size—这种方式来实现。但是在多线程并发的情况下&#xff0c;这种操作会不安全的。举个现实中最典型的…

jQuery 图片轮流展示效果

1. siblings()这个方法&#xff0c;就是要取得调用该方法的节点对象的兄弟节点&#xff08;查找同级对象&#xff09;比如&#xff1a; <div id"aaa"><p>1</p><p>2</p><h1>2</h1><h2>22</h2><div>abcd…

通过Spring将AWS SQS用作JMS提供程序

最近AWS公布了新的客户端库&#xff0c;它实现了JMS 1.1规范 &#xff0c;并使用他们的简单队列服务 &#xff08;SQS&#xff09;作为JMS提供者 &#xff08;见杰夫巴尔的帖子在这里 &#xff09;。 在我的文章中&#xff0c;我将向您展示如何设置Maven项目以使用Spring Frame…

【APICloud系列|15】上架ios应用到苹果应用市场总结

今年4月初从公司离职啦,这几天学习了很多大前端知识体系,今天收到老板委托把这个遗留的问题处理一下。安卓几个应用商店已经更新了所有的程序,比较简单,一般人都可以很容易上架,对上架到苹果应用市场第一次搞或者老手也会遇到很多坑,这里面主要会涉及到邓白氏编码,苹果开…

常见网络协议端口号

一、端口的分类 1&#xff09;按端口性质来分 公认端口&#xff08;常用端口&#xff09;&#xff1a;0-1024 通常这些端口的通信明确表明了某种服务的协议。这些端口是不可以重新定义它的作用对象。 如80端口实际上总是HTTP通信所使用的&#xff0c;而23号端口是Teln…

java foxmail 附件_foxmail 本程序使用JavaMail进行收取和发送带附件的邮件 - 下载 - 搜珍网...

邮件客户端/foxmail/.classpath邮件客户端/foxmail/.project邮件客户端/foxmail/bin/org/crazyit/foxmail/box/AbstractBox.class邮件客户端/foxmail/bin/org/crazyit/foxmail/box/DeletedBox.class邮件客户端/foxmail/bin/org/crazyit/foxmail/box/DraftBox.class邮件客户端/f…

netbeans7.4_带有NetBeans 7.1 RC 2的快速入门WebLogic 12c

netbeans7.4WebLogic服务器12c停运了几天。 它适用于“裸”的Java开发人员-精美的Fusion Middleware东西将继续沿线升至12c。 因此&#xff0c;这基本上是我要运行的版本。 今天&#xff0c;我为您提供一个最新的NetBeans 7.1&#xff08;RC 2&#xff09;和WebLogic的快速入门…

ORACLE SEQUENCE 介绍

在oracle中sequence就是所谓的序列号&#xff0c;每次取的时候它会自己主动添加&#xff0c;一般用在须要按序列号排序的地方。 1、Create Sequence 你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限&#xff0c; CREATE SEQUENCE emp_sequence INCREMENT BY 1 …

burpsuite全套使用教程

burpsuite 实验环境安装教程浏览器配置篇使用方法Target模块(目标模块)Proxy模块(代理模块)Spider模块(蜘蛛爬行)Scanner模块(漏洞扫描)Intruder模块decoder模块(编码模块)Comparer模块(比较器)RepeaterSequencer 实验环境 burpsuite1.733 win10 dvwa firefox 安装教程 第…

致我们曾经白嫖的网站

十分好用的在线工具网站,珍藏版,分享给你们 1.奶牛快传:用户体验更好的网盘工具。 最近开始使用的一款网盘工具,和百度网盘类似,不过没有下载速度的限制,并且可以支持自定义分享文件的下载次数(需要开会员)。 还有一点让我觉得比较舒服的是,你给别人分享文件,别人无…

java word模版填充_[转载]java向word模板中填充数据(总结)

使用过PageOffice动态生成word文档的人都知道,PageOffice可以给word文档的指定位置进行填充,这里我们所说的指定位置在PageOffice的专业术语里面有两个概念&#xff0c;一个叫做数据区域(DataRegion)&#xff0c;另一个叫做数据标签(DataTag)。一、 概念数据区域&#xff1a;是…

网站访问优化,未完待续

下午&#xff0c;网站被吐槽了&#xff0c;访问太慢。最初&#xff0c;我以为是首页的banner图片&#xff0c;太大导致的&#xff0c;之前是500kb的高清图。立即去看了下&#xff0c;banner大图已经压缩到50kb了。so&#xff0c;不是图片的问题。 用Chrome打开网站&#xff0…

Linux中重要文件

用户文件 /etc/passwd------用户名和UID等信息 /etc/shadow------用户密码 组账号 /etc/group-------组名和GID等信息 /etc/gshadow----组密码 1、用户名和UID等信息存放在/etc/passwd中&#xff08;7列&#xff09; 每一行都表示的是一个用户的信息&#xff1b;一行有…

HTML5教程(学完html的,这个可以快速过一遍)

目录 HTML5 教程HTML5 浏览器支持HTML5 新元素HTML5 语义元素HTML5 代码规范HTML5 MathMLHTML5 Web SQL数据库HTML5 迁移HTML5 CanvasHTML5 内联 SVGHTML5 Canvas VS svgHTML5 多媒体HTML5 Object元素HTML5 Audio音频HTML5 Video视频HTML5 新的input类型HTML5 表单元素

是时候抛弃Java 7 – JBoss EAP 6.4了!

这一周真是太棒了。 JBoss EAP 6.4已发布&#xff0c;并且在大量技术增强和新功能中 &#xff0c;最大的是&#xff1a;Java 8已添加到受支持的配置列表中。 其中包括Oracle JDK和IBM JDK。 Java SE 7公开更新结束通知 2015年4月之后&#xff0c;Oracle将不再将Java SE 7的更新…

java 时间戳 星期几_java自定义获取星期几、几点、几分。

/*** author 9082046**qq.com**/public void out_week_hour_minute(){long eight_hour_ms 8*60*60*1000;//8小时*分*秒*毫秒,时区影响&#xff0c;北京时区:东八区。long per_week_ms 7*24*60*60*1000;//7天*时*分*秒*毫秒,一周。long four_day_ms 4*24*60*60*1000;//4天*时…

bzoj 3668 数位DP

收获&#xff1a; 1、如果有很多位操作&#xff0c;并且不包含-/等高级运算&#xff0c;那么可以一位一位考虑&#xff0c;如果求一个最优解&#xff0c;可以尝试逐位确定&#xff0c;这道题因为原始攻击值有范围&#xff0c;那么就需要数位DP。 1 /**************************…

常用的视频下载网站

视频已经成为生活中不可缺少的一部分&#xff0c;不搬运视频怎么在此基础上创新。 小视频下载 V视频助手 硕鼠视频下载 维棠视频下载 Apowersoft视频下载王 Video Grabber Eagleget视频下载 喜欢的朋友可以收藏一下&#xff0c;万一以后想用找不到就不能二次创新了&#xff01;…