写点什么

springboot 从数据库中获取 application 配置

作者:小黄鸡1992
  • 2021 年 11 月 16 日
  • 本文字数:2067 字

    阅读完需:约 7 分钟

springboot从数据库中获取application配置

在一次开发中,领导提供了一个需求,将 springboot 配置文件的值存放在数据库中,并且能否动态更改。在调用后,决定先做了一个初版。

1.实现代码

import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;import java.util.Map;
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;import org.springframework.boot.origin.OriginTrackedValue;import org.springframework.context.ApplicationListener;import org.springframework.core.env.MutablePropertySources;import org.springframework.core.env.PropertySource;

public class ConfigureListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {
@Override public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) { Connection conn = null; Statement st = null; ResultSet rs = null; // 获取spring Environment MutablePropertySources propertySources = event.getEnvironment().getPropertySources(); // 配置放在了application-pro或者是application-dev 中 赋值复制需要在其中赋值 for (PropertySource<?> propertySource : propertySources) { boolean applicationConfig = propertySource.getName().contains("application-"); if (!applicationConfig) { continue; } // 获取上文的application集合中获取数据库连接 Map<String, OriginTrackedValue> dataBaseSource = (Map<String, OriginTrackedValue>)propertySource.getSource(); String driverClass = String.valueOf(dataBaseSource.get("spring.datasource.driver-class-name").getValue()); String url = String.valueOf(dataBaseSource.get("spring.datasource.url").getValue()); String user = String.valueOf(dataBaseSource.get("spring.datasource.username").getValue()); String password = String.valueOf(dataBaseSource.get("spring.datasource.password").getValue()); // 因为在spring初始化之前 所有不能使用注解 所以需要jdbc直接连接数据库 首先建立驱动 try { Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager.getConnection(url, user, password); // 1、获取连接对象 // 2、创建statement类对象,用来执行SQL语句!! st = conn.createStatement(); // 3、创建sql查询语句 String sql = "select * from SYS_CONFIGURE"; // 4、执行sql语句并且换回一个查询的结果集 rs = st.executeQuery(sql); while (rs.next()) { // 获取数据库中的数据 String item = rs.getString("ITEM"); String itemValue = rs.getString("ITEM_VALUE"); // 通过数据库中的配置 修改application集合中数据 Map<String, OriginTrackedValue> source = (Map<String, OriginTrackedValue>)propertySource.getSource(); OriginTrackedValue originTrackedValue = source.get(item); OriginTrackedValue newOriginTrackedValue = OriginTrackedValue.of(itemValue, originTrackedValue.getOrigin()); source.put(item, newOriginTrackedValue); } } catch (Exception e) { e.printStackTrace(); } } }}
复制代码


@SpringBootApplicationpublic class TestApplication {
public static void main(String[] args) { SpringApplication app = new SpringApplication(TestApplication.class); app.addListeners(new ConfigureListener()); app.run(args); }}
复制代码

2.原理简介

在 springboot 初始化时,会识别 application .xml,并将扫描到的配置类放于 MutablePropertySources 中,在执行初始化后,将会执行 addListeners,在 addListeners 中重新复写了 MutablePropertySources 对象。将从数据库中查询到的配置覆盖到已经查询到的对象中,从而实现配置文件的更改。


获取MutablePropertySources 代码。MutablePropertySources propertySources = event.getEnvironment().getPropertySources();
复制代码

3.使用中间件

最后该方案只是做了一个 demo。建议使用 apollo 或者 nacos 作为配置中心。功能更加的强大且更为稳定。何苦自己造轮子呢。。。​

用户头像

小黄鸡1992

关注

小黄鸡加油 2021.07.13 加入

一位技术落地与应用的博主,带你从入门,了解和使用各项顶流开源项目。

评论

发布
暂无评论
springboot从数据库中获取application配置