重写Spring的PropertyPlaceholderConfigurer,从数据库加载配置数据

这篇博客介绍了如何重写Spring的PropertyPlaceholderConfigurer,通过自定义的DataBasePropertyPlaceholderConfigurer bean,从数据库中动态加载系统配置属性,以实现更灵活的配置管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,applicationContext.xml

用自定义扩展类DataBasePropertyPlaceholderConfigurer替换Spring的PropertyPlaceholderConfigurer

<!-- 从数据库配置表加载系统配置属性 -->
<bean id="dataBasePropertyConfigurer" class="com.crc.util.DataBasePropertyPlaceholderConfigurer">
</bean>

2,DataBasePropertyPlaceholderConfigurer.java

package com.crc.util;

import java.util.Properties;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

public class DataBasePropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer
{
	@Override
	public Properties mergeProperties() 
	{
		return ConfigPropertiesUtil.getProperties();
	}
	
}

3,ConfigPropertiesUtil.java,从数据库读取配置数据的工具类

package com.crc.util;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class ConfigPropertiesUtil
{
	private static final String JNDI_PREFIX = "java:comp/env/";
	private static final String JNDI_NAME = "jdbc/reimburse";
	
	private static Properties properties = null;
	
	private static final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();

	private static final String queryString = "select t.property_key, t.property_value from appmgr.t_config_properties t";

	private static final Logger logger = LoggerFactory.getLogger(ConfigPropertiesUtil.class);
	
	
	private ConfigPropertiesUtil() {
		
	}
	
	
	public static String getValueByKey(String key)
	{
		if(key == null || "".equals(key.trim()))
		{
			return "";
		}
		
		loadProperties();
		
		return properties.get(key) == null ? "" : properties.get(key).toString();
	}
	
	
	public static Properties getProperties()
	{
		loadProperties();
		return properties;
	}
	
	
	private static void loadProperties()
	{
		readWriteLock.readLock().lock();
		
		if(properties == null)
		{
			readWriteLock.readLock().unlock();
			readWriteLock.writeLock().lock();
			
			if(properties == null)
			{
				properties = new Properties();
				
				DataSource dataSource = null;
				Connection connection = null;
				PreparedStatement statement = null;
				ResultSet resultSet = null;
				
				Context context = null;
				try
				{
					context = new InitialContext();
				}
				catch(NamingException e3)
				{
					logger.error("初始化JNDI上下文出错(加载系统配置数据):", e3);
					readWriteLock.writeLock().unlock();
					return;
				}
				
				try
				{
					dataSource = (DataSource)(context.lookup(JNDI_NAME));
				}
				catch(NamingException e1)
				{
					try
					{
						dataSource = (DataSource)(context.lookup(JNDI_PREFIX + JNDI_NAME));
					}
					catch(NamingException e2)
					{
						logger.error("获取JNDI数据源出错(加载系统配置数据):", e2);
						readWriteLock.writeLock().unlock();
						return;
					}
				}
				
				try
				{
					connection = dataSource.getConnection();
					statement = connection.prepareStatement(queryString);
					resultSet = statement.executeQuery();
					
					while(resultSet.next())
					{
						properties.setProperty(resultSet.getString(1), resultSet.getString(2) == null ? "" : resultSet.getString(2).trim());
					}
					
					logger.info("==========================加载配置数据开始============================");
					logger.info(properties.toString());
					logger.info("==========================加载配置数据结束============================");
				}
				catch(Exception e)
				{
					logger.error("加载系统配置数据出错:", e);
				}
				finally
				{
					if(resultSet != null)
					{
						try
						{
							resultSet.close();
						}
						catch(SQLException e)
						{
							e.printStackTrace();
						}
					}
					if(statement != null)
					{
						try
						{
							statement.close();
						}
						catch(SQLException e)
						{
							e.printStackTrace();
						}
					}
					if(connection != null)
					{
						try
						{
							connection.close();
						}
						catch(SQLException e)
						{
							e.printStackTrace();
						}
					}
				}
			}
			
			readWriteLock.readLock().lock();
			readWriteLock.writeLock().unlock();
		}
		
		readWriteLock.readLock().unlock();
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值