初始化源码

public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {~~~setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));~~~
}private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object... args) {// 获取当前 SpringApplication 实例的类加载器// 这个类加载器将用于加载类和资源ClassLoader classLoader = getClassLoader();// 从 META-INF/spring.factories 文件中加载指定类型的工厂类名称// 使用 LinkedHashSet 保证加载的类名称的顺序,并且去除重复项// SpringFactoriesLoader.loadFactoryNames(type, classLoader) 会读取 spring.factories 文件中指定类型的类名称Set<String> names = new LinkedHashSet<>(SpringFactoriesLoader.loadFactoryNames(type, classLoader));// 根据加载的类名称,反射创建指定类型的实例// createSpringFactoriesInstances 方法会根据类名称和构造函数参数类型及参数值,反射创建实例List<T> instances = createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names);// 根据 @Order 注解或实现 Ordered 接口的顺序对实例进行排序// AnnotationAwareOrderComparator.sort(instances) 会根据 @Order 注解或 Ordered 接口的值对实例进行排序AnnotationAwareOrderComparator.sort(instances);// 返回创建并排序后的实例集合return instances;
}

SpringApplication中 initializers 钩子实现

1. 实现 ApplicationContextInitializer 接口

你需要创建一个类,实现 ApplicationContextInitializer 接口,并在 initialize 方法中实现自定义的初始化逻辑。

public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {// 在这里执行自定义逻辑System.out.println("Executing custom logic before Spring context refresh");// 例如,设置环境变量ConfigurableEnvironment environment = applicationContext.getEnvironment();environment.setProperty("custom.property", "customValue");}
}
2. 注册初始化器

你可以在 SpringApplication 的构造方法中显式注册这些初始化器,或者通过 META-INF/spring.factories 文件自动发现它们。

显式注册

SpringApplication 的构造方法中显式注册初始化器:

public class MyApplication {public static void main(String[] args) {SpringApplication application = new SpringApplication(MyApplication.class);// 显式注册初始化器application.addInitializers(new MyApplicationContextInitializer());application.run(args);}
}
通过 META-INF/spring.factories 文件自动发现

resources 目录下创建或编辑 META-INF/spring.factories 文件,并添加你的初始化器类:

org.springframework.context.ApplicationContextInitializer=\
com.example.MyApplicationContextInitializer

初始化器的执行顺序

  • ApplicationContextInitializer:在 Spring 容器刷新之前执行。
  • ApplicationRunnerCommandLineRunner:在 Spring 容器刷新之后执行。
    ApplicationListener 是 Spring 提供的一个接口,用于监听 Spring 应用上下文中的事件。通过实现 ApplicationListener 接口,你可以捕获并处理特定的事件,从而在 Spring 应用的生命周期中执行自定义逻辑。

以下是使用 ApplicationListener 钩子的步骤和示例代码:


SpringApplication中listeners 钩子实现

ApplicationListener接口继承自Java的EventListener接口,表示一个事件监听器,它能够接收并处理特定类型的事件。在Spring中,当一个事件被发布时(通常是通过ApplicationContext的publishEvent方法),Spring会查找所有实现了ApplicationListener接口并且声明了要监听的事件类型的Bean,然后调用这些Bean的onApplicationEvent方法来处理事件。

1. 实现 ApplicationListener 接口

你需要创建一个类,实现 ApplicationListener 接口,并重写 onApplicationEvent 方法。onApplicationEvent 方法会在事件发生时被调用。

示例代码
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;@Component
public class MyApplicationListener implements ApplicationListener<ApplicationReadyEvent> {@Overridepublic void onApplicationEvent(ApplicationReadyEvent event) {// 在这里执行自定义逻辑System.out.println("Application is ready and fully started!");// 你可以在这里执行一些初始化逻辑或检查}
}

2. 监听特定事件

Spring 提供了多种事件类型,例如:

  • ContextRefreshedEvent:在 Spring 容器刷新时触发。
  • ApplicationReadyEvent:在 Spring 应用完全启动后触发。
  • ContextStartedEvent:在 Spring 容器启动时触发。
  • ContextStoppedEvent:在 Spring 容器停止时触发。
  • ContextClosedEvent:在 Spring 容器关闭时触发。

你可以选择监听特定的事件类型。例如,如果你想在应用启动后执行一些逻辑,可以监听 ApplicationReadyEvent

3. 自定义事件

你还可以定义自己的事件类型,并在需要的时候发布这些事件。

定义自定义事件
import org.springframework.context.ApplicationEvent;public class MyCustomEvent extends ApplicationEvent {private String message;public MyCustomEvent(Object source, String message) {super(source);this.message = message;}public String getMessage() {return message;}
}
发布自定义事件
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;@Service
public class MyService {@Autowiredprivate ApplicationEventPublisher eventPublisher;public void doSomething() {// 执行一些业务逻辑System.out.println("Doing something...");// 发布自定义事件MyCustomEvent customEvent = new MyCustomEvent(this, "Custom event message");eventPublisher.publishEvent(customEvent);}
}
监听自定义事件
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;@Component
public class MyCustomEventListener implements ApplicationListener<MyCustomEvent> {@Overridepublic void onApplicationEvent(MyCustomEvent event) {// 在这里处理自定义事件System.out.println("Received custom event: " + event.getMessage());}
}

4. 使用注解方式监听事件

除了实现 ApplicationListener 接口,你还可以使用 @EventListener 注解来监听事件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92520.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92520.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92520.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单聊聊PowerShell

1、powershell和cmdpowershell简单来说也是一个控制终端&#xff0c;他也经常拿出来和windows自带的CMD来进行对比。windows系统一般来说这两者都是自带的。虽然cmd平时大家用的最多&#xff0c;但他是非常古老的&#xff0c;可以用来执行简单的批处理文件&#xff0c;如.bat等…

Spring系列之Spring AI入门

概述 GitHub&#xff0c;官网&#xff0c;目前最新版是1.0.1。 功能&#xff1a; 跨AI提供商的可移植API&#xff1a;用于聊天、文本到图像和嵌入模型。支持同步和流API选项。还支持下拉访问模型特定功能。跨Vector Store提供商的可移植API&#xff0c;包括同样可移植的新颖…

ELK常见的问题

ELK 栈在使用过程中会遇到各种问题&#xff0c;以下是常见问题分类及解决方案&#xff0c;涵盖 ​Elasticsearch、Logstash、Kibana 和 Beats&#xff08;如 Filebeat&#xff09;​​ 四大组件&#xff1a; &#x1f6a8; ​一、连接与通信问题​ 1. ​Elasticsearch 拒绝连接…

物理AI与人形机器人:从实验室到产业化的关键跨越

2025年8月9日&#xff0c;北京——世界机器人大会&#xff08;WRC&#xff09;的开幕成为物理AI与机器人技术发展的集中展示场。英伟达在大会预告中首次提出“物理AI将重塑50万亿美元市场”的论断&#xff0c;涵盖工业制造、医疗、低空经济等领域。与此同时&#xff0c;宇树科技…

使用 Vuepress + GitHub Pages 搭建项目文档(2)- 使用 GitHub Actions 工作流自动部署

在上一篇文章中&#xff0c;我们已经成功用 VuePress 搭建了项目文档&#xff0c;并使用 sh 脚本部署到了 GitHub Pages。 但随着文档的更新频率增加&#xff0c;每次都要手动推送&#xff0c;那有没有不需要手动推送的方法呢&#xff1f;那必须有。 这次我们将用 GitHub Actio…

Python爬虫实战:研究PSpider框架,构建电商数据采集和分析系统

一、引言 1.1 研究背景 在大数据时代,数据已成为驱动科技创新、商业决策和社会发展的核心资源。据 IDC 预测,全球数据量将从 2020 年的 64ZB 增长至 2025 年的 175ZB,其中互联网公开数据占比超过 60%。如何从海量网络信息中高效、精准地提取有价值的数据,成为学术界和工业…

剑指offer第2版:动态规划+记忆化搜索

前三题是同一种模型&#xff0c;所以我分别用递推、记忆化、动归来做 一、p74-JZ10 斐波那契数列 斐波那契数列_牛客题霸_牛客网 class Solution { public:int Fibonacci(int n) {// write code hereif(n1||n2) return 1;int a1,b1,c1;while(n>2){cab;ab;bc;--n;}return c…

Unity 调节 Rigidbody2D 响应速度的解决方案【资料】

可以通过多种方式调节 Unity 中 Rigidbody2D 的响应速度&#xff0c;包括降低物理更新频率、屏蔽过小值以及优化物理参数。以下是几种有效的实现方法&#xff1a;1. 降低物理更新频率&#xff08;不推荐直接修改&#xff09;虽然可以修改 Time.fixedDeltaTime 来降低物理更新频…

力扣-189.轮转数组

题目链接 189.轮转数组 class Solution {public void reverse(int[] nums, int i, int j) {while (i < j && i > 0 && j < nums.length) {int temp nums[i];nums[i] nums[j];nums[j] temp;i;j--;}}public void rotate(int[] nums, int k) {k k …

Linux命令行安装Climate Data Operators(CDO)的方法

本文介绍在Linux操作系统的发行版本Ubuntu中&#xff0c;基于命令行&#xff0c;配置Climate Data Operators&#xff08;CDO&#xff09;这个用于操作、分析气候及其他相关数据的命令行工具的方法。 最近&#xff0c;需要对一批.nc格式文件加以处理&#xff1b;在之前&#xf…

如何为您的服务器选择正确的 PHP 版本

PHP作为最流行的服务器端脚本语言之一&#xff0c;持续演进并定期发布新版本。为您的服务器选择正确的PHP版本对于网站性能、安全性和功能兼容性至关重要。本文将指导您如何做出明智的选择。了解PHP版本的生命周期在选择PHP版本前&#xff0c;首先需要了解PHP的版本支持政策&am…

从0开始的中后台管理系统-5(userList动态展示以及上传图片和弹出创建用户表单)

项目用的都是antd组件&#xff0c;这里的userList组件展示的表单组件的数据直接get请求拿过来展示的&#xff0c;这里随机生成了50个用户只是为了展示表单的api设置。首先就是表单展示需要两个参数current和pageSize两个属性控制表单的最大分页和当前页面。那么我们就设置初始值…

Spring MVC REST API设计详解:从零构建高效接口

1. Spring MVC与REST API基础1.1 RESTful架构的六大约束详解RESTful架构是Roy Thomas Fielding在2000年博士论文中提出的软件架构风格&#xff0c;它包含六个核心约束&#xff0c;这些约束共同构成了RESTful API的设计原则。客户端-服务器约束&#xff08;Client-Server&#x…

基于STM32F030C8T6单片机实现与CH224Q诱骗芯片的I2C通信和电压输出配置

基于项目的需要,对STM32F030的IIC研究了几天,终于完成了通信,接下来具体实现如下: 本单片机使用的是PB8和PB9管脚进行实现,采用的是模拟的IIC进行 void MyI2C_W_SCL(uint8_t BitValue)//这三个函数将读写io口封装起来,增强可读性 { GPIO_WriteBit(GPIOB, GPIO_Pin_8…

TSMaster-C小程序使用

打开同星的TSMaster&#xff0c;推荐用32版本的&#xff0c;比64更稳定。同星的TSMaster的C小程序支持用户嵌入代码来控制CAN报文的收发逻辑。便于开发。点击设计里面的C小程序。 比如我现在想用小程序来实现继电器0先开后关开1s关1s&#xff0c;然后继电器1开1s关1s…如此往复…

XSS渗透测试原理/步骤/攻击方法/防御/常用语法

**核心概念回顾&#xff1a;**XSS漏洞一直被评估为web漏洞中危害较大的漏洞&#xff0c;在OWASP TOP10的排名中一直属于前三的江湖地位。XSS是一种发生在前端浏览器端的漏洞&#xff0c;所以其危害的对象也是前端用户。 形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处…

目标检测数据集 - 自动驾驶场景道路异常检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;自动驾驶场景道路异常检测数据集&#xff0c;真实场景高质量道路图片数据&#xff0c;涉及场景丰富&#xff0c;且类别丰富&#xff0c;划分为 "LMVs 轻型机动车&#xff08;汽车、摩托车、小型卡车、小型货车"、"HMVs 公交车、卡车、拖拉…

多模态新方向|从数据融合到场景落地,解锁视觉感知新范式

来gongzhonghao【图灵学术计算机论文辅导】&#xff0c;快速拿捏更多计算机SCI/CCF发文资讯&#xff5e;多模态学习&#xff08;Multimodal Learning&#xff09;是通过整合多种数据模态来提升模型对复杂场景感知与理解能力的技术&#xff0c;其核心是利用不同模态的互补性突破…

机器学习之随机森林

目录 一、什么是随机森林&#xff1f; 1. 从决策树到集成学习&#xff1a;为什么需要 "森林"&#xff1f; 2.什么是集成学习 二、随机森林的工作原理 三、随机森林构造过程 四、随机森林api介绍 五、随机森林的优缺点 六、垃圾邮件判断案例 1.数据集介绍 ​…

云平台运维工具 —— 阿里云原生工具

一、简介阿里云作为国内领先的云服务提供商&#xff0c;拥有一套完整的原生运维工具体系&#xff0c;这些工具与阿里云的各类服务深度融合&#xff0c;能够满足用户在资源部署、监控告警、权限管理、自动化运维等方面的需求。无论是简单的应用托管还是复杂的企业级架构&#xf…