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

最新文章

  1. xss漏洞修复,待完善
  2. 禁用SQL Server Management Studio的IntelliSense
  3. solr5.5 基于内置jetty配置 Ubuntu
  4. CSS盒子模型元素实际宽度的计算
  5. 编译openssl
  6. 测试GeoGebra博客
  7. Sea.js创始人玉伯的前端开发之路
  8. 短地址TinyURL的API使用
  9. SQL经典笔试题之一
  10. python(1) - 变量小测试
  11. Weka 入门3
  12. HDOJ 1312 (POJ 1979) Red and Black
  13. Django写的投票系统3(转)
  14. erlang R17新socket选项{active,N}
  15. Linux部分命令及通配符用法
  16. sql server 2008怎样导入mdf,ldf文件,怎样解决导入mdf,ldf文件时出现附加数据库错误的问题
  17. DevExpress WinForms使用教程:皮肤颜色和LookAndFeel
  18. ACM 要学
  19. Oracle快速导入数据工具
  20. 使用C#删除一个字符串数组中的空字符串

热门文章

  1. POJ3169
  2. CSS3和HTML5头部定位自用
  3. vue中使用vue-qrcode生成二维码
  4. jsp学习笔记:mvc开发模式
  5. [SD心灵鸡汤]000.每月一则 - 索引
  6. SSI PAYLOAD
  7. vscode jshint 报&#39;import&#39; is only available in ES6 (use &#39;esversion: 6&#39;). (W119)错误
  8. Rocket - tilelink - Xbar
  9. 超干货!为了让你彻底弄懂MySQL事务日志,我通宵肝出了这份图解!
  10. JavaSE(二) 关键字、标识符、注释