专栏首页云扬四海启动时查看配置文件application.yml

启动时查看配置文件application.yml

Spring Boot Application 事件和监听器

  • 在多环境的情况下。 可能需要切换配置文件的一个对应的属性来切换环境
  • 面临的问题就是 如何在springboot加载完配置文件的时候就可以立即校验对应的属性值

SmartApplicationListener实现监听解耦

  • 我们只需在加载完成之后去加入一个监听器。 就可以得到application.yml的内容。 不然再这个事件之前。都是拿不到对应的内容的

一、SmartApplicationListener介绍

  • Spring ApplicationEvent以及对应的Listener提供了一个事件监听、发布订阅的实现,内部实现方式是观察者模式,可以解耦业务系统之间的业务,提供系统的可拓展性、复用性以及可维护性。
  • 在application.yml文件读取完会触发一个事件ConfigFileApplicationListener 该监听器实现文件的读取。
  • SmartApplicationListener是高级监听器,是ApplicationListener的子类,能够实现有序监听
  • SmartApplicationListener提供了两个方法:
/**
 *  指定支持哪些类型的事件
 */
boolean supportsEventType(Class<? extends ApplicationEvent> var1);

/**
 *  指定支持发生事件所在的类型
 */
boolean supportsSourceType(Class<?> var1);

二、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 {

    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) {
            String banks = ((ApplicationEnvironmentPreparedEvent) event).getEnvironment().getProperty("spring.name");
            if (ToolUtil.isEmpty(BankEnum.getValue(banks))) {
                throw new RuntimeException("请检查  com.enums.BankEnum  中是否拥有该banks环境名字!");
            }
        }

        if (event instanceof ApplicationPreparedEvent) {
        }   
    }
    @Override
    public int getOrder() {
        // 写在加载配置文件之后
        return ConfigFileApplicationListener.DEFAULT_ORDER + 1;
    }

}
  • 并且在main方法中加入该监听器
public class XProApplication {

    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(XProApplication.class);
        springApplication.addListeners(new AfterConfigListener());
        springApplication.run(args);
    }

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    yunlgonn
  • MyBatis-plus二级缓存使用

    yunlgonn
  • Spring中重要的注解

    现在大部分的Spring项目都会用到注解。使用注解来替换xml,一行简单的注解就可以解决很多事情。但是你真的懂其中的原理吗。

    yunlgonn
  • 一张图看懂全球15大领先科技成果

    来源:钱塘号 益路同行

    钱塘数据
  • 简单工厂、工厂方法、抽象工厂的比较与分析

    智慧zhuhuix
  • CephFS源码分析

    Lucien168
  • 谈谈NAT:什么?全球IP和私有IP是什么鬼?

    可能你们会经常听到全球 IP(外网)和私有 IP(内网),他们的区别是什么呢?今天这篇文章来简单讲讲这到底是怎么回事。

    帅地
  • Java设计模式|简单工厂模式

    简单工厂模式是类的创建模式,又叫做静态工厂方法模式。简单工厂模式由一个工厂对象决定生产出哪一种产品类的实例。

    技术从心
  • ASP.NET Core 一个接口多个实现的依赖注入与动态选择

    ASP.NET Core 自带的依赖注入(DI)非常实用,但是当一个接口有多个实现的时候怎么操作呢?运行时能否根据配置选择其中一种实现呢?能不能不用反射呢?很多...

    Edi Wang
  • 为什么要选择单细胞核RNA测序?

    单细胞RNA测序技术的高通量和敏感性使其非常适合于全面绘制细胞状态的变化。但是在肾脏和其他固体组织中(尤其是对于高上皮含量的组织,以及以细胞外基质为特征的固体组...

    用户7627119

扫码关注云+社区

领取腾讯云代金券