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();
}
}