在运行时交换出Spring Bean配置

如今,大多数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

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

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

相关文章

Proximal Algorithms--Accelerated proximal gradient method

4.3 Accelerated proximal gradient method&#xff1a; 加速近端梯度方法&#xff1a; 基本的近端梯度方法的所谓的“加速”版本&#xff0c;就是在算法中包含了一个外推(extrapolation)步骤&#xff0c;一个简单的版本是&#xff1a; yk1:xkωk(xk−xk−1)xk1:proxλkg(yk1−…

C语言代码规范(七)#define

#define 宏定义的使用 #define MAX(x, y) ( ((x) > (y)) ? (x) : (y) ) #define MIN(x, y) ( ((x) < (y)) ? (x) : (y) ) 在宏定义中要把参数用括号扩起来( ((x) > (y)) ? (x) : (y) )。 因为宏只是简单的文本替换&#xff0c;如果不注意&#xff0c;很容…

http 二进制_浅谈HTTP协议

HTTP一、HTTP协议http协议&#xff0c;是超文本传输协议&#xff0c;此协议是基于TCP/IP的协议&#xff0c;是互联网上应用最为广泛的一直网络协议是一种无状态协议&#xff0c;默认端口为80,。设计HTTP的最初目的是为了提供一种发布和接受HTML页面的方法。通过HTTP或者HTTPS协…

登陆注册

登陆注册&#xff0c;注册的账号存在服务器的数据库里&#xff0c;成功了就给你返回成功&#xff0c;失败了就返回失败 有三种登陆方式&#xff1a;普通注册&#xff0c;手机号注册&#xff0c;第三方注册转载于:https://www.cnblogs.com/SensenCoder/p/4885606.html

Java并发教程–线程池

Java 1.5中提供的最通用的并发增强功能之一是引入了可自定义的线程池。 这些线程池使您可以对诸如线程数&#xff0c;线程重用&#xff0c;调度和线程构造之类的东西进行大量控制。 让我们回顾一下。 首先&#xff0c;线程池。 让我们直接进入java.util.concurrent.ExecutorSer…

HTTPPost/AFNetWorking/JSONModel/NSPredicate

一、HTTPPost 1. POST方式发送请求 HTTP协议下默认数据发送请求方法是GET方式&#xff0c;若需要使用POST方法&#xff0c;则需要对发送的请求也就是request对象&#xff0c;进行属性设置。 步骤如下&#xff1a; > 要发送的请求对象&#xff0c;需要使用可变请求对象 [[NSM…

C语言代码规范(八)使用const修饰值不允许改变的变量

使用const限定一个变量的值不允许被改变&#xff0c;从而保护被修饰的东西&#xff0c;防止意外&#xff0c;提高程序的可靠性和安全性。

教育小思

父母的时代是“攒钱&#xff0c;买房&#xff0c;生子&#xff0c;终老”&#xff0c;而现在的时代是“教育&#xff0c;创造&#xff0c;传承&#xff0c;成长”。 改变世界&#xff0c;从教育起步。 传统教育的不足之处&#xff1a; 1. 学习体验不佳&#xff0c;学习者被迫…

linux redis客户端_为什么单线程Redis能那么快?

我们通常说&#xff0c;Redis 是单线程&#xff0c;主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的&#xff0c;这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能&#xff0c;比如持久化、异步删除、集群数据同步等&#xff0c;其实是由额外的线…

servlet中文乱码处理

servlet中文乱码处理 如果是post设置req.setCharacterEncoding("utf-8");如果是get&#xff0c;不去修改服务器配置的情况下new String(name.getBytes("iso-8859-1"),"utf-8")数据库乱码?useUnicodetrue&characterEncodingUTF-8转载于:http…

C语言开发笔记(七)const和指针

const修饰变量是常用的&#xff0c;不容易犯错&#xff0c;而const和指针一起使用时很容易混淆。 (一)const int *p #include <stdio.h>int main(void) {int a 10;int b 20;const int *p &a;*p b;return 0; } const在int *的左侧&#xff0c;即指针指向内容为…

从JavaFX 1.3迁移到JavaFX 2.0

几天前&#xff0c;我完成了将Modellus的源代码从JavaFX 1.3脚本迁移到JavaFX 2.0 Java语言的过程。 因此&#xff0c;我认为写关于我在此过程中学到的知识会很好。 我想指出&#xff0c;如果您想继续在JavaFX 2.0中使用JavaFX脚本&#xff0c;则可以使用Visage&#xff1a; ht…

九度OJ 1034:寻找大富翁 (排序)

时间限制&#xff1a;1 秒 内存限制&#xff1a;32 兆 特殊判题&#xff1a;否 提交&#xff1a;5925 解决&#xff1a;2375 题目描述&#xff1a;浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁.输入&#xff1a;输入包含多组测试用例.每个用例首先包含2个整数n&#xff08…

ubuntu php 无法执行exec_利用webhook使php项目自动部署

php中文网最新课程每日17点准时技术干货分享1.先来讲一下自动部署的原理&#xff0c;一般在我们push代码的时候&#xff0c;可以自动请求webhook中设置的url&#xff0c;完成一次请求与响应。那么只要我们设置的url地址请求的php文件内容是执行命令行git push命令&#xff0c;则…

android-verticalseekbar——Android可视化SeekBar类库

android-verticalseekbar——Android可视化SeekBar类库转载于:https://www.cnblogs.com/zhujiabin/p/5706246.html

C语言开发笔记(八)static

在C语言中&#xff0c;static有3个作用&#xff1a; &#xff08;1&#xff09;在函数体&#xff0c;一个被声明为静态的变量在这一函数体内被调用的过程中维持其值不变。 #include <stdio.h>void test(void) {static int i 0;printf("%d\n", i); }int main…

ppt修复无法读取_移动硬盘故障分析以及建议修复方法

移动硬盘中存储了大量的重要数据&#xff0c;一旦出现什么问题&#xff0c;会让人急得焦头烂额。换个硬盘倒是件小事&#xff0c;但其中资料、数据的丢失更令人懊恼。而在硬盘使用的过程中&#xff0c;由于使用者一时的不注意&#xff0c;往往就很容易造成意外的问题。接下来&a…

(原创)c#学习笔记04--流程控制01--布尔逻辑03--运算符优先级

转载于:https://www.cnblogs.com/wodehao0808/p/4896018.html

一些定义–测试技术9

我认为我即将结束有关测试技术的博客系列&#xff0c;感觉好像已经过去了。 对我来说更清楚的一件事是&#xff0c;测试方法仍处于起步阶段&#xff0c;因此是开发人员之间争执或讨论的明确来源&#xff0c;这是一件好事。 我怀疑我们正处于职业发展史上的某个时刻&#xff0c;…

百度谷歌面试题目

全新整理&#xff1a;微软、谷歌、百度等公司经典面试100题[第101-160题] 整理:July、二零一一年三月九日。应网友承诺与要求&#xff0c;全新整理。转载&#xff0c;请注明出处。博主说明&#xff1a;此100题V0.2版&#xff0c;本人不再保证&#xff0c;还会提供答案。-------…