springboot(2)生命周期和监听器

Spring boot应用,这里具体的来说,是指类SpringApplication,在其run()方法运行过程中,主要围绕所使用ApplicationContext对象的生命周期事件,应用了一个事件监听器机制提供了相应的程序扩展入口点,开发人员可以基于此机制,在相应的事件发生时执行特定的逻辑。

SpringApplication应用的该事件监听器机制主要利用如下两个类/接口 :

SpringApplicationRunListeners

SpringApplicationRunListener

简单来讲,在SpringApplication的run()方法执行时,应用上下文ApplicationContext对象创建之前,应用程序会首先找到配置中所定义的所有SpringApplicationRunListener的实现类(这些实现类可能由Spring boot自身实现和提供,也可以由开发人员来实现和提供),创建他们的实例,然后把它们放在一个集合中,然后封装为一个 SpringApplicationRunListeners 实例。之后Spring boot应用开始创建ApplicationContext对象,然后在相应的ApplicationContext的生命周期事件发生时,程序会通过该SpringApplicationRunListeners 实例向各个 SpringApplicationRunListener 实例广播相应的事件,从而SpringApplicationRunListener 实现类中相应的监听器逻辑得到执行。

这里所提到的SpringApplicationContext的生命周期事件,具体来讲,是如下事件 :

发生顺序事件事件类型备注
1startingApplicationStartedEvent系统刚启动
2environmentPreparedApplicationEnvironmentPreparedEvent环境已经准备好,但是ApplicationContext实例尚未被创建
3contextPrepared ApplicationContext已经被创建并且准备就绪,但是sources尚未被加载
4contextLoadedApplicationPreparedEventApplicationContext实例的sources已经被加载,但是ApplicationContext实例尚未被刷新(refresh)
5finishedApplicationFailedEvent
ApplicationReadyEvent
Spring应用程序启动完成时发送该事件,此时ApplicationContext实例已经成功创建完成,或者遇到异常创建失败。对于该ApplicationContext是一个WebApplicationContext的情况,此时内置的Web容器已经在其他线程启动处于服务就绪状态,而SpringApplication执行主线程已经完成自己的
任务。

 

SpringApplication.run()方法中事件监听有关逻辑

// SpringApplication 类
public ConfigurableApplicationContext run(String... args) {
     StopWatch stopWatch = new StopWatch();
     stopWatch.start();
     ConfigurableApplicationContext context = null;
     FailureAnalyzers analyzers = null;
     configureHeadlessProperty();
     // 从配置中获取SpringApplicationRunListener实现类并实例化,
     // 最终把所有这些实例包装到一个SpringApplicationRunListeners实例来使用
     SpringApplicationRunListeners listeners = getRunListeners(args);
     // 启动各个SpringApplicationRunListener 监听器实例 
     listeners.starting();
     try {
          ApplicationArguments applicationArguments = 
               new DefaultApplicationArguments(args);
          // 准备环境
          // 结束时会向各个SpringApplicationRunListener发送事件 
          // environmentPrepared     
          ConfigurableEnvironment environment = 
               prepareEnvironment(listeners,applicationArguments);
          Banner printedBanner = printBanner(environment);
          context = createApplicationContext();// 这里创建应用上下文
          analyzers = new FailureAnalyzers(context);
         // 准备应用上下文,
         // 完成时会向各个SpringApplicationRunListener发送事件 
         // contextPrepared
         prepareContext(context, environment, listeners, 
                applicationArguments,printedBanner);
         refreshContext(context);
         afterRefresh(context, applicationArguments);
        // 应用上下文准备完成
        // 向各个SpringApplicationRunListener发送事件 
        // finished
        listeners.finished(context, null);
        stopWatch.stop();
        if (this.logStartupInfo) {
             new StartupInfoLogger(this.mainApplicationClass)
                .logStarted(getApplicationLog(), stopWatch);
         }
         return context;
     }catch (Throwable ex) {
        // 应用上下文准备遇到异常时,
       // 向各个SpringApplicationRunListener发送事件finished,
       // 携带响应异常信息
       handleRunFailure(context, listeners, analyzers, ex);
       throw new IllegalStateException(ex);
     }
}

读取监听配置并进行实例化:

SpringApplicationRunListeners类主要是将一组SpringApplicationRunListener聚合到一起,然后使用统一的方式传播事件。

其实现逻辑如下,主要就是将事件传播到各个SpringApplicationRunListener实例。

EventPublishingRunListener是springboot的默认事件监听器,源码如下:

具体的事件传播过程如下:

遍历所有ApplicationListener,并调用invokeListener方法。

注意:springboot在广播事件的时候,默认是同步的,如果想要实现事件异步传播,需要进行如下配置:

这样,在执行getTaskExecutor方法时,才能获取到线程池,才能从线程池中获取空闲线程进行回调。还可以设置ErrorHandler,在出现异常时进行回调。

上述几个监听器类关系如下图所示:

一般在系统中,如果需要监听springboot的生命周期,比如在启动完成后需要进行相关数据初始化,更好的办法是实现ApplicationListener监听器,而不是SpringApplicationRunListener监听器。

ApplicationListener监听编程实例:

假设我需要在系统启动时,执行某些操作,代码如下:

更一般的实例:

假设在用户注册成功后,需要向用户发送短信、邮件、积分等信息时,也可以使用springboot的事件监听,代码如下:

 

springboot进行事件监听有四种实现方式:

1.手工向ApplicationContext中添加监听器

在main方法中,application.addApplicationListener(new MyListener());

2.将监听器装载入spring容器

直接在监听器类上加入@Component

3.在application.properties中配置监听器

application.properties中配置监听,context.listener.classes = com.listener.MyListener

4.通过@EventListener注解实现事件监听

创建自定义监听类,该类无需实现ApplicationListener接口,使用@EventListener注解修饰某个方法,那么这个方法就实现了接口ApplicationListener的onApplicationEvent方法功能。

根据调试,发现SpringBoot四种事件的实现方式监听是有序的,顺序为:3、4、2、1

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Spring Boot 的生命周期主要包括以下几个阶段: 1. 启动:当应用启动时,Spring Boot 会读取配置文件、执行自动配置类、加载应用程序上下文。 2. 运行:当应用程序上下文加载完毕后,应用程序将开始运行,可以处理请求和提供服务。 3. 关闭:当应用程序停止运行时,Spring Boot 会关闭应用程序上下文并销毁所有的单例 bean。 在 Spring Boot 生命周期中,你可以定义自己的生命周期事件,例如在启动之前或关闭之后执行特定的操作。这样,你就可以在应用生命周期的不同阶段执行不同的任务,更好地管理你的应用程序。 ### 回答2: Spring Boot的生命周期可以分为以下几个阶段: 1. 配置阶段:在Spring Boot应用程序启动之前,会根据配置文件以及默认配置,加载并解析各种配置信息,比如数据库连接信息、日志配置等。 2. 初始化阶段:在配置阶段完成后,Spring Boot会根据配置信息,初始化各种组件和Bean对象,包括加载并注册各种Spring组件、创建数据库连接池等。 3. 运行阶段:初始化完成后,Spring Boot会创建并启动内嵌的Tomcat等Web容器,接收和处理用户的请求,并根据配置信息调用相应的Spring组件处理请求。 4. 销毁阶段:当应用程序关闭或重启时,Spring Boot会按照一定的顺序销毁各种组件和Bean对象,释放资源,关闭数据库连接池等。 在整个生命周期中,Spring Boot还提供了一些其他的特性和功能,比如自动配置、热部署、监控等,以提高开发效率和运行性能。同时,Spring Boot还能通过各种插件和扩展点,实现对不同功能的扩展和定制。 总的来说,Spring Boot的生命周期包括配置阶段、初始化阶段、运行阶段和销毁阶段,每个阶段都有相应的功能和操作,在开发和运行过程中发挥作用。通过了解和掌握Spring Boot的生命周期,可以更好地理解和使用Spring Boot框架,提高开发效率和应用程序的性能。 ### 回答3: Spring Boot的生命周期是指在应用程序的整个启动过程中,Spring Boot框架执行的一系列关键步骤。 首先,Spring Boot应用程序的生命周期始于应用程序的启动,在启动过程中,Spring Boot会加载应用程序的配置文件,例如application.properties或application.yml,并根据这些配置来进行初始化。 接下来,Spring Boot会创建并启动一个内嵌的Web服务器,例如Tomcat或Undertow,以便能够处理HTTP请求。同时,Spring Boot还会自动配置一些基本的Web相关的机制,例如DispatcherServlet、ErrorController等。 随后,在启动过程中,Spring Boot会根据应用程序的依赖关系,自动装配和初始化Spring容器。Spring Boot会搜索并加载应用程序中的所有基于注解的配置类,并根据这些配置类中的注解来进行Bean的注册和依赖注入。 接着,Spring Boot会执行所有已注册Bean的初始化过程,包括调用相应Bean的构造函数、设置属性值、注册事件监听器等。同时,Spring Boot也提供了一些扩展机制,例如ApplicationRunner和CommandLineRunner接口,可以在应用程序启动后执行一些特定的操作。 最后,在应用程序启动完成后,Spring Boot会进入运行状态,开始处理用户的请求。用户可以通过编写Controller和相关的业务逻辑来处理请求,并可以使用Spring Boot提供的注解和工具类来简化开发。 总之,Spring Boot的生命周期包括加载配置、启动内嵌Web服务器、自动装配Spring容器、初始化Bean以及处理用户请求等关键步骤。这一系列步骤使得Spring Boot可以快速方便地构建、配置和部署应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值