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

标签:Spring,Boot,加解密
0
投稿

猜你喜欢

  • java接口私有方法实现过程解析

    2021-10-28 01:51:23
  • Javassist之一秒理解java动态编程

    2023-11-09 09:36:33
  • C++程序中启动线程的方法

    2023-06-28 03:35:02
  • Java Annotation(Java 注解)的实现代码

    2023-01-09 00:36:17
  • SpringBoot实现配置文件的替换

    2023-11-21 22:27:16
  • C# 填充Excel图表、图例背景色的实例代码

    2023-08-06 04:01:31
  • 非常好看的android音量旋钮

    2021-09-08 00:35:53
  • 详解SpringCloud Ribbon 负载均衡通过服务器名无法连接的神坑

    2021-06-01 07:28:41
  • mybatis 报错显示sql中有两个limit的解决

    2022-04-30 02:50:49
  • Linux下g++编译与使用静态库和动态库的方法

    2023-06-21 13:41:46
  • gradle中的增量构建浅析

    2022-09-23 06:43:13
  • Android实现输入法弹出时把布局顶上去和登录按钮顶上去的解决方法

    2022-11-10 15:07:26
  • Java微信公众平台之获取地理位置

    2021-05-28 19:36:40
  • Java Fluent Mybatis 分页查询与sql日志输出详解流程篇

    2023-01-06 05:35:43
  • 详解jeefast和Mybatis实现二级联动的问题

    2022-11-10 05:10:15
  • c#中task与thread区别及其使用的方法示例

    2021-08-06 13:59:10
  • Java中锁的实现和内存语义浅析

    2021-06-04 01:09:49
  • Android基础之Fragment与Activity交互详解

    2021-12-25 16:02:11
  • 一文带你了解SpringBoot的启动原理

    2023-11-28 20:44:42
  • Java NegativeArraySizeException异常解决方案

    2023-10-31 07:16:51
  • asp之家 软件编程 m.aspxhome.com