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 Cloud环境中实现多数据库和多数据源的整合,并且能够动态切换查询的数据库。这是一个复杂但至关重要的需求,特别是在大型企业级应用中,可能需要根据业务逻辑或用户权限连接到不同的数据库。 ...
4. 从数据库加载定时任务配置并更新到Spring Boot的配置中。 5. 在业务逻辑类中使用`@Scheduled`注解来定义定时任务,并根据数据库配置动态调整执行频率。 通过这种方式,我们可以灵活地管理和调整应用中的定时任务...
在Spring框架中,动态加载配置文件是一项重要的功能,它允许我们在程序运行时改变或更新配置,而无需重启应用。这在开发和生产环境中都具有很高的实用价值,尤其是在配置需要频繁调整或者希望实现热更新的场景下。...
在Spring的配置文件(如applicationContext.xml)中,定义一个`SchedulerFactoryBean`,设置数据库连接信息,并开启从数据库加载Job和Trigger的配置: ```xml <bean id="schedulerFactoryBean" class="org.spring...
Spring Boot配置动态数据源访问多个数据库实现代码详解 通过Spring Boot配置动态数据源访问多个数据库可以实现数据库的动态增删和数量无限的支持,下面将详细介绍该实现代码的知识点。 数据源配置管理 在Spring ...
3. **配置数据源**:在Spring Security配置中添加数据源,确保能够连接到数据库。 4. **自定义UserDetailsService**:实现`UserDetailsService`接口,重写`loadUserByUsername`方法,从数据库中查询用户信息。 5. ...
本篇将详细讲解如何在Spring 3.0的配置文件中加载Properties文件,以便在运行时动态获取和使用这些配置。 首先,我们需要一个Properties文件,例如`application.properties`,它通常放在项目的类路径根目录下。这个...
Spring Batch 提供了多种 `ItemReader` 实现,如 JdbcPagingItemReader 和 JdbcCursorItemReader,用于从数据库中读取数据。JdbcPagingItemReader 适用于按页读取数据,而 JdbcCursorItemReader 则是通过数据库游标...
通过这样的配置,Spring Security能够动态地从数据库中加载用户的授权信息,而不再依赖XML配置。 总结,Spring Security通过数据库存储授权信息,使得安全配置更加灵活,同时降低了维护成本。通过自定义`...
本篇将详细介绍如何在Spring应用中实现数据源配置信息的加密方案。 首先,我们需要理解Spring的配置加载过程。Spring在启动时会读取配置文件(通常是`application.properties`或`application.yml`),其中包含了...
在Spring Boot项目中,可以通过application.properties或application.yml文件配置数据源,例如: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root ...
在本文中,我们将深入探讨如何使用 ECharts 从后台数据库获取数据,并加载多组曲线,以便在 Web 应用程序中展示动态、交互的数据。 首先,要实现这个功能,我们需要以下几部分: 1. **数据接口**:你需要创建一个...
Spring Boot支持自动配置,可以从这些文件中自动加载配置。以下是在`application.properties`中的示例: ```properties spring.datasource.master.driver-class-name=com.mysql.jdbc.Driver spring.datasource....
博客地址:... 1. 启动后访问http://localhost:8848/code,可见控制台输出codeMap中的值 2. 新建一个只有key和value两个字段的表code 3. 不要轻易浪费积分下载代码,没什么实质内容
通过在测试类上添加`@RunWith(SpringRunner.class)`注解,我们可以启用Spring的上下文加载,使得测试类中的bean可以直接注入,包括数据源、事务管理器等。 在进行数据库相关的测试时,Spring-test提供了一个关键的...
通过不同的配置文件(如`application-db1.properties`,`application-db2.properties`)可以设定不同的数据库连接信息,Spring Boot会自动识别并加载相应的数据源。 2. **JPA实体(Entities)**:这是ORM的核心,是...
- **UserDetailsService**:这是Spring Security的核心服务接口,用于从数据源(如数据库)加载用户信息。你需要实现这个接口来连接你的数据库并获取用户信息。 - **PasswordEncoder**:Spring Security提供了多种...
- 这个文件可能是模拟的用户数据,虽然项目无数据库,但可能通过这个文件或其他方式在内存中加载用户信息。 6. **项目结构**: - 通常包含src/main/java目录下的Controller、Service、DAO层以及配置类,src/main/...
要从数据库中获取用户信息,我们需要配置Spring Security以连接到我们的数据库。这通常涉及到创建一个自定义的`UserDetailsService`实现,该接口用于加载用户信息。例如,我们可以创建一个名为`...