三、Spring Boot 事件监听机制
在启动流程中,有几个监听器非常重要
- ApplicationContextInitializer
- SpringApplicationRunListener
- ApplicationRunner
- CommandLineRunner 可以自定义监听器实现这些提供的监听器,通过启动应用看这些监听器在什么时候运行
实现自定义的ApplicationContextListener
ApplicationContextListener接口中包含了一个initialize()方法
自定义监听器HalloApplicationContextListener并实现ApplicationContextListener接口,泛型为ConfigurableApplicationContext,既监听IOC容器的启动。
public class HalloApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { @Override public void initialize(ConfigurableApplicationContext applicationContext) { System.out.println("自定义的" + this.getClass().getName() + "运行了,IoC容器:" + applicationContext); } } 复制代码
实现自定义的SpringApplicationRunListener
SpringApplicationRunListener接口中的方法都是定义为defualt
实现自定义的HalloSpringApplicationRunListener时不是必须要实现所有的方法
public class HalloSpringApplicationRunListener implements SpringApplicationRunListener { @Override public void starting(ConfigurableBootstrapContext bootstrapContext) { System.out.println(this.getClass().getSimpleName() + "启动了......"); } @Override public void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) { String OSName = (String)environment.getSystemProperties().get("获取到的系统名称为:" + "os.name"); System.out.println(this.getClass().getSimpleName() + "环境准备好了,获取到的系统名称为:" + OSName); } @Override public void contextPrepared(ConfigurableApplicationContext context) { System.out.println(this.getClass().getSimpleName() + "IOC容器准备好了....."); } @Override public void contextLoaded(ConfigurableApplicationContext context) { System.out.println(this.getClass().getSimpleName() + "容器加载完成....."); } @Override public void started(ConfigurableApplicationContext context, Duration timeTaken) { System.out.println(this.getClass().getSimpleName() + "容器启动完成,耗时:" + timeTaken); } } 复制代码
实现自定义的ApplicationRunner
ApplicationRunner接口只只包含了一个run()方法
自定义HalloApplicationRunner实现ApplicationRunner接口
public class HalloApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { System.out.println(this.getClass().getSimpleName() + "运行ing...."); } } 复制代码
实现自定义的CommandLineRunner
CommandLineRunner接口中只有一个run()方法
自定义HalloCommandLineRunner类实现CommandLineRunner
public class HalloCommandLineRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println(this.getClass().getSimpleName() + "运行ing,传入的参数为:" + Arrays.asList(args)); } } 复制代码
配置自定义组件
HalloCommandLineRunner和HalloApplicationRunner需要通过添加@Component注解注册到容器中
HalloApplicationContextInitializer和HalloSpringApplicationRunListener 需要配置META-INF/spring.factories配置文件中,在resources目录下新建META-INF/spring.factories配置文件,而配置文件的具体内容可以参看源码中spring.factories中的配置
# Initializers org.springframework.context.ApplicationContextInitializer=\ com.lilith.listener.HalloApplicationContextInitializer # Application Listeners org.springframework.boot.SpringApplicationRunListener=\ com.lilith.listener.HalloSpringApplicationRunListener 复制代码
测试监听器是否生效
启动应用
控制台报错缺少一个有参构造器
HalloSpringApplicationRunListener中增加一个有参构造器,可以参考SpringApplicationRunListener的另一个实现类EventPublishingRunListener
public HalloSpringApplicationRunListener(SpringApplication application, String[] args) { } 复制代码
再次启动应用
控制台打印出了监听器中输出的信息