`
yangzelin_job09
  • 浏览: 31738 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Spring 从数据库中加载配置数据

阅读更多
Spring 从数据库中加载配置数据
spring配置文件加载新增了在数据库中配置参数文件的支持,这样把环境相关的参数配置在数据中,解决了同一套代码包可以不用修改配置文件运行在任何环境中。
方法1、编写类继承org.springframework.beans.factory.config.PropertyPlaceholderConfigurer实现mergeProperties 方法,在该方法总添加 从数据库读取参数代码。
如:  参照了http://www.hidehai.com/html/y2012/776.html 做了实现 DataSourceOverridePropertyPlaceholderConfigurer

spring 配置文件
<bean id="propertyConfigurer" class="com.xx.commons.config.DataSourceOverridePropertyPlaceholderConfigurer">
		<property name="nullValue" value="[null]" />
		<property name="locations">
			<list>
				<value>classpath*:properties/appConfig.properties</value>
			</list>
		</property>
		<property name="dataBasePropertyOverride" value="true" />
		<property name="dataSource" ref="dataSource"></property>
		<property name="paramSql" value="select param_code, param_value from app_params order by param_id"></property>
		<property name="paramKeyColumn" value="param_code"></property>
		<property name="paramValueColumn" value="param_value"></property>
	</bean>


public class DataSourceOverridePropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
	//数据库覆盖properties文件
	private boolean dataBasePropertyOverride = false;
	
	private DataSource dataSource;
	private String paramSql;
	private String paramKeyColumn;
	private String paramValueColumn;

	/**
	 * Return a merged Properties instance containing both the
	 * loaded properties and properties set on this FactoryBean.
	 */
	protected Properties mergeProperties() throws IOException {
		Properties result = new Properties();

		if (this.localOverride) {
			// Load properties from file upfront, to let local properties override.
			loadProperties(result);
		}
		
		if (this.localProperties != null) {
			for (Properties localProp : this.localProperties) {
				CollectionUtils.mergePropertiesIntoMap(localProp, result);
			}
		}

		if (!this.localOverride) {
			// Load properties from file afterwards, to let those properties override.
			loadProperties(result);
		}
		
		// Load config property from database
		if(this.dataBasePropertyOverride){
			Properties dbprop = loadAllParamProperties();
			CollectionUtils.mergePropertiesIntoMap(dbprop, result);
		}
		
		return result;
	}
	
	protected Properties loadAllParamProperties(){
		Properties prop = new Properties();
		if(dataBasePropertyOverride){
			logger.info("--- launch dataBase config property ----");
			validParam();
			
			JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
			List<Map<String, Object>> list = jdbcTemplate.queryForList(paramSql);
			for(Map<String, Object> colMap : list){
				String key = StringUtils.trimAllWhitespace(colMap.get(paramKeyColumn) != null ? colMap.get(paramKeyColumn).toString() : "");
				String value = StringUtils.trimAllWhitespace(colMap.get(paramValueColumn) != null ? colMap.get(paramValueColumn).toString() : "");
				prop.put(key, value);
				logger.info("--- load database param key:["+key+"] value:["+value+"]");
			}
		}
		
		return prop;
	}
	
	private void validParam(){
		if(dataBasePropertyOverride){
			if(dataSource == null){
				throw new IllegalArgumentException("DataBase Property Override  launch, DataSource is null");
			}
			
			if(StringUtils.isEmpty(paramSql)){
				throw new IllegalArgumentException("DataBase Property Override  launch, paramSql is null!");
			}
			if(StringUtils.isEmpty(paramKeyColumn)){
				throw new IllegalArgumentException("DataBase Property Override  launch, paramKeyColumn is null!");
			}

			if(StringUtils.isEmpty(paramValueColumn)){
				throw new IllegalArgumentException("DataBase Property Override  launch, paramValueColumn is null!");
			}
		}
	}


	public boolean isDataBasePropertyOverride() {
		return dataBasePropertyOverride;
	}

	public void setDataBasePropertyOverride(boolean dataBasePropertyOverride) {
		this.dataBasePropertyOverride = dataBasePropertyOverride;
	}

	public DataSource getDataSource() {
		return dataSource;
	}

	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}

	public String getParamSql() {
		return paramSql;
	}

	public void setParamSql(String paramSql) {
		this.paramSql = paramSql;
	}

	public String getParamKeyColumn() {
		return paramKeyColumn;
	}

	public void setParamKeyColumn(String paramKeyColumn) {
		this.paramKeyColumn = paramKeyColumn;
	}

	public String getParamValueColumn() {
		return paramValueColumn;
	}

	public void setParamValueColumn(String paramValueColumn) {
		this.paramValueColumn = paramValueColumn;
	}
	

}




方法2、在配置文件中使用直接使用spring EL 调用 类的方法 #{class.method} 如: #{serviceManager.getParam('serviceName')}
如:

<bean id="serviceManager" class="com.xxx.commons.helper.ServiceManager" />
<bean name="authenticationFilter" class="org.jasig.cas.client.authentication.AuthenticationFilter">
		<property name="casServerLoginUrl" value="#{serviceManager.getParam('casServerLoginUrl')}"></property>
		<property name="serverName" value="#{serviceManager.getParam('serverName')}" ></property>
	</bean>
	 
	 <bean name="ticketValidationFilter" class="org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter">
		<property name="serverName" value="serviceManager.getParam('serverName')}"></property>
		<property name="ticketValidator">
			<bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">
				<constructor-arg index="0" value="serviceManager.getParam('casServerUrlPrefix')}" />
			</bean>
		</property>
	</bean>


在serviceManager的getParam 做参数加载
分享到:
评论

相关推荐

    spring 重新动态加载数据库或xml中的bean,可以不用重启tomcat

    spring 重新动态加载数据库或xml中的bean,可以不用重启tomcat

    Springboot项目启动时加载数据库数据到内存.rar

    博客地址:... 1. 启动后访问http://localhost:8848/code,可见控制台输出codeMap中的值 2. 新建一个只有key和value两个字段的表code 3. 不要轻易浪费积分下载代码,没什么实质内容

    Spring中文帮助文档

    6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点运算 7.2.3. AspectJ切入点表达式 7.2.4. 便利的切入...

    Spring.3.x企业应用开发实战(完整版).part2

    14.4.3 如何在Spring中进行配置 14.4.4 Spring OXM 简单实例 14.5 小结 第15章 Spring MVC 15.1 Spring MVC概述 15.1.1 体系结构 15.1.2 配置DispatcherServlet 15.1.3 一个简单的实例 15.2 注解驱动的控制器 15.2.1...

    从零搭建Spring Boot脚手架,集成mybatis.docx

    4.1 先配置数据源 数据源在application.yml中的配置前缀为spring.datasource。那么基本的配置如下: spring: datasource: # 连接池实现的限定名,这里使用hikari连接池。一般不用配置这个,会自动去类路径下加载,...

    Spring Boot中文文档.rar

    spring boot中文文档,从安装到部署。 I. Spring Boot文件 1.关于文档 2.获得帮助 3.第一步 4.使用Spring Boot 5.了解Spring Boot功能 6.转向生产 7.高级主题 II。入门 8.介绍Spring Boot ...

    sprinboot整合Oauth2.0、Spring Security,对接数据数据库,支持zuul路由-架构源码

    压缩包内容介绍 ...2、数据库一键创建文件mango.sql ...8、《Springboot 实践(3)配置DataSource及创建数据库》 9、《Springboot 实践(4)swagger-ui 测试controller》 。。。等11篇springboot架构整合讲解文章

    dynamic-datasource-spring-boot-starter-v3.5.1.zip

    提供 自定义数据源来源 方案(如全从数据库加载)。 提供项目启动后 动态增加移除数据源 方案。 提供Mybatis环境下的 纯读写分离 方案。 提供使用 spel动态参数 解析数据源方案。内置spel,session,header,支持...

    Spring攻略(第二版 中文高清版).part1

    1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 工作原理 14 1.4 解决构造程序歧义 17 ...

    使用Struts+Spring+Hibernate整合开发例子

    先配置mysql数据驱动,打开eclipse database explorer perspective,选择tie数据库中的user表,创建hibernate Reverse Engineering 生成vo,还可以生成dao。 5. 这样框架就加载完毕了。下面就是SSH的整合了,首先...

    Myeclipse开发struts+hibernate+spring新手入门--环境配置---项目开发示例

    同加载struts方式类似,选择Myeclipse后在弹出的二级菜单中选择Add spring in action in action Capabilities…后提示如下图所示: 选择所需要的spring in action in action包,然后默认下一步,直到完成。 到此...

    Spring攻略(第二版 中文高清版).part2

    1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 工作原理 14 1.4 解决构造程序歧义 17 ...

    Spring3.x企业应用开发实战(完整版) part1

    14.4.3 如何在Spring中进行配置 14.4.4 Spring OXM 简单实例 14.5 小结 第15章 Spring MVC 15.1 Spring MVC概述 15.1.1 体系结构 15.1.2 配置DispatcherServlet 15.1.3 一个简单的实例 15.2 注解驱动的控制器 15.2.1...

    dynamic-datasource-spring-boot-starter-v3.5.1.tar.gz

    提供 自定义数据源来源 方案(如全从数据库加载)。 提供项目启动后 动态增加移除数据源 方案。 提供Mybatis环境下的 纯读写分离 方案。 提供使用 spel动态参数 解析数据源方案。内置spel,session,header,支持...

    ssh(structs,spring,hibernate)框架中的上传下载

     文件数据存储在Blob类型的FILE_CONTENT表字段上,在Spring中采用OracleLobHandler来处理Lob字段(包括Clob和Blob),由于在程序中不需要引用到oracle数据驱动程序的具体类且屏蔽了不同数据库处理Lob字段方法上的...

    Spring API

    6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点运算 7.2.3. AspectJ切入点表达式 7.2.4. 便利的切入...

    spring_batch.zip

    数据源加载在基于DataProperteis的基础上配置了 master slave, 将它们配置成map,map中是多个数据源的主键和数据源属性的映射; 因此, 再通过线程隔离 ThreadLocal 动态数据源上下文来切换数据源; 切换这个操作...

    spring security 参考手册中文版

    第七部分 Spring数据集成 273 38. Spring Data&Spring安全配置 273 39. @Query中的安全表达式 273 第八部分 附录 274 40.安全数据库模式 274 40.1用户模式 274 40.1.1集团当局 274 40.2持久登录(记得我)架构 275 ...

    Spring高级之注解驱动开发视频教程

    合集中的每一项都是针对不同数据存储做的简化封装,使我们在操作不同数据库时,以最简洁的代码完成需求功能。 SpringTest它是针对Junit单元测试的整合。让我们在开发中以及开发后期进行测试时,直接使用Junit结合...

    Struts2+Spring+Hibernate+Ehcache+AJAX+JQuery+Oracle 框架集成用户登录注册Demo工程

    数据量小:只加载当前页的记录进行显示。 5.单数据源配置(兼容Tomcat和Weblogic)。 6.Hibernate继承 HibernateDaoSupport。 7.Spring+Junit4单元测试,优点:不会破坏数据库现场,等等。 2)Demo 导入说明: 1....

Global site tag (gtag.js) - Google Analytics