当前位置: 首页 > news >正文

spring/springboot SPI(二)配合使用的接口

spring.factories 里,Spring 会根据接口来加载实现类,常见的几个接口包括:

一、org.springframework.context.ApplicationListener

1、作用

监听 Spring 容器事件,如 ApplicationReadyEvent

2、使用方法

项目结构Spring Boot 2.xSpring Boot 3.x
监听器注册方式spring.factoriesspring.factories(兼容)
是否需要改动否,但需注意 Java 17 / 模块要求
是否可用新机制不适用自动配置类使用 AutoConfiguration.imports 替代即可
(1)Spring Boot 2.x 配置
   ① 配置文件
# 文件位置:src/main/resources/META-INF/spring.factories
org.springframework.context.ApplicationListener=\
com.example.agent.SpringContextHolder

Spring Boot 2 会自动读取 spring.factories 并注册对应的监听器。

   ② 代码
package com.example.agent;import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.boot.context.event.ApplicationReadyEvent;public class SpringContextHolder implements ApplicationListener<ApplicationReadyEvent> {private static ApplicationContext applicationContext;@Overridepublic void onApplicationEvent(ApplicationReadyEvent event) {applicationContext = event.getApplicationContext();System.out.println("[Agent] Captured ApplicationContext: " + applicationContext);}public static ApplicationContext getApplicationContext() {return applicationContext;}
}
(2)Spring Boot 3.x 配置

Spring Boot 3 依然兼容 spring.factories 文件注册监听器(只是不推荐用于自动配置类),即上述方法仍然兼容。

 ① 配置

同上

 ② 代码

同上

(3)Spring Boot 3.x可选:自动配置类也可结合监听器(推荐)
    ① 配置

src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

com.example.agent.AgentAutoConfiguration
   ② 代码
@Configuration
public class AgentAutoConfiguration {@EventListener(ApplicationReadyEvent.class)public void onReady(ApplicationReadyEvent event) {System.out.println("AutoConfiguration 捕获到 ApplicationContext");}
}

二、ReadyEventListener

二、org.springframework.boot.SpringApplicationRunListener

三、org.springframework.boot.autoconfigure.EnableAutoConfiguration

四、org.springframework.boot.CommandLineRunnerApplicationRunner

五、EnvironmentPostProcessor

六、ApplicationContextInitializer

七、FailureAnalyzer

http://www.dtcms.com/a/295904.html

相关文章:

  • 用 AI 破解数据质量难题:从缺失值填补到动态监控的高效解决方案
  • 数据所有权与用益权分离:数字经济时代的权利博弈与“商业机遇”
  • element-plus 组件 ElMessage、ElLoading 弹框 和加载css 样式展示异常总结
  • 【数学,放缩,基本不等式】基本不等式题目
  • TDengine 转化类函数 CAST 用户手册
  • SpringBoot复习
  • Flink-1.19.0源码详解8-ExecutionGraph生成-前篇
  • 洛谷刷题7.24
  • CellFlow:Flow matching建模cell状态变化
  • 如何将拥有的域名自定义链接到我的世界服务器(Minecraft服务器)
  • 大数据集分页优化:LIMIT OFFSET的替代方案
  • Oracle国产化替代:一线DBA的技术决策突围战
  • 如何判断钱包的合约签名是否安全?
  • MySQL深度理解-MySQL索引优化
  • 数据库第一章练习题(大雪圣期末参考复习)
  • 【数据结构】二叉树进阶算法题
  • MinIO 版本管理实践指南(附完整 Go 示例)
  • 一次粗心导致的bug定位
  • 《C++ string 完全指南:string的模拟实现》
  • rust-枚举
  • 开源链动2+1模式AI智能名片S2B2C商城小程序的场景体验分析
  • HBase + PostgreSQL + ElasticSearch 联合查询方案
  • vue3 el-table 列数据合计
  • MongoDB 副本集搭建与 Monstache 实时同步 Elasticsearch 全流程教程
  • AI开放课堂:钉钉MCP开发实战
  • 【DBeaver 安装 MongoDB 插件】
  • 推荐系统如何开发
  • Python —— 真题九
  • web:js函数的prototype(原型对象)属性
  • RabbitMQ简述