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


相关文章
|
2天前
|
druid Java 关系型数据库
在Spring Boot中集成Druid实现多数据源有两种常用的方式:使用Spring Boot的自动配置和手动配置。
在Spring Boot中集成Druid实现多数据源有两种常用的方式:使用Spring Boot的自动配置和手动配置。
21 5
|
1天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue的数据库课程在线教学的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的数据库课程在线教学的详细设计和实现(源码+lw+部署文档+讲解等)
16 2
|
2天前
|
Java 数据库连接 数据库
实现Spring Boot与MyBatis结合进行数据库历史数据的定时迁移
实现Spring Boot与MyBatis结合进行数据库历史数据的定时迁移
13 2
|
2天前
|
数据库 Android开发 数据安全/隐私保护
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
16 2
|
4天前
|
XML Java 数据格式
Spring Boot自动配置是通过`@EnableAutoConfiguration`注解启用的
【6月更文挑战第18天】Spring Boot的`@EnableAutoConfiguration`启动自动配置,基于类路径扫描和条件注解(如@ConditionalOnClass)选择性应用配置。当检测到特定依赖时,自动配置模块会将对应的bean添加到应用上下文,简化了XML或Java配置。只需添加依赖,即可自动配置功能。
15 4
|
1天前
|
存储 搜索推荐 数据库
软件系统【标签tag功能】的两种数据库设计
软件系统中的标签功能可采用两种数据库设计。方案一,文章和Tag各一表,Tag信息存储在文章表内(`tags`和`tagids`字段),优点是模型简单,但查询效率低且易引发数据冗余和一致性问题。方案二,增加Tagmap表,用于存储标签-文章映射,利于索引查询和数据更新,适用于高效率需求,但结构更复杂。
8 0
软件系统【标签tag功能】的两种数据库设计
|
3天前
|
存储 安全 关系型数据库
安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用&后台模块&Session&Cookie&Token&身份验证&唯一性
安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用&后台模块&Session&Cookie&Token&身份验证&唯一性
|
3天前
|
安全 BI 数据库
数据库大作业——基于qt开发的图书管理系统 (一)环境的配置与项目需求的分析
数据库大作业——基于qt开发的图书管理系统 (一)环境的配置与项目需求的分析
|
4天前
|
存储 数据库 Android开发
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
11 0
|
4天前
|
存储 SQL 数据管理
基于阿里云数据库 SelectDB 版内核 Apache Doris 全新分区策略 Auto Partition 应用场景与功能详解
自动分区的出现进一步简化了复杂场景下的 DDL 和分区表的维护工作,许多用户已经使用该功能简化了工作流程,并且极大的便利了从其他数据库系统迁移到 Doris 的工作,自动分区已成为处理大规模数据和应对高并发场景的理想选择。

热门文章

最新文章