springboot高级功能(七)在数据库中获取application配置

简介: springboot高级功能(七)在数据库中获取application配置


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();
            }
        }
    }
}
@SpringBootApplication
public class TestApplication {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(TestApplication.class);
        app.addListeners(new ConfigureListener());
        app.run(args);
    }
}

2.简介

在spring boot初始化时 会读取application 放在MutablePropertySources 中  我们会读取配置MutablePropertySources 然后查询数据库 根据key查询之后 重新覆盖(因为以上操作时 bean  factory还没有初始化 所以用jdbc)

而以上拦截器会在读取application后立刻执行 不会马后炮(当spring boot初始化之后在更改MutablePropertySources )

获取MutablePropertySources 
MutablePropertySources propertySources = event.getEnvironment().getPropertySources();


相关文章
|
5天前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
22 0
|
14天前
|
SQL Java 数据库连接
深入 MyBatis-Plus 插件:解锁高级数据库功能
Mybatis-Plus 提供了丰富的插件机制,这些插件可以帮助开发者更方便地扩展 Mybatis 的功能,提升开发效率、优化性能和实现一些常用的功能。
95 26
深入 MyBatis-Plus 插件:解锁高级数据库功能
|
10天前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
22 2
 SpringBoot入门(7)- 配置热部署devtools工具
|
8天前
|
Java 数据库连接
SpringBoot配置多数据源实战
第四届光学与机器视觉国际学术会议(ICOMV 2025) 2025 4th International Conference on Optics and Machine Vision
36 8
|
6天前
|
Java 数据库连接 数据库
springboot启动配置文件-bootstrap.yml常用基本配置
以上是一些常用的基本配置项,在实际应用中可能会根据需求有所变化。通过合理配置 `bootstrap.yml`文件,可以确保应用程序在启动阶段加载正确的配置,并顺利启动运行。
12 2
|
17天前
|
Java Spring 容器
SpringBoot读取配置文件的6种方式,包括:通过Environment、@PropertySource、@ConfigurationProperties、@Value读取配置信息
SpringBoot读取配置文件的6种方式,包括:通过Environment、@PropertySource、@ConfigurationProperties、@Value读取配置信息
43 3
|
17天前
|
XML 数据库 数据格式
数据库 校验名称唯一性,用于新增和修改功能
数据库 校验名称唯一性,用于新增和修改功能
32 1
|
28天前
|
druid Java Maven
|
20天前
|
XML 数据库 数据格式
数据库 校验名称唯一性,用于新增和修改功能
数据库 校验名称唯一性,用于新增和修改功能
21 0
|
Java 数据库 Spring
【SpringBoot】数据库操作与事务管理
【SpringBoot】数据库操作与事务管理
121 0