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

原创 2017年12月18日 10:55:04

摘要: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相关原创技术干货。 
扫一扫下方二维码或者长按识别二维码,即可关注。
 


版权声明:本文为博主原创文章,未经博主允许不得转载。不经过允许copy,讲追究法律责任,欢迎加入我们的学习提升群523988350,可以相互交流 https://blog.csdn.net/qq_30739519/article/details/78830773

【SpringBoot】Spring Boot 2小时入门基础教程

授课环境:mac+idea+jdk8。课程通过实践编码,针对常用功能进行讲解。 第一章: 以hello word为切入点详细讲解返回json数据,整合jsp/freemarker模板。 第二章:servlet、过滤器、监听器、拦截器配置及使用场景 第三章:讲解日志、静态资源、启动加载数据处理方式 第四章:数据库配置,jdbctemplate、mybatis、事务原理及实现 第五章:服务发布部署
  • 2017年06月05日 01:14

[Spring Boot] 2. Spring Boot 启动过程定制化

在上一篇文章中,从源码角度介绍了Spring Boot的启动过程。启动的代码虽然只有短短的一行,但是背后所做的工作还真不少,其中有一些可以定制化的部分,主要分为以下几个方面: 初始化器(Initial...
  • dm_vincent
  • dm_vincent
  • 2017-08-13 22:45:21
  • 1348

spring boot实战(第二篇)事件监听

spring boot 实战 2.事件监听前言spring boot在启动过程中增加事件监听机制,为用户功能拓展提供极大的便利。支持的事件类型四种 ApplicationStartedEvent ...
  • liaokailin
  • liaokailin
  • 2015-09-02 23:54:25
  • 41917

Spring Boot 框架介绍和使用

本文参考自Spring Boot文档。Spring Boot 简介Spring框架功能很强大,但是就算是一个很简单的项目,我们也要配置很多东西。因此就有了Spring Boot框架,它的作用很简单,就...
  • u011054333
  • u011054333
  • 2017-03-17 23:33:04
  • 6499

spring boot -- 监听器

一些系统配置,存储在数据库中,需要在项目启动时加载进缓存。此时可以实现ApplicationListener类来实现监听。 第一步:package com.lic.base.servlet; imp...
  • licheng989
  • licheng989
  • 2017-04-27 15:53:36
  • 2957

Spring Boot 过滤器、监听器

上一篇文章已经对定义Servlet 的方法进行了说明,过滤器(Filter)和 监听器(Listener)的注册方法和 Servlet 一样,不清楚的可以查看下上一篇文章:http://xxxxxx....
  • catoop
  • catoop
  • 2016-01-12 09:20:33
  • 58990

spring boot实战(第六篇)加载application资源文件源码分析

前言 在上一篇中了解了spring配置资源的加载过程,本篇在此基础上学习spring boot如何默认加载application.xml等文件信息的。 ConfigFileApplicati...
  • liaokailin
  • liaokailin
  • 2015-10-03 15:25:54
  • 16157

Spring boot源码分析-ApplicationListener应用环境(5)

Spring boot源码分析-ApplicationListener应用环境(5)关于ApplicationListenerApplicationListener为spring框架内的事件监听接口,...
  • jamet
  • jamet
  • 2017-09-20 16:36:07
  • 1096

SpringBoot项目创建报:java.lang.ClassNotFoundException: org.springframework.boot.SpringApplication错误的解决方案

第一次创建SpringBoot项目结果出现了不少错误,其他错误都通过百度的方式得到解决,唯独这个错误困扰我很久了,而且百度上没有对于这种错误的解决方案。 所以给出这种错误的解决方案: 虽然明显知道...
  • zwb19940216
  • zwb19940216
  • 2017-10-07 23:17:34
  • 2797

java.lang.ClassNotFoundException: org.springframework.boot.SpringApplication

额,一个使用Spring boot的,好好的项目,最近突然报错了:java.lang.ClassNotFoundException: org.springframework.boot.SpringAp...
  • anxpp
  • anxpp
  • 2016-09-05 22:12:05
  • 19375
收藏助手
不良信息举报
您举报文章:springboot源码分析16-spring boot监听器使用
举报原因:
原因补充:

(最多只允许输入30个字)