Spring Boot 在启动时进行配置文件加解密的方法详解
作者:云扬四海lv-1 发布时间:2023-11-12 17:13:54
寻找到application.yml的读取的操作。
从spring.factories 中查看到
# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.context.config.ConfigFileApplicationListener,\
ConfigFileApplicationListener 该对象对application.yml进行读取操作
ConfigFileApplicationListener 事件的 * , 继承了SmartApplicationListener接口
SmartApplicationListener 接口继承了ApplicationListener 和 Ordered接口,能够实现有序监听。
一、SmartApplicationListener介绍
Spring ApplicationEvent以及对应的Listener提供了一个事件监听、发布订阅的实现,内部实现方式是观察者模式,可以解耦业务系统之间的业务,提供系统的可拓展性、复用性以及可维护性。
在application.yml文件读取完会触发一个事件ConfigFileApplicationListener 该 * 实现文件的读取。
SmartApplicationListener是高级 * ,是ApplicationListener的子类,能够实现有序监听
SmartApplicationListener提供了两个方法:
/**
* 指定支持哪些类型的事件
*/
boolean supportsEventType(Class<? extends ApplicationEvent> var1);
/**
* 指定支持发生事件所在的类型
*/
boolean supportsSourceType(Class<?> var1);
如何在 SmartApplicationListener 实现监听解耦
1、我们只需在加载完成之后去加入一个 * 。
2、继承SmartApplicationListener接口
3、设置order属性决定 * 的顺序 ConfigFileApplicationListener.DEFAULT_ORDER + 1
4、将application.yml内容读取之后并修改
二、ConfigFileApplicationListener
ConfigFileApplicationListener 是用来 读取配置文件的。 可以这样来粗劣的介绍一下
详情可以请看 springboot启动时是如何加载配置文件application.yml文件
三、最终结果:
新增一个 * 既然我们要在配置文件加载之后搞事情那么我们直接复制ConfigFileApplicationListener 的实现方式
删除一下不需要处理的操作(大概就是以下代码) 并且order在ConfigFileApplicationListener 之后
public class AfterConfigListener implements SmartApplicationListener,Ordered {
public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
return ApplicationEnvironmentPreparedEvent.class.isAssignableFrom(eventType) || ApplicationPreparedEvent.class.isAssignableFrom(eventType);
}
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ApplicationEnvironmentPreparedEvent) {
}
if (event instanceof ApplicationPreparedEvent) {
}
}
@Override
public int getOrder() {
// 写在加载配置文件之后
return ConfigFileApplicationListener.DEFAULT_ORDER + 1;
}
}
这样子就完成了配置文件之后的代码监听。 SmartApplicationListener又是实现了ApplicationListener的监听的,那么我们可以在onApplicationEvent执行代码。
完善代码如下。 监听并且获取配置文件内容
public class AfterConfigListener implements SmartApplicationListener,Ordered {
// 复制的ConfigFileApplicationListener文件内容
public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
return ApplicationEnvironmentPreparedEvent.class.isAssignableFrom(eventType) || ApplicationPreparedEvent.class.isAssignableFrom(eventType);
}
public void onApplicationEvent(ApplicationEvent event) {
// ApplicationEnvironmentPreparedEvent 是加载配置文件,初始化日志系统的事件。
if (event instanceof ApplicationEnvironmentPreparedEvent) {
// 获得原来的password内容
String password = ((ApplicationEnvironmentPreparedEvent) event).getEnvironment().getProperty("spring.datasource.password");
// 进行密码的解密
System.setProperty("spring.datasource.password", SM4Utils.encryptData_ECB(password));
}
if (event instanceof ApplicationPreparedEvent) {
}
}
@Override
public int getOrder() {
// 设置该 * 在加载配置文件之后执行
return ConfigFileApplicationListener.DEFAULT_ORDER + 1;
}
}
并且在main方法中加入该 *
public class Application {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(Application.class);
springApplication.addListeners(new AfterConfigListener());
springApplication.run(args);
}
}
来源:https://juejin.im/post/5ee81dede51d45787b3fd254


猜你喜欢
- 背景:在写登录界面时,老板就觉得在输入密码的时候谈出来的输入法软键盘把登录按钮遮挡住了(入下图所示,不爽),连输入框都被挡了一半
- 方法一:调用windows自带的shutdown.exe (缺点:会出现倒计时窗口)System.Diagnostics.Process.S
- 本文实例为大家分享了Java控制台实现猜拳游戏的具体代码,供大家参考,具体内容如下1、目标通过控制台实现一个人机对战的猜拳游戏,用户通过输入
- 一、简介现在的Android应用程序中,不可避免的都会使用到图片,如果每次加载图片的时候都要从网络重新拉取,这样不但很耗费用户的流量,而且图
- (效果如上图所示)其实很简单:比方说上面的容器是一个ListView<ListView android:id="@+id/l
- 本文实例讲述了C#自定义签名章实现方法。分享给大家供大家参考。具体实现方法如下:using System;using System.Coll
- 本文实例为大家分享了C#实现chart控件动态曲线绘制的具体代码,供大家参考,具体内容如下思想实验室要做一个动态曲线绘制,网上方法很多,但是
- 本文实例讲述了Java基于二叉查找树实现排序功能。分享给大家供大家参考,具体如下:/** * 无论排序的对象是什么,都要实现Comparab
- springboot对kafka的client很好的实现了集成,使用非常方便,本文也实现了一个在springboot中实现操作kafka的d
- 在开发中经常使用到Set集合去重,那么去重的原理是怎样实现的呢?在此文章记录一下去重原理!!!下面是set集合类图下面我们来跟踪一下执行过程
- 一. 关于变量在之前的文章中,已经给大家详细地介绍过变量相关的内容,比如变量的概念、命名规范、变量的定义及底层原理等内容。但其实变量还有作用
- 本文实例分析了c#对象初始化顺序。分享给大家供大家参考。具体如下:using System;using System.Collections
- 前言android 防止重复点击是一个非常常见的需求,每个人都有各自的点击事件的处理习惯,有的喜欢使用匿名内部类,有的activity、fr
- 1.JSON ExtractorJson extractor 后置处理器用在返回格式为 Json 的 HTTP 请求中,用来获取返回的 Js
- 之前百度,google了很多,发现并没有介绍mongodb生产环境如何配置的文章, 当时想参考下都不行, 所以写篇文章,大家可以一块讨论下.
- tk.mybatis扩展自己的通用mapper目的:tk.mybatis 提供的通用mapper,虽然使用方便,不过在有些sql还是不能满足
- 一、什么是设计模式设计模式(Design pattern) 是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一
- 面试题1:你了解线程池么?简单介绍一下。java提供的一个java.util.concurrent.Executor接口的实现用于创建线程池
- 一.mybatis的配置1.1 添加相应的jar包在lib文件夹下面添加mybatis的核心jar包以及依赖的jar包同在lib文件夹下面加
- 为了创建比例大小的子View,可以将LinearLayout的宽度和高度设为fill_parent, 而将子View的宽度或是高度设为0,然