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


相关文章
|
1月前
|
SQL 关系型数据库 MySQL
阿里云RDS云数据库全解析:产品功能、收费标准与活动参考
与云服务器ECS一样,关系型数据库RDS也是很多用户上云必买的热门云产品之一,阿里云的云数据库RDS主要包含RDS MySQL、RDS SQL Server、RDS PostgreSQL、RDS MariaDB等几个关系型数据库,并且提供了容灾、备份、恢复、监控、迁移等方面的全套解决方案,帮助您解决数据库运维的烦恼。本文为大家介绍阿里云的云数据库 RDS主要产品及计费方式、收费标准以及活动等相关情况,以供参考。
|
1月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
345 2
|
2月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
521 5
|
4月前
|
SQL 存储 关系型数据库
MySQL功能模块探秘:数据库世界的奇妙之旅
]带你轻松愉快地探索MySQL 8.4.5的核心功能模块,从SQL引擎到存储引擎,从复制机制到插件系统,让你在欢声笑语中掌握数据库的精髓!
183 26
|
7月前
|
XML 前端开发 Java
SpringBoot实现文件上传下载功能
本文介绍了如何使用SpringBoot实现文件上传与下载功能,涵盖配置和代码实现。包括Maven依赖配置(如`spring-boot-starter-web`和`spring-boot-starter-thymeleaf`)、前端HTML页面设计、WebConfig路径映射配置、YAML文件路径设置,以及核心的文件上传(通过`MultipartFile`处理)和下载(利用`ResponseEntity`返回文件流)功能的Java代码实现。文章由Colorful_WP撰写,内容详实,适合开发者学习参考。
745 0
|
9月前
|
存储 NoSQL 关系型数据库
PolarDB开源数据库进阶课17 集成数据湖功能
本文介绍了如何在PolarDB数据库中接入pg_duckdb、pg_mooncake插件以支持数据湖功能, 可以读写对象存储的远程数据, 支持csv, parquet等格式, 支持delta等框架, 并显著提升OLAP性能。
602 2
|
4月前
|
缓存 前端开发 Java
SpringBoot 实现动态菜单功能完整指南
本文介绍了一个动态菜单系统的实现方案,涵盖数据库设计、SpringBoot后端实现、Vue前端展示及权限控制等内容,适用于中后台系统的权限管理。
417 1
|
6月前
|
存储 缓存 自然语言处理
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
182 8
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
|
6月前
|
安全 Java API
Spring Boot 功能模块全解析:构建现代Java应用的技术图谱
Spring Boot不是一个单一的工具,而是一个由众多功能模块组成的生态系统。这些模块可以根据应用需求灵活组合,构建从简单的REST API到复杂的微服务系统,再到现代的AI驱动应用。