在web应用中时常需要修改配置,并动态的重新加载ApplicationContext。比如,设置和切换数据库。以下给出一个方法,并通过代码验证可行性。

  方法的基本思路是,为WebApplicationContext指定一个上级ApplicationContext,然后需要更新的时候先得到它的引用,再调用refresh方法重新加载。如果直接获得WebApplicationContext实例,重新加载(refresh),得不到预期的效果。

  在本示例中,classpath下有一个config.properties文件,定义了derby数据库的属性:

jdbc.driverClassName=org.apache.derby.jdbc.EmbeddedDriver jdbc.url=jdbc:derby:target/database/helloworld;create=true jdbc.username=test jdbc.password=test

hibernate.dialect=org.hibernate.dialect.DerbyDialect hibernate.show_sql=true hibernate.hbm2ddl.auto=create-drop

  在spring配置文件中定义了两个config.properties文件位置:

<property name="locations"><list><value>classpath:config.properties </value><value>file:/${user.home}/config.properties </value></list></property>

  如果没有用户目录下的config.properties文件,则classpath下的生效。这时如果在用户目录下部署了新的config.properties文件,内容是mysql数据库设置:

jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost/mydb?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8 jdbc.username=root jdbc.password=

hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect hibernate.show_sql=true hibernate.hbm2ddl.auto=create

  这时通过浏览器访问示例的reload.jsp页面,将调用一个刷新ApplicationContext的方法,将会读取用户目录下的属性文件,从而将hibernate环境从derby数据库切换到mysql数据库下,这个过程不需要重启tomcat或者reload web应用。

  reload.jsp中调用的类(spring.WebapplicationContextReloader)主要代码如下:

WebApplicationContext context = WebApplicationContextUtils .getWebApplicationContext(request.getSession() .getServletContext());
if (context.getParent() !=null)
{ ((AbstractRefreshableApplicationContext) context.getParent()) .refresh(); }
((AbstractRefreshableApplicationContext) context).refresh();

  上级ApplicationContext,需要这样配置,首先,在web.xml文件中增加一个上下文变量的赋值:

<context-param><param-name>parentContextKey</param-name><param-value>mycontext</param-value></context-param>

  用来指明上级ApplicationContext的名字,在这里是mycontext。然后,在classpath的根下,建一个beanRefContext.xml文件,用来创建这个ApplicationContext实例,这里的文件名是规定的,Spring会根据约定找到它。

<bean id="mycontext" class="org.springframework.context.support.ClassPathXmlApplicationContext">
<constructor-arg><list><value>services-context.xml</value></list></constructor-arg><
/bean>

  在上面的配置中指明创建这个ApplicationContext所需的配置文件。这样,就实现了一个简单的可动态reload的web环境下的ApplicationContext。

示例的完整代码,见svn:

https://dev.easymorse.com/svn/tutorials/spring/tags/reload.test-1.0

web应用中Spring ApplicationContext的动态更新的更多相关文章

  1. Web环境中Spring的启动过程

    1.spring不但可以在JavaSE环境中应用,在Web环境中也可以广泛应用,Spring在web环境中应用时,需要在应用的web.xml文件中添加如下的配置: …… <context-par ...

  2. spring boot 配置文件动态更新原理 以Nacos为例

    配置文件的动态更新 通常获取配置文件的方式 1, @Value 2. @ConfigurationProperties(Prefix) 如果是在运行时要动态更新的话, 第一种方式要在bean上加@Re ...

  3. Java Web开发中Spring+MyBatis框架的简单搭建

    这里使用的eclipse,首先创建一个动态web项目. 1.导入Spring IOC.AOP.DAO.dbcp.dbdrive.mybatis.jar . mybatis-spring.jar  本人 ...

  4. 在web项目中获取ApplicationContext上下文的3种主要方式及适用情况

    最近在做web项目,需要写一些工具方法,涉及到通过Java代码来获取spring中配置的bean,并对该bean进行操作的情形.而最关键的一步就是获取ApplicationContext,过程中纠结和 ...

  5. web工程中spring+ibatis的单元测试--转载

    为了保证代码的正确,软件的质量,单元测试几乎是每个程序员都要面临的工作了;而开发中大部分的工作都涉及数据库的操作,也就是平时经常可以看到的DAO了;由于是对数据库的操作,就必然有事务的问题了;如果是启 ...

  6. EF中数据修改时动态更新其他数据

    场景 利用.net core开发时,经常会遇到使用EF(Entity Framework),但是今天在开发过程中发现一个值莫名其妙的自己变了,我怀疑是EF的问题. 主要代码如下: 1 // 最近一条告 ...

  7. J2EE进阶(五)Spring在web.xml中的配置

     J2EE进阶(五)Spring在web.xml中的配置 前言 在实际项目中spring的配置文件applicationcontext.xml是通过spring提供的加载机制自动加载到容器中.在web ...

  8. Spring web.xml中的配置

    转载博客:http://blog.163.com/zhangke_616/blog/static/191980492007994948206/ 在实际项目中spring的配置文件application ...

  9. spring在web.xml中的配置

    在实际项目中spring的配置文件applicationcontext.xml是通过spring提供的加载机制,自动加载的容器中去,在web项目中,配置文件加载到web容器中进行解析,目前,sprin ...

随机推荐

  1. 配置tomcat的https通信(单向认证)

    1.首先用jdk带的工具生成证书库 打开cmd命令行窗口,cd 到tomcat安装目录的bin下面执行 keytool -v -genkey -alias tomcat -keyalg RSA -ke ...

  2. 表A中有两个表示时间的字段A,B;如果B的值大于A的值,则把B的值更新为A的值

    sql语句:表A中有两个表示时间的字段A,B:如果B的值大于A的值,则把B的值更新为A的值 update 表名 set B=A where B>A

  3. ASP.net MVC 无法初始化 ASP.NET Simple Membership 数据库

    1.错误信息 解决办法 1 更改Web.config的连接字符串 <connectionStrings> <add name="DefaultConnection" ...

  4. QT国际化

    写的比较简洁 语言文件: ts:编辑翻译用的,是xml,可以用linguist(qt语言专家)或者Editplus进行翻译 qm:这种文件是ts的release版,无法编辑,发布的时候用这个 操作: ...

  5. 在输出视图中使用使用html注释会导致在Chrome中css失效

    在做SportsStore例子时,在视图List.cshtml中使用了html注释,即 <!-- 注释 --> 结果在加载css时,chrome浏览器中所有css效果都失效.IE不受影响. ...

  6. QtSoap开发web services客户端程序

        首先需要下载QtSoap开源包,下载地址为: http://www.filestube.com/q/qtsoap+download, 我使用的是:qtsoap-2.6-opensource(不 ...

  7. 繁简转换OpenCC,autogb 和 autob5,iconv,python的jianfan包

    OpenCC OpenCC 是跨平台.多语言的开放中文转换库,除了基本的简繁转换功能外,用户还可以选择对不同用词习惯和异体字的处理方式. OpenCC 还提供方便的网页转换界面. OpenOffice ...

  8. VC实现卡拉OK字幕叠加

    一. GDI编程基础 字幕叠加,应当是属于图形.图像处理的范畴.在Windows平台上,图形.图像处理的方法当然首选GDI(Graphics Device Interface,图形设备接口).GDI是 ...

  9. spring集成mongodb封装的简单的CRUD

    1.什么是mongodb         MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. mongoDB MongoDB是一个介 ...

  10. Java中static、this、super、final的用法

    一.          static 请先看下面这段程序: public class Hello{public static void main(String[] args){//(1)System. ...