如何从properties文件和数据库读取相关配置

4 篇文章 1 订阅
4 篇文章 0 订阅

当配置项太多或者有几套配置项的时候,我们不光从properties文件中读取配置项,还要从数据库中读取配置项。从数据库中读取配置项可以通过PropertyPlaceholderConfigurer的子类来实现。

假设数据源配置在conf.properties中,先在该文件中配置properties文件的路径(这里是为了从文件中读取配置项)。
数据源配置

<!-- load conf.properties -->
    <bean id="sysPropertyPlaceHolder" class="com.cloud.extend.spring.ExtendSpringPropertyPlaceholder">
        <property name="locations">
            <list>
                <value>classpath:conf.properties</value>
            </list>
        </property>
    </bean>

配置表如下:

配置表

其中ExtendSpringPropertyPlaceholder是继承了PropertyPlaceholderConfigurer的子类,具体实现如下:

package com.cloud.extend.spring;


import com.mysql.jdbc.Connection;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

import java.io.IOException;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;

/**
 * @Author: Mr.Li
 * @Date: Created on 2019/5/13
 * 当spring加载配置文件时,将配置文件的键值在SystemPropertyCache中初始化
 */
public class ExtendSpringPropertyPlaceholder extends PropertyPlaceholderConfigurer {
    private static final Logger logger = LoggerFactory.getLogger(PropertyPlaceholderConfigurer.class);

    private String driverClass = null;
    private String url = null;
    private String userName = null;
    private String password = null;

    static java.sql.Connection conn = null;

    private String sql =
        "select property_key,property_value from property_config_data where property_type = ? order by property_type";

    /**
     * 重载父类
     */
    @Override protected void processProperties(ConfigurableListableBeanFactory factory, Properties props)
        throws BeansException {
        Properties location_props = null;
        try {
            //获取父类配置文件
            location_props = super.mergeProperties();
        } catch (IOException e) {
            logger.error(" location_props Error ", e);
        }
        if (location_props == null) {
            location_props = new Properties();
        }
        Connection conn = null;
        try {
            driverClass = location_props.getProperty("jdbc.driver");
            url = location_props.getProperty("jdbc.url");
            userName = location_props.getProperty("jdbc.username");
            password = location_props.getProperty("jdbc.password");
            conn = (Connection) getConn(driverClass, url, userName, password);
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, "1");
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                String key = rs.getString("property_key");
                if (key.startsWith(" ") || key.endsWith(" ")) {
                    logger.warn("************************************************ key contain space,key=[{}]", key);
                    key = key.trim();
                }
                if (StringUtils.isBlank(key)) {
                    continue;
                }
                String value = rs.getString("property_value");
                if (null != value) {
                    if (key.startsWith("system.")) {
                        System.setProperty(key.substring(7), value);
                    } else {
                        location_props.put(key, value);
                    }
                }
            }
        } catch (Exception e) {
            logger.error("SQL Erroe", e);
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (Exception e) {
                logger.error("Close Error", e);
            }
        }
        super.processProperties(factory, location_props);
        for (Object key : location_props.keySet()) {
            String keyStr = key.toString();
            String value = location_props.getProperty(keyStr);
            SystemPropertyCache.put(keyStr, value);
        }
    }

    // 创建连接
    public static java.sql.Connection getConn(
        String driverClass, String url, String userName, String psssword) {
        try {
            Class.forName(driverClass);
            conn = DriverManager.getConnection(url, userName, psssword);
        } catch (Exception e) {
            System.out.println("--找不到驱动程序类 ,加载驱动失败!--");
            e.printStackTrace();
        }
        return conn;
    }
}
可以看到,bean实例化时会调用processProperties方法,从数据库中查询property_type = setting的记录,然后把对应的properties_key和properties_value放入Property类型的内存对象location_props中。然后就可以通过“@{xxxx(这里的xxx是location_props对象的key,也是数据库中properties_key字段)}”来进行注入了。

其他文件省略。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于从 properties 文件读取配置项,您可以使用 Java 的 Properties 类来实现。以下是一个简单的示例代码: ```java import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; public class ConfigReader { private Properties properties; public ConfigReader(String filePath) { properties = new Properties(); try { FileInputStream fileInputStream = new FileInputStream(filePath); properties.load(fileInputStream); fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } public String getProperty(String key) { return properties.getProperty(key); } public static void main(String[] args) { ConfigReader configReader = new ConfigReader("config.properties"); String username = configReader.getProperty("db.username"); String password = configReader.getProperty("db.password"); System.out.println("Username: " + username); System.out.println("Password: " + password); } } ``` 上述代码创建了一个 ConfigReader 类,通过构造函数传入 properties 文件的路径,并提供了一个 getProperty 方法用于获取指定键的配置项值。在 main 方法中,我们创建了一个 ConfigReader 对象,并从配置文件中获取了数据库的用户名和密码。 至于从数据库读取配置项,可以使用 JDBC 连接数据库,并执行 SQL 查询来获取相应的配置项值。以下是一个简单的示例代码: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBConfigReader { private Connection connection; public DBConfigReader(String url, String username, String password) { try { connection = DriverManager.getConnection(url, username, password); } catch (SQLException e) { e.printStackTrace(); } } public String getProperty(String key) { String value = null; try { Statement statement = connection.createStatement(); String query = "SELECT value FROM config WHERE key = '" + key + "'"; ResultSet resultSet = statement.executeQuery(query); if (resultSet.next()) { value = resultSet.getString("value"); } statement.close(); } catch (SQLException e) { e.printStackTrace(); } return value; } public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/mydb"; String username = "root"; String password = "password"; DBConfigReader dbConfigReader = new DBConfigReader(url, username, password); String apiKey = dbConfigReader.getProperty("api.key"); System.out.println("API Key: " + apiKey); } } ``` 上述代码创建了一个 DBConfigReader 类,通过构造函数传入数据库的 URL、用户名和密码,提供了一个 getProperty 方法用于执行 SQL 查询并获取指定键的配置项值。在 main 方法中,我们创建了一个 DBConfigReader 对象,并从数据库中获取了 API 密钥。 请注意,以上只是示例代码,您需要根据实际情况进行适当的修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值