博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
web应用中Spring ApplicationContext的动态更新
阅读量:6294 次
发布时间:2019-06-22

本文共 2199 字,大约阅读时间需要 7 分钟。

  在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文件位置:

classpath:config.properties
file:/${user.home}/config.properties

 

  如果没有用户目录下的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文件中增加一个上下文变量的赋值:
parentContextKey
mycontext

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

services-context.xml
< /bean>

 

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

示例的完整代码,见svn:

转载于:https://www.cnblogs.com/ibook360/archive/2013/02/17/2914378.html

你可能感兴趣的文章
Git 远程分支的pull与push
查看>>
tomcat误报
查看>>
Android开发笔记——常见BUG类型之内存泄露与线程安全
查看>>
oracle active data guard概述
查看>>
网络管理员基础
查看>>
myeclipse文件目录自动定位(右编辑界面点击 左边Package Explorer导航自动定位)...
查看>>
React源码学习——ReactClass
查看>>
电脑爱好者GHOSTWIN764位V4.0
查看>>
MYSQL——常用运算符和函数
查看>>
JS获取上传文件的大小
查看>>
Shell脚本调用mysql语句
查看>>
远程连接服务器的方法:
查看>>
docker入门
查看>>
linux下如何判断oracle数据库tns是否设置正常
查看>>
dell物理服务器硬件磁盘监控
查看>>
sqlserver的事务回滚和设置事务保存点操作
查看>>
https搭建(openssl)
查看>>
CISCO上ADSL配置的方法
查看>>
队列实现qq解密
查看>>
制作RPM包
查看>>