`
yangzelin_job09
  • 浏览: 32039 次
  • 性别: 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

    Springcloud 多数库 多数据源整合,查询动态切换数据库

    本主题聚焦于在Spring Cloud环境中实现多数据库和多数据源的整合,并且能够动态切换查询的数据库。这是一个复杂但至关重要的需求,特别是在大型企业级应用中,可能需要根据业务逻辑或用户权限连接到不同的数据库。 ...

    Springboot中使用数据库配置定时任务

    4. 从数据库加载定时任务配置并更新到Spring Boot的配置中。 5. 在业务逻辑类中使用`@Scheduled`注解来定义定时任务,并根据数据库配置动态调整执行频率。 通过这种方式,我们可以灵活地管理和调整应用中的定时任务...

    Spring动态加载配置文件

    在Spring框架中,动态加载配置文件是一项重要的功能,它允许我们在程序运行时改变或更新配置,而无需重启应用。这在开发和生产环境中都具有很高的实用价值,尤其是在配置需要频繁调整或者希望实现热更新的场景下。...

    定时器(quartz+spring)读取数据库配置

    在Spring的配置文件(如applicationContext.xml)中,定义一个`SchedulerFactoryBean`,设置数据库连接信息,并开启从数据库加载Job和Trigger的配置: ```xml &lt;bean id="schedulerFactoryBean" class="org.spring...

    通过Spring Boot配置动态数据源访问多个数据库的实现代码

    Spring Boot配置动态数据源访问多个数据库实现代码详解 通过Spring Boot配置动态数据源访问多个数据库可以实现数据库的动态增删和数量无限的支持,下面将详细介绍该实现代码的知识点。 数据源配置管理 在Spring ...

    Spring Security 安全实例-数据库简单应用(用户从数据库中获取)

    3. **配置数据源**:在Spring Security配置中添加数据源,确保能够连接到数据库。 4. **自定义UserDetailsService**:实现`UserDetailsService`接口,重写`loadUserByUsername`方法,从数据库中查询用户信息。 5. ...

    Spring3.0 配置文件中加载Properties文件的小例子

    本篇将详细讲解如何在Spring 3.0的配置文件中加载Properties文件,以便在运行时动态获取和使用这些配置。 首先,我们需要一个Properties文件,例如`application.properties`,它通常放在项目的类路径根目录下。这个...

    spring Batch实现数据库大数据量读写

    Spring Batch 提供了多种 `ItemReader` 实现,如 JdbcPagingItemReader 和 JdbcCursorItemReader,用于从数据库中读取数据。JdbcPagingItemReader 适用于按页读取数据,而 JdbcCursorItemReader 则是通过数据库游标...

    Spring Security 把授权信息写入数据库

    通过这样的配置,Spring Security能够动态地从数据库中加载用户的授权信息,而不再依赖XML配置。 总结,Spring Security通过数据库存储授权信息,使得安全配置更加灵活,同时降低了维护成本。通过自定义`...

    spring中的数据源配置信息加密方案

    本篇将详细介绍如何在Spring应用中实现数据源配置信息的加密方案。 首先,我们需要理解Spring的配置加载过程。Spring在启动时会读取配置文件(通常是`application.properties`或`application.yml`),其中包含了...

    Spring Security 基于数据库的权限管理配置

    在Spring Boot项目中,可以通过application.properties或application.yml文件配置数据源,例如: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root ...

    echarts从后台数据库获取数据并加载多组曲线

    在本文中,我们将深入探讨如何使用 ECharts 从后台数据库获取数据,并加载多组曲线,以便在 Web 应用程序中展示动态、交互的数据。 首先,要实现这个功能,我们需要以下几部分: 1. **数据接口**:你需要创建一个...

    Spring配置三种数据源及从属性文件中读取DB连接四要素

    Spring Boot支持自动配置,可以从这些文件中自动加载配置。以下是在`application.properties`中的示例: ```properties spring.datasource.master.driver-class-name=com.mysql.jdbc.Driver spring.datasource....

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

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

    Spring-test做数据库操作的单元测试2-跨库访问

    通过在测试类上添加`@RunWith(SpringRunner.class)`注解,我们可以启用Spring的上下文加载,使得测试类中的bean可以直接注入,包括数据源、事务管理器等。 在进行数据库相关的测试时,Spring-test提供了一个关键的...

    spring boot 常用数据库操作例子

    通过不同的配置文件(如`application-db1.properties`,`application-db2.properties`)可以设定不同的数据库连接信息,Spring Boot会自动识别并加载相应的数据源。 2. **JPA实体(Entities)**:这是ORM的核心,是...

    Spring Security数据库认证实例(dao认证)

    - **UserDetailsService**:这是Spring Security的核心服务接口,用于从数据源(如数据库)加载用户信息。你需要实现这个接口来连接你的数据库并获取用户信息。 - **PasswordEncoder**:Spring Security提供了多种...

    基本的spring mvc + spring security实现的登录(无数据库)

    - 这个文件可能是模拟的用户数据,虽然项目无数据库,但可能通过这个文件或其他方式在内存中加载用户信息。 6. **项目结构**: - 通常包含src/main/java目录下的Controller、Service、DAO层以及配置类,src/main/...

    Spring Security 安全实例-数据库应用(用户从数据库中获取) 2

    要从数据库中获取用户信息,我们需要配置Spring Security以连接到我们的数据库。这通常涉及到创建一个自定义的`UserDetailsService`实现,该接口用于加载用户信息。例如,我们可以创建一个名为`...

Global site tag (gtag.js) - Google Analytics