博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot(3)— 事件监听机制
阅读量:4030 次
发布时间:2019-05-24

本文共 4470 字,大约阅读时间需要 14 分钟。

SpringBoot版本:2.1.1.RELEASE

在SpringApplication对象创建和run()方法的运行过程中,我们可以发现有几个重要的事件回调机制,分别是:

  1. ApplicationContextInitializer
  2. SpringApplicationRunListener
  3. ApplicationRunner
  4. CommandLineRunner

这几个重要的事件回调机制在很多环境下都有应用,例如:

  1. 启动前的环境检测
  2. 启动时的配置初始化
  3. 启动后的数据初始化

下面将会对这四个事件回调机制进行详细的讲解:

  1. ApplicationContextInitializer

    首先SpringBoot项目启动时,会先创建SpringApplication对象,在创建对象过程中,会将根路径下的META-INF/spring.factories 文件中的 key为org.springframework.context.ApplicationContextInitializer的值加入SpringApplication对象的属性 List<ApplicationContextInitializer<?>> initializers中
    在这里插入图片描述
    SpringApplication对象创建完成,会运行run方法,然后在容器初始化的时候调用applyInitializers(context)方法实例化initializers属性中保存的值。如下图:
    在这里插入图片描述
    在这里插入图片描述

    2.SpringApplicationRunListener

    SpringBoot启动过程中多次被回调,详细可参考:

    3.ApplicationRunner、CommandLineRunner

    容器启动完成之后回调,其中ApplicationRunner比CommandLineRunner先执行,一般可用于系统数据的初始化
    在这里插入图片描述

代码示例:

1.代码结构

在这里插入图片描述

2.代码工程

package com.van.springbootdemo7.listeners;import org.springframework.context.ApplicationContextInitializer;import org.springframework.context.ConfigurableApplicationContext;/** * description: * * @author van.shu * @date 2019/5/28 23:03 */public class MyApplicaitonInitilizer implements ApplicationContextInitializer
{
@Override public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
System.out.println("MyApplicaitonInitilizer...running..."); }}
package com.van.springbootdemo7.listeners;import org.springframework.boot.ApplicationArguments;import org.springframework.boot.ApplicationRunner;import org.springframework.stereotype.Component;/** * description: * * @author van.shu * @date 2019/5/28 23:09 */@Componentpublic class MyApplicaitonRunner implements ApplicationRunner {
@Override public void run(ApplicationArguments args) throws Exception {
System.out.println("MyApplicaitonRunner...running..."); }}

然后将上面两个类的路径加入到资源路径下META-INF/spring.factories配置文件中

org.springframework.context.ApplicationContextInitializer=\  com.van.springbootdemo7.listeners.MyApplicaitonInitilizerorg.springframework.boot.SpringApplicationRunListener=\  com.van.springbootdemo7.listeners.MyApplicationRunLIstener

最后再实现另外两个事件回调接口ApplicaitonRunner和CommandLineRunner:

package com.van.springbootdemo7.listeners;import org.springframework.boot.SpringApplication;import org.springframework.boot.SpringApplicationRunListener;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.core.env.ConfigurableEnvironment;/** * description: * * @author van.shu * @date 2019/5/28 23:06 */public class MyApplicationRunLIstener implements SpringApplicationRunListener {
public MyApplicationRunLIstener(SpringApplication application, String[] args) {
} @Override public void starting() {
System.out.println("MyApplicationRunLIstener...starting..."); } @Override public void environmentPrepared(ConfigurableEnvironment environment) {
} @Override public void contextPrepared(ConfigurableApplicationContext context) {
} @Override public void contextLoaded(ConfigurableApplicationContext context) {
} @Override public void started(ConfigurableApplicationContext context) {
} @Override public void running(ConfigurableApplicationContext context) {
} @Override public void failed(ConfigurableApplicationContext context, Throwable exception) {
}}
package com.van.springbootdemo7.listeners;import org.springframework.boot.CommandLineRunner;import org.springframework.stereotype.Component;/** * description: * * @author van.shu * @date 2019/5/28 23:10 */@Componentpublic class MyCommandLineRunner implements CommandLineRunner {
@Override public void run(String... args) throws Exception {
System.out.println("MyCommandLineRunner...running..."); }}

运行效果如下:

Connected to the target VM, address: '127.0.0.1:10623', transport: 'socket'MyApplicationRunLIstener...starting...  .   ____          _            __ _ _ /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/  ___)| |_)| | | | | || (_| |  ) ) ) )  '  |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot ::        (v2.1.1.RELEASE)MyApplicaitonInitilizer...running.........(启动信息省略)2019-06-05 00:57:37.393  INFO 9992 --- [           main] c.v.s.SpringbootDemoApplication          : Started SpringbootDemoApplication in 5.989 seconds (JVM running for 6.406)MyApplicaitonRunner...running...MyCommandLineRunner...running...

总结:

在这里插入图片描述

转载地址:http://oqmbi.baihongyu.com/

你可能感兴趣的文章
相似度与距离算法种类总结
查看>>
贝叶斯
查看>>
推荐系统总结
查看>>
relu与sigmod的比较
查看>>
交叉熵和均方差损失函数的比较(Cross-Entropy vs. Squared Error)
查看>>
九大排序算法总结
查看>>
Spannable 和 Editable、SpannableString 和 SpannableString
查看>>
Java注解Annotation使用
查看>>
Handler、Message、Looper、MessageQueue
查看>>
java多线程之六种状态
查看>>
go指针
查看>>
设计模式之工厂模式---对象的实例化部分提取出来---三种不同的提取方法
查看>>
设计模式之策略模式
查看>>
设计模式之观察者模式
查看>>
设计模式之装饰者模式
查看>>
设计模式之代理模式
查看>>
设计模式之组合模式
查看>>
javaIO
查看>>
activity
查看>>
Fragment
查看>>