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

来源:互联网 发布:安装sql server 2008 编辑:程序博客网 时间:2024/06/09 23:40

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


0 0
原创粉丝点击