在spring容器启动后监听事件ApplicationReadyEvent

news/2024/11/3 1:21:47/

概述

经常会在业务中遇到需要在项目启动后刷新/预热一些数据的要求。
常见可以监听ApplicationReadyEventContextRefreshedEvent.

但是因为常见的springboot项目都依赖的springmvc,所以实际上有2个容器,springioc容器是springmvc的父容器。

而且ContextRefreshedEvent实际中会发布多次,如果业务只需要执行一次的情况话是不太适合监听这个的。

发布多次的原因是每加载完一次context,就会执行一次ContextRefreshedEvent而且每次执行,都会再执行一次parentContextRefreshedEvent.上面提到父子容器都会触发这个事件

org.springframework.context.support.AbstractApplicationContext#publishEvent(java.lang.Object, org.springframework.core.ResolvableType)
在这里插入图片描述

只想在启动后执行一次demo

可以监听ApplicationReadyEvent事件

package com.xxx.xxx.xxx.xxx.xxx;import cn.hutool.extra.spring.SpringUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.Objects;@Slf4j
@Component
public class xxxRefreshEventListener implements ApplicationListener<ApplicationReadyEvent> {@Overridepublic void onApplicationEvent(ApplicationReadyEvent contextRefreshedEvent) {//刷新配置refreshTargetProperties();}private <T> T refreshObjProperties(Class<T> objClass){try {T bean = SpringUtil.getBean(objClass);BusinessProperties annotation = AnnotationUtils.findAnnotation(objClass, BusinessProperties.class);if(Objects.isNull(annotation)){return bean;}//配置前缀String prefix = annotation.prefix();BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass());for (PropertyDescriptor propertyDescriptor : beanInfo.getPropertyDescriptors()) {String name = propertyDescriptor.getName();Class<?> propertyType = propertyDescriptor.getPropertyType();Method writeMethod = propertyDescriptor.getWriteMethod();//完成的config keyString configKey = String.join(".", prefix, name);//获取数据xxx info = xxx.xxx(configKey);if(Objects.isNull(info )){continue;}//db中存放的值String configValue = info.getConfigValue();//给属性填充值if(Objects.equals(propertyType, String.class)){writeMethod.invoke(bean, configValue);}else {Object propertyValue = objectMapper.readValue(configValue, propertyType);writeMethod.invoke(bean, propertyValue);}}return bean;} catch (Exception e) {log.error("刷新配置异常,class:{}", objClass, e);return null;}}}

spring关键的几个事件

  1. ContextClosedEvent spring 容器关闭事件
  2. ContextRefreshedEvent spring 容器的初始化后或者刷新完成事件;
  3. ContextStoppedEvent spring 容器停止事件
  4. ContextStartedEvent spring 容器初始化开始事件

34其实是spring生命周期相关的事件,1是整个spring容器销毁的事件。

springboot对spring容器周期事件的扩展

springboot对于spring的事件又有自己的扩展.

  1. ApplicationEnvironmentPreparedEvent 容器环境对象初始化后的事件
  2. ApplicationPreparedEvent 容器初始化前的事件,主要是在做 refresh 动作之前做触发的事件
  3. ApplicationStartedEvent 容器已经完成 refresh 动作后所触发的事件
  4. ApplicationReadyEvent 容器已经运行中的事件
  5. ApplicationFailedEvent 容器初始化失败所触发的事件
  6. ApplicationStartingEvent 容器开始时所触发的事件

触发顺序如下

ApplicationStartingEvent ->ApplicationEnvironmentPreparedEvent -> ApplicationPreparedEvent ->ContextStartedEvent -> ContextRefreshedEvent ->ApplicationStartedEvent	->ApplicationReadyEvent

http://www.ppmy.cn/news/144064.html

相关文章

集权攻击系列:如何利用PAC新特性对抗黄金票据?

黄金票据简介 黄金票据是一种常见的域内权限维持手段&#xff0c;这种攻击主要是利用了Kerberos认证过程中TGT票据由KRBTGT用户的hash加密的特性&#xff0c;在掌握KRBTGT用户密码之后可以通过签发一张高权限用户的TGT票据&#xff0c;再利用这个TGT向KDC获取域内服务的ST来实…

dllreg解除服务器注册,最简单的修复IE浏览器的方法:注册表重新注册DLL

IE损坏&#xff0c;有修复技巧 我们在使用IE浏览器的过程中&#xff0c;有时候会遇到一些意想不到的事情&#xff0c;那就是突然IE失效了&#xff0c;或者明显不正常了。例如&#xff0c;点击链接但没有反应&#xff1b;在开始菜单的运行对话空中输入URL&#xff0c;但不能弹出…

ie浏览器怎么打开html,IE浏览器无法打开网页如何解决

在网络非常良好的情况下IE无法打开网页一定是让每个用户非常头痛&#xff0c;引起IE无法上网的原因是多种的&#xff0c;有可能是木马入侵绑架了IE浏览器&#xff0c;有可能是IE版本过旧&#xff0c;有可能是浏览器与插件不兼容&#xff0c;还有可能是网站的服务器压力过大也会…

手机浏览器服务器修复,手机IE浏览器怎么修复

手机已然成为我们生活中必备产品之一&#xff0c;自然手机浏览器的使用频率一样不低。很多时候&#xff0c;在我们手机有网络的情况下&#xff0c;我们可以通过手机浏览器帮助我们更方便的浏览一些网页。而导致我们手机浏览器打不开的原因有很多&#xff0c;我们可以通过以下方…

IE浏览器F12无法使用

原文链接https://zhhll.icu/2020/windows/IE浏览器F12无法使用/ 这是很久之前遇到的一个问题了&#xff0c;当初升级完IE浏览器之后出现的问题(当然现在我也好久没有用过IE浏览器了&#xff0c;现在应该只有那些老项目还在使用IE浏览器了) 错误的文字内容&#xff1a;Diagnos…

防劫持工具,介绍几款浏览器劫持修复工具

相信很多人都会自己设定浏览器的主页&#xff0c;但是有时候&#xff0c;我们会发现打开自己浏览器设置好的主页&#xff0c;结果被莫名其妙的跳转到其他的网址&#xff0c;这种情况大多是浏览器劫持。遇到这种情况&#xff0c;即使锁定主页也没法解决&#xff0c;我们可以借助…

ie浏览器经典设置

一、打不开二级链接&#xff0c;需要重新注册几个动态链接文件 单击"开始→运行"&#xff0c;依次运行"regsvr32 actxprxy.dll"和"regsvr32 shdocvw.dll"将这两个DLL文件注册&#xff0c;然后重启系统。如果还不行&#xff0c;则可以将mshtml.dl…

html页面在ie上出现404怎么解决,ie浏览器网页上有错误解决方法详解

ie浏览器网页上有错误解决方法详解 最近网友反馈我的浏览器左下角总显示"网页上有错误",我已经修复过IE了,可是不管用。然后在浏览器上看不到网上的视频和图片的播放。在QQ空间上输入的指令统统没有效,每次输入完毕之后,它又回复到没有输入的样子。而这一切一切的线…