前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Boot 在启动时进行配置文件加解密

Spring Boot 在启动时进行配置文件加解密

作者头像
云扬四海
发布2020-06-16 18:43:23
1.7K0
发布2020-06-16 18:43:23
举报
文章被收录于专栏:云扬四海云扬四海云扬四海

Spring Boot Application 事件和监听器

  • 寻找到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 的实现方式
  • 删除一下不需要处理的操作(大概就是以下代码) 并且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);
    }

}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-06-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring Boot Application 事件和监听器
    • 一、SmartApplicationListener介绍
      • 如何在 SmartApplicationListener 实现监听解耦
        • 二、ConfigFileApplicationListener
        • 三、最终结果:
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档