springboot源码分析16-spring boot监听器使用

简介: 摘要:spring boot提供了一系列的监听器,方便我们开发人员使用和扩展。本文咱们详细讲解一下spring boot中的监听器。spring boot中支持的事件类型定在org.

摘要:spring boot提供了一系列的监听器,方便我们开发人员使用和扩展。

本文咱们详细讲解一下spring boot中的监听器。

spring boot中支持的事件类型定在org.springframework.boot.context.event包中,目前支持的事件类型有如下6种:

ApplicationFailedEvent

ApplicationPreparedEvent

ApplicationReadyEvent

ApplicationStartedEventSpringboot2.x版本已修改为ApplicationStartingEvent

SpringApplicationEvent

ApplicationEnvironmentPreparedEvent

1.1.  监听器的使用

第一:首先定义一个自己使用的监听器类并实现ApplicationListener接口。

第二:通过SpringApplication类中的addListeners方法将自定义的监听器注册进去。

1.1.1.  ApplicationFailedEvent

ApplicationFailedEvent:该事件为spring boot启动失败时的操作。

/**

* spring boot 启动的时候出现异常事件

* @author www.shareniu.com

*

*/

public class ShareniuApplicationFailedEventListener implements ApplicationListener<ApplicationFailedEvent> {

@Override

public void onApplicationEvent(ApplicationFailedEvent event) {

System.out.println("--------------:ShareniuApplicationFailedEventListener");

Throwable exception = event.getException();

System.out.println(exception);

}

}

可以通过ApplicationFailedEvent 获取Throwable实例对象获取异常信息并处理。

1.1.2.  ApplicationPreparedEvent

ApplicationPreparedEvent:上下文准备事件。

上下文context已经准备完毕 ,可以通过ApplicationPreparedEvent获取到ConfigurableApplicationContext实例对象。ConfigurableApplicationContext类继承ApplicationContext类,但需要注意这个时候spring容器中的bean还没有被完全的加载,因此如果通过ConfigurableApplicationContext获取bean会报错的。比如报错:

Exception in thread "main" java.lang.IllegalStateException: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@69b0fd6f has not been refreshed yet

获取到上下文之后,可以将其注入到其他类中,毕竟ConfigurableApplicationContext为引用类型。

public class ShareniuApplicationPreparedEventListener implements ApplicationListener<ApplicationPreparedEvent> {

@Override

public void onApplicationEvent(ApplicationPreparedEvent event) {

System.out.println("###############"+"ShareniuApplicationPreparedEventListener");

ConfigurableApplicationContext applicationContext = event.getApplicationContext();

//如果执行下面代码则报错

//ShareniuDemo shareniuDemo = applicationContext.getBean(ShareniuDemo.class);

//System.out.println(shareniuDemo);

}

}

1.1.3.  ApplicationReadyEvent

ApplicationReadyEvent:上下文已经准备ok

这个时候就可以通过ApplicationReadyEvent获取ConfigurableApplicationContext,然后通过ConfigurableApplicationContext 获取bean的信息。

public class ShareniuApplicationReadyEventListener implements ApplicationListener<ApplicationReadyEvent> {

@Override

public void onApplicationEvent(ApplicationReadyEvent event) {

System.out.println("--------------------:ShareniuApplicationReadyEventListener");

ConfigurableApplicationContext applicationContext = event.getApplicationContext();

    //ShareniuDemo可以根基自身情况进行测试

ShareniuDemo shareniuDemo = applicationContext.getBean(ShareniuDemo.class);

}

}

1.1.4.  ApplicationStartedEvent

ApplicationStartedEventspring boot 启动监听类。该类在SpringBoot2.x版本中已经废弃,修改为了最新的类,类名是ApplicationStartingEvent。这个事件是第一个产生的。

可以在SpringApplication启动之前做一些手脚,比如修改SpringApplication实例对象中的属性值。

public class ShareniuApplicationStartedEventListener  implements ApplicationListener<ApplicationStartedEvent>{

@Override

public void onApplicationEvent(ApplicationStartedEvent event) {

SpringApplication springApplication = event.getSpringApplication();

springApplication.setShowBanner(false);

System.out.println("##############################ShareniuApplicationStartedEventListener");

}

}

1.1.5.  SpringApplicationEvent

SpringApplicationEvent:获取SpringApplication

public class ShareniuSpringApplicationEventListener implements ApplicationListener<SpringApplicationEvent> {

@Override

public void onApplicationEvent(SpringApplicationEvent event) {

System.out.println("-----------------------:ShareniuSpringApplicationEventListener");

SpringApplication springApplication = event.getSpringApplication();

System.out.println("###############"+springApplication);

}

}

1.1.6.  ApplicationEnvironmentPreparedEvent

ApplicationEnvironmentPreparedEvent:环境事先准备,spring boot中的环境已经准备ok

可以通过ApplicationEnvironmentPreparedEvent获取到SpringApplicationConfigurableEnvironment等等信息, 可以通过ConfigurableEnvironment实例对象来修改以及获取默认的环境信息。

public class ShasreniuApplicationEnvironmentPreparedEventListener  implements ApplicationListener<ApplicationEnvironmentPreparedEvent>{

@Override

public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {

System.out.println("###############"+"ShasreniuApplicationEnvironmentPreparedEventListener");

SpringApplication springApplication = event.getSpringApplication();

ConfigurableEnvironment environment = event.getEnvironment();

long timestamp = event.getTimestamp();

Object source = event.getSource();

System.out.println("########################"+springApplication);

System.out.println("########################"+environment);

System.out.println("########################"+timestamp);

System.out.println("########################"+source);

MutablePropertySources propertySources = environment.getPropertySources();

if (propertySources!=null) {

Iterator<PropertySource<?>> iterator = propertySources.iterator();

while (iterator.hasNext()) {

PropertySource<?> propertySource = (PropertySource<?>) iterator.next();

System.out.println("##############:propertySource"+propertySource);

}

}

 }

}

1.2.  监听器注册

@RestController

@SpringBootApplication()

public class Application {

@RequestMapping("/")

String index() {

return "xxxxxxxxxxxxx";

}

public static void main(String[] args) {

SpringApplication springApplication = new SpringApplication(Application.class);

springApplication.addListeners(new ShareniuApplicationStartedEventListener());

springApplication.addListeners(new ShasreniuApplicationEnvironmentPreparedEventListener());

springApplication.addListeners(new ShareniuApplicationPreparedEventListener());

springApplication.addListeners(new ShareniuApplicationFailedEventListener());

springApplication.addListeners(new ShareniuApplicationReadyEventListener());

springApplication.addListeners(new ShareniuSpringApplicationEventListener());

springApplication.run(args);

}

}


欢迎关注我的微信公众号,第一时间获得博客更新提醒,以及更多成体系的Java相关原创技术干货。 
扫一扫下方二维码或者长按识别二维码,即可关注。
 


目录
打赏
0
0
0
0
10
分享
相关文章
java springboot监听事件和处理事件
通过上述步骤,开发者可以在Spring Boot项目中轻松实现事件的发布和监听。事件机制不仅解耦了业务逻辑,还提高了系统的可维护性和扩展性。掌握这一技术,可以显著提升开发效率和代码质量。
93 33
SpringBoot是如何简化Spring开发的,以及SpringBoot的特性以及源码分析
Spring Boot 通过简化配置、自动配置和嵌入式服务器等特性,大大简化了 Spring 应用的开发过程。它通过提供一系列 `starter` 依赖和开箱即用的默认配置,使开发者能够更专注于业务逻辑而非繁琐的配置。Spring Boot 的自动配置机制和强大的 Actuator 功能进一步提升了开发效率和应用的可维护性。通过对其源码的分析,可以更深入地理解其内部工作机制,从而更好地利用其特性进行开发。
43 6
Spring Boot 3 集成 Spring Security + JWT
本文详细介绍了如何使用Spring Boot 3和Spring Security集成JWT,实现前后端分离的安全认证概述了从入门到引入数据库,再到使用JWT的完整流程。列举了项目中用到的关键依赖,如MyBatis-Plus、Hutool等。简要提及了系统配置表、部门表、字典表等表结构。使用Hutool-jwt工具类进行JWT校验。配置忽略路径、禁用CSRF、添加JWT校验过滤器等。实现登录接口,返回token等信息。
380 12
java springboot监听事件和处理事件
通过上述步骤,开发者可以在Spring Boot项目中轻松实现事件的发布和监听。事件机制不仅解耦了业务逻辑,还提高了系统的可维护性和扩展性。掌握这一技术,可以显著提升开发效率和代码质量。
78 13
|
1月前
|
Java Spring Boot监听事件和处理事件
通过上述步骤,我们可以在Java Spring Boot应用中实现事件的发布和监听。事件驱动模型可以帮助我们实现组件间的松耦合,提升系统的可维护性和可扩展性。无论是处理业务逻辑还是系统事件,Spring Boot的事件机制都提供了强大的支持和灵活性。希望本文能为您的开发工作提供实用的指导和帮助。
107 15
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
85 8
Java Springboot监听事件和处理事件
通过这些内容的详细介绍和实例解析,希望能帮助您深入理解Spring Boot中的事件机制,并在实际开发中灵活应用,提高系统的可维护性和扩展性。
63 7
Spring高手之路26——全方位掌握事务监听器
本文深入探讨了Spring事务监听器的设计与实现,包括通过TransactionSynchronization接口和@TransactionalEventListener注解实现事务监听器的方法,并通过实例详细展示了如何在事务生命周期的不同阶段执行自定义逻辑,提供了实际应用场景中的最佳实践。
79 2
Spring高手之路26——全方位掌握事务监听器
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
210 5
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
157 2