摘要:spring boot提供了一系列的监听器,方便我们开发人员使用和扩展。
本文咱们详细讲解一下spring boot中的监听器。
spring boot中支持的事件类型定在org.springframework.boot.context.event包中,目前支持的事件类型有如下6种:
-
ApplicationFailedEvent
-
ApplicationPreparedEvent
-
ApplicationReadyEvent
-
ApplicationStartedEvent
-
SpringApplicationEvent
-
ApplicationEnvironmentPreparedEvent
监听器的使用
第一:首先定义一个自己使用的监听器类并实现ApplicationListener接口。
第二:通过SpringApplication类中的addListeners方法将自定义的监听器注册进去。
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实例对象获取异常信息并处理。
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); } }
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); } }
ApplicationStartedEvent
ApplicationStartedEvent:spring boot 启动监听类。
可以在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"); } }
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); } }
ApplicationEnvironmentPreparedEvent
ApplicationEnvironmentPreparedEvent:环境事先准备,spring boot中的环境已经准备ok
可以通过ApplicationEnvironmentPreparedEvent获取到SpringApplication、ConfigurableEnvironment等等信息, 可以通过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); } } } }
监听器注册
@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); } }
建议
实际项目开发中,可以根据自身需要添加不同的监听器。随后的文章,咱们一起分析监听器的内部实现原理。
欢迎关注微信公众号,您的肯定是对我最大的支持
转载请注明:分享牛 » spring boot监听器使用