Java 监听机制
SpringBoot 的监听机制,其实是对Java提供的事件监听机制的封装。
Java中的事件监听机制定义了以下几个角色:
- 事件:Event,继承 java.util.EventObject 类的对象
- 事件源:Source ,任意对象Object
- 监听器:Listener,实现 java.util.EventListener 接口 的对象
SpringBoot 监听机制
SpringBoot 在项目启动时,会对几个监听器进行回调,我们可以实现这些监听器接口,在项目启动时完成一些操作。
ApplicationContextInitializer、SpringApplicationRunListener、CommandLineRunner、ApplicationRunner
代码实现
ApplicationRunner和CommandLineRunner会在项目启动后所执行,调用哪个都一样
package com.example.listener.listener; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; import java.util.Arrays; @Component public class MyApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { System.out.println("ApplicationRunner ... run"); System.out.println(Arrays.asList(args.getSourceArgs())); } }
package com.example.listener.listener; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; import java.util.Arrays; @Component public class MyCommandLineRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("CommandLineRunner.... run"); System.out.println(Arrays.asList(args)); } }
其中args调用可以配置传参
实现ApplicationContextInitializer方法,它是在项目还没有准备IOC容器之前调用的,可以检测一些资源是否存在, 需要在resources下创建META-INF/spring.factories并配置
package com.example.listener.listener; import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.stereotype.Component; @Component public class MyApplicationContextInitializer implements ApplicationContextInitializer { @Override public void initialize(ConfigurableApplicationContext applicationContext) { System.out.println("ApplicationContextInitializer ... initialize"); } }
spring.factories配置
org.springframework.context.ApplicationContextInitializer=com.example.listener.listener.MyApplicationContextInitializer
实现SpringApplicationRunListener方法,也需要在resources下创建META-INF/spring.factories并配置
package com.example.listener.listener; import org.springframework.boot.ConfigurableBootstrapContext; import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplicationRunListener; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.env.ConfigurableEnvironment; import java.time.Duration; public class MySpringApplicationRunListener implements SpringApplicationRunListener { public MySpringApplicationRunListener(SpringApplication application, String[] args) {} @Override public void starting(ConfigurableBootstrapContext bootstrapContext) { System.out.println("项目启动中...."); //例如可以检测一些硬件环境是否是好的 } @Override public void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) { System.out.println("环境开始准备...."); } @Override public void contextPrepared(ConfigurableApplicationContext context) { System.out.println("上下文开始准备...."); } @Override public void contextLoaded(ConfigurableApplicationContext context) { System.out.println("上下文开始加载...."); } @Override public void started(ConfigurableApplicationContext context, Duration timeTaken) { System.out.println("加载完成...."); } @Override public void ready(ConfigurableApplicationContext context, Duration timeTaken) { System.out.println("开始运行...."); } @Override public void failed(ConfigurableApplicationContext context, Throwable exception) { System.out.println("项目启动失败...."); } }
spring.factories配置
org.springframework.boot.SpringApplicationRunListener=com.example.listener.listener.MySpringApplicationRunListener
Springboot流程分析
文章评论