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