Spring Boot 监听器深度对比:SpringApplicationRunListener vs ApplicationListener / @EventListener

Spring Boot : SpringApplicationRunListener / 在run()方法开始执行时,该方法就立即被调用,可用于在初始化最早期时做一些工作// 当environment构建完成,ApplicationContext创建之前,该方法被调用// 当ApplicationContext构建完成时,该方法被调用// 在ApplicationContext完成加载,但没有被刷新前,该方法被调用// 在ApplicationContext刷新并启动后,CommandLineRunners和ApplicationRunner未被调用前,该方法被调用。 阅读详情

以下是关于 SpringApplicationRunListener 与 ApplicationListener / @EventListener 的完整对比说明文档,涵盖其原理、作用、生命周期差异、使用场景,并提供工业级标准代码示例,所有示例均附带详尽中文注释,完全符合你对“实际开发参考价值”和“清晰注释”的要求。


📜 Spring Boot 监听器深度对比:SpringApplicationRunListener vs ApplicationListener / @EventListener

✅ 适用版本:Spring Boot 3.x + JDK 17+
✅ 核心目标:彻底厘清两类监听器的生命周期差异、触发时机、使用边界与实战场景


一、SpringApplicationRunListener 是什么?有什么作用?

🔍 定义:

SpringApplicationRunListener 是 Spring Boot 框架内部使用的启动过程监听器接口,由 Spring Boot 在 SpringApplication.run() 方法执行的极早期阶段自动加载和调用。

它不属于 Spring 容器管理的 Bean,而是通过 Java SPI(Service Provider Interface)机制 加载的框架级事件监听器。

🎯 核心作用:

✅ 监听 Spring Boot 应用从启动到完全就绪的全过程,用于在 Spring 容器创建之前执行自定义逻辑。

它适用于那些必须在 ApplicationContext 创建前、甚至在 Environment 加载前 就要执行的操作,例如:

作用说明
自定义启动日志打印应用启动时间、版本、环境信息
动态加载配置从远程配置中心(如 Apollo、Nacos)提前拉取配置
加密解密敏感配置对 application.yml 中的加密字段进行解密
启动前健康检查检查端口是否被占用、网络是否可达
集成 APM 监控探针在容器初始化前注入 SkyWalking、Pinpoint 等探针
环境隔离根据机器 IP 或容器标签动态切换配置源

⚠️ 重要:
SpringApplicationRunListener 的所有方法都在 Spring 容器创建之前执行,因此:

  • ❌ 不能注入 @Autowired Bean
  • ❌ 不能使用 @Value、@ConfigurationProperties
  • ✅ 只能使用 Java 原生 API、系统属性、配置文件、外部服务(如 HTTP)
  • ✅ 经过本人实际测试,目前依旧依赖 META-INF/spring.factories 进行注册,其他方式均不行。

注册方式 - 使用 spring.factories,可千万不要使用 @Component 或者 org.springframework.boot.autoconfigure.AutoConfiguration.imports

# src/main/resources/META-INF/spring.factories
org.springframework.boot.SpringApplicationRunListener=\
    com.example.test.listener.CustomSpringApplicationRunListener

二、ApplicationListener / @EventListener 是什么?有什么作用?

🔍 定义:

ApplicationListener 是 Spring 框架提供的容器级事件监听器接口,@EventListener 是其注解形式。

它们是Spring 容器管理的 Bean,在 ApplicationContext 创建并刷新后才生效。

🎯 核心作用:

✅ 监听 Spring 容器内部发生的事件,用于业务逻辑的解耦与响应。

典型应用场景:

作用说明
用户注册后发邮件监听 UserRegisteredEvent
订单支付成功扣库存监听 OrderPaidEvent
缓存预热监听 ApplicationReadyEvent
系统启动后初始化定时任务监听 ApplicationReadyEvent
优雅关闭清理资源监听 ApplicationStoppingEvent

✅ 这些监听器可以注入任何 Spring Bean(如 RedisTemplate、JdbcTemplate、RestTemplate),支持异步(@Async)、条件过滤(condition)、事务控制。


三、核心区别对比表(必须掌握)

维度SpringApplicationRunListenerApplicationListener / @EventListener
所属层级Spring Boot 框架层Spring 容器层
加载时机ApplicationContext 创建前ApplicationContext 刷新后
是否受 Spring 管理❌ 否(通过 SPI 加载)✅ 是(@Component、@Service)
能否注入 Bean❌ 不能(无 Spring 上下文)✅ 可以(@Autowired)
能否使用 @Value❌ 不能✅ 可以
是否支持 @Async❌ 不适用✅ 支持
是否支持 condition❌ 不支持✅ 支持(如 condition = "#event.userId > 1000")
事件类型SpringApplicationEvent 子类ApplicationEvent 子类
典型事件ApplicationStartingEvent、ApplicationEnvironmentPreparedEventApplicationReadyEvent、ContextRefreshedEvent
使用方式实现接口 + META-INF/spring.factories 注册实现接口或使用 @EventListener 注解
适用场景启动前配置、环境初始化、安全加固业务解耦、异步处理、缓存、日志、通知
调试难度高(无断点、无日志上下文)低(标准 Spring Bean,可调试)

✅ 一句话总结:
SpringApplicationRunListener 是“启动前的守门人”,ApplicationListener 是“启动后的协作者”。


四、SpringApplicationRunListener 事件生命周期详解

Spring Boot 启动过程中,会按顺序触发以下事件(来自 SpringApplicationRunListener):

事件类触发时机说明
ApplicationStartingEventSpringApplication.run() 第一行代码执行时最早触发,此时连日志系统都未初始化
ApplicationEnvironmentPreparedEventEnvironment 已创建,但 ApplicationContext 尚未创建可读取 application.properties,可修改 Environment
ApplicationPreparedEventApplicationContext 已创建,但 Bean 未加载可修改 Bean 定义、注册自定义 BeanFactoryPostProcessor
ContextRefreshedEventApplicationContext 刷新完成,所有 Bean 加载完毕注意:这是 ApplicationListener 的事件!不是 SpringApplicationRunListener 的!
ApplicationReadyEvent应用完全启动,可处理请求ApplicationListener 监听事件
ApplicationFailedEvent启动过程中抛出异常可用于发送告警

⚠️ 注意:ContextRefreshedEvent、ApplicationReadyEvent 是 ApplicationListener 的事件,SpringApplicationRunListener 不会监听它们!


五、标准实战示例:SpringApplicationRunListener(带详细中文注释)

✅ 场景:在 Spring 容器启动前,从远程配置中心动态加载加密密钥,用于解密数据库密码

🎯 背景:
  • 数据库密码在 application.yml 中是加密的:password: {AES}xxxxx
  • 需要在 DataSource 创建前,从 Nacos 获取解密密钥
  • 不能使用 @Value,因为此时 Spring 容器尚未创建

⚠️ 特别注意:如果你的项目使用了 Java 模块系统(module-info.java),确保你的模块对 spring.boot 可读,并且 META-INF/spring.factories 仍能被正确加载。Spring Boot 3 默认支持模块化,但 spring.factories 机制依然有效(尽管官方推荐迁移到 spring.factories 的替代方案,如 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,但 SpringApplicationRunListener 目前仍依赖 spring.factories)。经我本人测试,目前在 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中注册 SpringApplicationRunListener 是无效的,千万要注意!!!


步骤 1:实现 SpringApplicationRunListener 接口

package com.example.demo.listener;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringApplicationRunListener;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.MutablePropertySources;

import java.util.HashMap;
import java.util.Map;

/**
 * 自定义 SpringApplicationRunListener:在 Spring 容器启动前从 Nacos 获取 AES 解密密钥
 * 作用:动态注入解密密钥到 Environment,供后续 Spring Boot 自动配置使用
 * 注意:此监听器在 ApplicationContext 创建前执行,不能使用任何 Spring Bean!
 */
public class NacosKeyLoaderRunListener implements SpringApplicationRunListener {

    private static final Logger log = LoggerFactory.getLogger(NacosKeyLoaderRunListener.class);

    private final SpringApplication application; // Spring Boot 启动器实例
    private final String[] args;               // 启动参数

    /**
     * 构造函数:Spring Boot 框架自动通过 SPI 调用此构造器
     * 必须有此构造器,且参数必须为 SpringApplication + String[]
     *
     * @param application Spring Boot 启动器对象
     * @param args 命令行参数(如 --spring.profiles.active=prod)
     */
    public NacosKeyLoaderRunListener(SpringApplication application, String[] args) {
        this.application = application;
        this.args = args;
        log.info("🔧 [SpringApplicationRunListener] 初始化:监听器已加载,但 Spring 容器尚未创建");
    }

    /**
     * 应用启动时触发(最早触发)
     * 此时日志系统可能还未初始化,建议使用 System.out 或 System.err
     */
    @Override
    public void starting() {
        System.out.println("🚀 [SpringApplicationRunListener] 应用启动开始,此时连日志系统都未初始化");
    }

    /**
     * Environment 准备完毕时触发
     * ✅ 此处是关键:Environment 已加载 application.yml,但 ApplicationContext 未创建
     * 我们可以在此修改 Environment,注入自定义属性
     */
    @Override
    public void environmentPrepared(ConfigurableEnvironment environment) {
        System.out.println("⚙️ [SpringApplicationRunListener] Environment 已准备,开始从 Nacos 获取解密密钥...");

        try {
            // 模拟从 Nacos 获取密钥(真实项目中调用 Nacos SDK)
            String aesKey = fetchAesKeyFromNacos();

            if (aesKey != null && !aesKey.trim().isEmpty()) {
                // 创建一个自定义的 PropertySource
                Map<String, Object> keyMap = new HashMap<>();
                keyMap.put("crypto.aes.key", aesKey); // 键名必须与解密器匹配

                // 将自定义属性注入 Environment
                MapPropertySource customSource = new MapPropertySource("nacos-aes-key", keyMap);
                MutablePropertySources propertySources = environment.getPropertySources();
                propertySources.addFirst(customSource); // 插入最前,优先级最高

                System.out.println("✅ [SpringApplicationRunListener] 成功注入解密密钥到 Environment: crypto.aes.key=***");
            } else {
                System.err.println("❌ [SpringApplicationRunListener] 从 Nacos 获取密钥失败,将使用默认密钥(不安全)");
            }

        } catch (Exception e) {
            System.err.println("🚨 [SpringApplicationRunListener] 从 Nacos 获取密钥异常,应用可能无法启动: " + e.getMessage());
            // 不抛异常,避免阻塞启动,但会记录错误
        }
    }

    /**
     * ApplicationContext 已创建,但 Bean 尚未加载
     * 可在此注册 BeanFactoryPostProcessor,修改 Bean 定义
     */
    @Override
    public void contextPrepared(ConfigurableApplicationContext context) {
        System.out.println("🏗️ [SpringApplicationRunListener] ApplicationContext 已创建,但 Bean 未加载");
    }

    /**
     * ApplicationContext 加载完成
     * 此时可访问 Bean,但框架不推荐在此做业务逻辑
     */
    @Override
    public void contextLoaded(ConfigurableApplicationContext context) {
        System.out.println("📦 [SpringApplicationRunListener] ApplicationContext 加载完成,即将刷新");
    }

    /**
     * 应用启动成功
     */
    @Override
    public void started(ConfigurableApplicationContext context) {
        System.out.println("🎉 [SpringApplicationRunListener] 应用启动成功,容器已就绪");
    }

    /**
     * 应用启动失败
     */
    @Override
    public void failed(ConfigurableApplicationContext context, Throwable exception) {
        System.err.println("💥 [SpringApplicationRunListener] 应用启动失败,异常信息:" + exception.getMessage());
        // 可在此发送告警(如调用 Webhook、写文件)
    }

    // ==================== 模拟从 Nacos 获取密钥 ====================

    /**
     * 模拟从 Nacos 配置中心获取 AES 解密密钥
     * 实际项目中应使用 Nacos SDK 或 HTTP 请求
     *
     * @return AES 密钥,或 null 表示失败
     */
    private String fetchAesKeyFromNacos() {
        // 模拟网络请求,实际项目中使用 NacosClient.getConfig(...)
        // 为简化,此处返回固定值,生产环境应使用异步、重试、超时机制
        System.out.println("🌐 [模拟] 正在从 Nacos 获取配置:dataId=crypto-key, group=DEFAULT_GROUP");

        // 模拟成功响应
        return "12345678901234567890123456789012"; // 32 字节 AES 密钥

        // 生产示例:
        // String config = nacosClient.getConfig("crypto-key", "DEFAULT_GROUP", 5000);
        // return config != null ? config : null;
    }
}

步骤 2:注册监听器(SPI 机制)

在 src/main/resources/META-INF/spring.factories 文件中添加:

# Spring Boot 启动监听器注册
org.springframework.boot.SpringApplicationRunListener=com.example.demo.listener.NacosKeyLoaderRunListener

✅ 关键点:

  • 文件名必须为 spring.factories
  • 路径必须为 src/main/resources/META-INF/spring.factories
  • 键名必须为 org.springframework.boot.SpringApplicationRunListener
  • 值为全限定类名(多个用逗号分隔)

步骤 3:配套使用 Spring Boot 加密解密功能(可选)

在 application.yml 中配置加密密码:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: {AES}U2FsdGVkX1+Rl5a3d8f9J8Z7b4a6f1d2e3c4b5v6n7m8= # 加密后的密码
  crypto:
    aes:
      key: ${crypto.aes.key:defaultKey123456789012345678901234} # 从 Environment 获取,由监听器注入

💡 Spring Boot 内置了 EnvironmentPostProcessor 支持 {AES}xxx 解密,前提是配置了 crypto.aes.key


步骤 4:启动应用,观察控制台输出

运行 main 方法,你将看到如下日志:

🚀 [SpringApplicationRunListener] 应用启动开始,此时连日志系统都未初始化
⚙️ [SpringApplicationRunListener] Environment 已准备,开始从 Nacos 获取解密密钥...
🌐 [模拟] 正在从 Nacos 获取配置:dataId=crypto-key, group=DEFAULT_GROUP
✅ [SpringApplicationRunListener] 成功注入解密密钥到 Environment: crypto.aes.key=***
🏗️ [SpringApplicationRunListener] ApplicationContext 已创建,但 Bean 未加载
📦 [SpringApplicationRunListener] ApplicationContext 加载完成,即将刷新
🎉 [SpringApplicationRunListener] 应用启动成功,容器已就绪

✅ 验证成功:
数据源能正常连接,说明 {AES}xxx 已被正确解密 —— 因为我们在 environmentPrepared 中注入了密钥!


六、ApplicationListener 示例:对比验证(业务层)

package com.example.demo.listener;

import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 业务层监听器:在应用完全启动后,打印数据库连接状态
 * ✅ 可以注入 Spring Bean!
 */
@Component
public class DatabaseHealthListener implements ApplicationListener<ApplicationReadyEvent> {

    private static final Logger log = LoggerFactory.getLogger(DatabaseHealthListener.class);

    @Resource
    private DataSource dataSource; // ✅ 可以注入!Spring 容器已创建

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        try {
            // ✅ 调用数据库连接测试
            boolean valid = dataSource.getConnection().isValid(5);
            log.info("✅ [ApplicationListener] 数据库连接正常,可用性:{}", valid);
        } catch (Exception e) {
            log.error("❌ [ApplicationListener] 数据库连接异常", e);
        }
    }
}

✅ 对比结论:

  • NacosKeyLoaderRunListener:必须在 DataSource 创建前注入密钥 → 用它
  • DatabaseHealthListener:在容器启动后检查连接 → 用它

七、使用注意事项与最佳实践

类别注意事项
SpringApplicationRunListener
✅ 必须使用 SPI 注册否则不会被加载
✅ 不能注入任何 Bean包括 @Autowired、@Value、@ConfigurationProperties
✅ 避免耗时操作会阻塞整个应用启动
✅ 异常处理要谨慎抛出异常会导致启动失败,但不影响 Spring 容器(因为还没创建)
✅ 日志输出建议用 System.out因为 SLF4J 可能未初始化
✅ 仅用于启动前配置不要用于业务逻辑
ApplicationListener
✅ 必须是 Spring Bean加 @Component 或 @Service
✅ 可注入任何 Spring Bean数据库、缓存、HTTP 客户端均可
✅ 支持异步、条件过滤、事务@Async、condition、@Transactional 均可用
✅ 适用于业务解耦如订单、用户、支付等事件

八、何时使用哪种监听器?决策树

graph TD
    A[需要在 Spring 容器启动前执行?] -->|是| B[使用 SpringApplicationRunListener]
    A -->|否| C[需要在容器启动后响应事件?]
    C -->|是| D[使用 ApplicationListener 或 @EventListener]
    B --> E[场景:加载远程配置、解密密钥、端口检查、APM 探针注入]
    D --> F[场景:发邮件、缓存预热、日志记录、库存扣减、积分奖励]

✅ 记住口诀:
“启动前用 SPI,启动后用 Bean”


九、总结:开发者必须掌握的监听器选择指南

问题推荐方案
我想在 application.yml 加载后、数据库连接前,动态修改配置✅ SpringApplicationRunListener + environmentPrepared
我想在应用启动完成后,初始化 Redis 缓存✅ @EventListener(ApplicationReadyEvent.class)
我想在用户注册后发邮件✅ @EventListener(UserRegisteredEvent.class)
我想在启动前检查 8080 端口是否被占用✅ SpringApplicationRunListener + starting()
我想在 /actuator/health 中暴露 Redis 状态✅ HealthIndicator + @EventListener(ApplicationReadyEvent)
我想在配置文件中使用 {AES}xxx,并从 Nacos 获取密钥✅ SpringApplicationRunListener + environmentPrepared 注入密钥

✅ 最终建议

  • 90% 的业务场景 → 使用 @EventListener
  • 10% 的启动前配置 → 使用 SpringApplicationRunListener
  • 不要混用:不要试图在 SpringApplicationRunListener 中调用 @Service,会报 NullPointerException
  • 测试建议:
    • 测试 ApplicationListener:使用 @SpringBootTest + ApplicationEventPublisher.publishEvent()
    • 测试 SpringApplicationRunListener:启动真实应用,观察控制台日志

💡 进阶建议:
若你使用 Spring Cloud Alibaba Nacos,官方已提供 NacosConfigApplicationListener,你无需重复造轮子。
本示例适用于自定义配置中心、私有加密方案、企业级安全加固等特殊场景。

零基础教程:用Python给试卷照片自动切题(有道OCR+PIL完整流程) 本文为零基础用户提供了一套完整的Python自动化切题方案。通过调用有道OCR API识别试卷照片中的题目坐标,并利用PIL库进行精准裁剪,将杂乱的试卷图片自动分割为独立的题目图像。教程详细涵盖了环境搭建、图像预处理、API调用、坐标解析与批量处理全流程,帮助教育工作者和技术爱好者高效处理大量试卷,实现工作流程自动化。 阅读详情

相关推荐

使用sklearn学习多项式回归(三)

1,什么是线性 我们无数次提到”线性“这个名词。在支持向量机中,我们也曾经提到最初的支持向量机只能够分割线性可分的数据,然后引入了”核函数“来帮助我们分类那些非线性可分的数据。我们也曾经说起过,比如说决策树,支持向量机是”非线性“模型。所有的这些概念,让我们对”线性“这个词非常熟悉,却又非常陌生——因为我们并不知道它的真实含义。接下来我们看看线性回归模型改进的核心之一:帮助线性回归解决非线性问题。 1.1,变量之间的线性关系 ”线性“这个词用于描述不同事物时有着不同的含义。我们最常使用的线性是指“变量

理科男同学 5100

SpringApplicationRunListener详解

文章目录SpringApplicationRunListenerde 作用再次源码分析方法详解具体使用注意事项 SpringApplicationRunListenerde 作用 命名我们就可以知道它是一个监听者,分析springboot启动流程我们会发现,它其实是用来在整个启动流程中接收不同执行点事件通知的监听者,SpringApplicationRunListener接口规定了SpringBoot的生命周期,在各个生命周期广播相应的事件,调用实际的ApplicationListener类。 再次源码分析

你就像甜甜的益达 1万+

CST--时域仿真的网格设置技巧

对于物理概念清晰的工程师而言,使用时域算法几乎能够解决所有电磁仿真问题,但是,掌握时域算法的仿真技巧比掌握频域的难度大,这恐怕也是很多仿真工程师更喜欢使用频域算法的原因,因此,对于时域算法的灵活应用更能考验你是否是一名合格的仿真工程师。

一只豌豆象的博客 6856

Spring Boot-8-SpringBoot特有监听器SpringApplicationRunListener

Spring Boot在启动的整个过程中会有一些逻辑需要处理,实现的方式的就是通过监听器。Spring设计监听器的方式比较简洁,这里的监听器和Servlet的ServletContextListener没有什么关系。org.springframework.boot.SpringApplicationRunListener 始自Spring Boot 1.0.0 org.springframework.boot.SpringApplication run方法的监听器。所有的SpringApplicationR

诗人不写诗 3466

Springboot信息泄露以及heapdump的利用

努力是为了不平庸~安全有些时候是枯燥的,这一次,让我们先人一步,趣学渗透!

LiBai'S BLOG 3万+

别再手动抓波形了!用Synopsys AXI VIP的Port Monitor自动收集事务数据(附完整连接Scoreboard代码)

当标准Port Monitor无法满足需求时,Synopsys提供的callback机制就像一套精密的手术工具,允许你深入VIP内部进行定制化改造。创建自定义监控点的四步法继承基类// 其他自定义字段...endclass重写目标phase方法// 克隆事务并发送到自定义端口在env中注册callbackcustom_cb);连接自定义端口到分析组件经典应用场景地址phase特定检查数据beat级监控自定义性能统计异常注入检测。

weixin_28716181的博客 396

SpringApplicationRunListener简单介绍

SpringApplicationRunListener 接口的作用主要就是在Spring Boot启动初始化的过程中可以通过SpringApplicationRunListener接口回调来让用户在启动的各个流程中可以加入自己的逻辑。 Spring Boot启动过程的关键事件(按照触发顺序)包括: 开始启动 Environment构建完成 ApplicationContext构建完成 ApplicationContext完成加载 ApplicationContext完成刷新并启动 启动完成 启动失败.

weixin_40705360的博客 1045

自监督预训练(三)wav2vec 2.0原理剖析

一、整体流程 二、feature encoder 理解Conv1d nn.Conv1d(in_channels=5, out_channels=20, kernel_size=3, stride=2) 假设输入input=(batch, in_channels, in_len) batch=1 in_channels=5,对应向量大小,比如word embedding in_len=10,对应word的个数 cnn内部kernel=(in_channels, kernel_size)=(5,3),相当

xmdxcsj的专栏 2万+

【Spring Boot 源码学习】SpringApplication 的 run 方法监听器

本篇博文 Huazie 同大家一起深入分析了 SpringApplication 的 run 方法监听器,从配置的加载,接口定义,实现类等方面作了详细了解,最后通过自定义 SpringApplicationRunListener 接口实现并运行查看,进一步加深了理解。

Huazie 2049

PCL RANSAC采样一致性算法

一直想了解一下RANSAC算法的一些原理,所以就趁着自己闲了下来整理了一下,做了这篇笔记。 文章目录一、简介二、PCL中的RANSAC 一、简介 RANSAC是一种随机参数估计算法。RANSAC从样本中随机抽选出一个样本子集,使用最小方差估计算法对这个子集计算模型参数,然后计算所有样本与该模型的偏差,再使用一个预先设定好的阈值与偏差比较,当偏差小于阈值时,该样本点属于模型内样本点(内点),否则就是外样本点(外点)。记录当前的内点的个数,然后重复上述的过程,直到模型中的内点达到最多,那么此时的模型参数即为最

dayuhaitang1的博客 2115

Linux ARM平台开发系列讲解(LED) 2.1.1 如何点亮一个LED之添加设备树信息

1. 设备树添加设备信息 我拿到的开发板上有两颗LED供用户编程使用,分别是GPIO5_IO8和GPIO5_IO9,设备信息如下,不同板子的设备定义不同,根据自己的实际情况进行添加。 2. 编译设备树 根据自己拿到的SDK,执行编译命令,我这里拿到的SDK编译脚本为: ./build.sh kernel 3. 使用uuu工具烧录新编译好的内核 因为imx8 SDK设备树和内核是统一编译成一个镜像,所以只需要烧录内核,设备树文件也会烧录。 sudo uuu -b emmc imx-kernel.bin

DSMGUOGUO的博客 917

springboot之ApplicationListener

1:spring中的events 我们知道,事件处理首先是事件,对于事件,spring定义了抽象类org.springframework.context.ApplicationEvent,实现了jdk的接口java.util.EventObject,源码如下: // 该抽象类需要被具体的事件实现才又意义,这也是设置为abstrac的原因 public abstract class ApplicationEvent extends EventObject { // 事件发生的时间点 private fi

wang0907的博客 4853

杰理AC696N系列芯片外部中断使用教程

本教程详细介绍了杰理AC696N芯片的GPIO引脚中断唤醒功能实现方法。主要内容包括: 功能特点: 支持任意GPIO引脚配置为中断源 可灵活选择上升沿或下降沿触发 提供自定义中断回调函数接口 核心实现: 通过port_wkup_interrupt_init()函数配置GPIO属性 使用request_irq()注册中断服务程序 提供中断使能/关闭接口 注意事项: 此功能在低功耗模式下无效 需注意引脚冲突和中断优先级设置 建议在回调函数中实现简洁的逻辑 应用场景: 按键检测 外部信号监测 事件触发等 本方案提

qq_42014563的博客 944

SpringBoot启动监听SpringApplicationRunListener

命名我们就可以知道它是一个监听者,分析springboot启动流程我们会发现,它其实是用来在整个启动流程中接收不同执行点事件通知的监听者,SpringApplicationRunListener接口规定了SpringBoot的生命周期,在各个生命周期广播相应的事件,调用实际的ApplicationListener类。

程序缘 2142

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【SpringBoot】一张图看懂初始化阶段-SpringApplicationRunListener运行周期

​它其实是用来在整个启动流程中接收不同执行点事件通知的监听者,SpringApplicationRunListener接口规定了SpringBoot的生命周期,在各个生命周期广播相应的事件,调用实际的ApplicationListener类。 Spring Boot 的启动配置原理可以概括如下:总的来说,Spring Boot 的启动配置原理是基于自动化的约定和条件化配置机制。它通过读取配置文件、扫描注解、自动配置组件等步骤,简化了应用程序的配置过程,并提供了灵活性和易用性。java程序由启动主类调用mai

精益求精 1586

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【Spring Boot 源码学习】ApplicationListener 详解

本篇 Huazie 带大家详细分析一下Spring Boot中 ApplicationListener 的加载和处理应用程序事件的逻辑

Huazie 2528

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SpringApplicationRunListener

SpringApplicationRunListener SpringApplicationRunListener是一个只有SpringBoot应用的main方法执行过程中接收不同执行时点事件通知的监听者: public interface SpringApplicationRunListener { void started(); void environmentPrepared(ConfigurableEnvironment environment); void contextP

976

spring-boot启动源码分析(二)之SpringApplicationRunListener

在上一篇《》后,继续看了一个月的Spring boot启动源码,初步把流程看完了,接下来会不断输出总结,以巩固这段时间的学习。同时也希望能帮到同样感兴趣的同学。话不多说,进入正题环境介绍:spring boot版本:2.7.18主要starter:spring-boot-starter-webSpringApplication实例构造后,就开始调用它的run方法,开始启动spring boot。方法如下:本篇主要介绍上图中的4步,SpringApplicationRunListener会重点讲。

lft18的博客 1356

SpringBoot中ApplicationListener和SpringApplicationRunListener的区别

前言 最近在学习SpringBoot源码的时候发现了ApplicationListener和SpringApplicationRunListener两个监听器。一开始很容易将两个监听器混淆。以为都是SpringBoot的监听器。后面才发现他们是在不同的阶段被SpringBoot扫描并实例化的。 ApplicationListener加载详解 首先ApplicationListener是在SpringApplication类实例化的时候就加载的,Spring会从所有的spring.factories文件中加载

weixin_51110958的博客 2001

SpringBoot核心机制三、ApplicationListener

文章目录一、事件监听器使用1、自己实现一个事件监听器2、事件监听器的其他配置方式:2.1 SpringApplication.addListener2.2 基于注解添加2.3 在SpringBoot的配置文件中配置二、核心机制解读三、SpringBoot中的核心实现 所有调试均使用SpringBoot 2.4.5版本。 ApplicationListener事件监听机制其实是由Spring提供的,应用内部的事件驱动机制。也就是Pub/Sub发布订阅机制在应用内部的实现。一般主要是用于监控应用内部的一些运

roykingw的专栏 1659

ApplicationListener和SpringApplicationRunListener的联系

前言 ApplicationListener接口属于package org.springframework.context; SpringApplicationRunListener接口属于package org.springframework.boot; 从《SpringBoot技术内幕》一书中得知: ApplicationContext通过ApplicationListener监听ApplicationEvent 该书实在介绍SpringBoot项目中的SpringApplication.run()

weixin_41866717的博客 2146

SpringApplication方法run的事件监听器机制

简介 Spring boot应用,这里具体的来说,是指类SpringApplication,在其run()方法运行过程中,主要围绕所使用ApplicationContext对象的生命周期事件,应用了一个事件监听器机制提供了相应的程序扩展入口点,开发人员可以基于此机制,在相应的事件发生时执行特定的逻辑。 SpringApplication应用的该事件监听器机制主要利用如下两个类/接口 : S...

Details Inside Spring 6314

如何使用SpringApplicationRunListener在Spring Boot 应用的不同生命周期阶段插入自定义逻辑

starting方法方法在run方法刚开始时立即调用,用于非常早期的初始化操作。方法在环境准备好但尚未创建之前调用。此方法可以用于在环境配置完成后执行逻辑。方法在创建并准备好,但尚未加载资源之前调用。方法在加载完成但尚未刷新之前调用。started方法在上下文刷新后,应用启动完成,但和尚未执���时调用。ready方法在run方法即将结束时调用,此时应用上下文已刷新,所有和已执行。failed方法如果应用启动过程中发生异常,则调用此方法。是 Spring 框架中一个抽象类,位于包下。

罗小爬的技术宝书 1134

SpringApplicationRunlistener和Applicationlistener区别

初始化 1. SpringApplicationRunListener属于应用程序启动层面的监听器,在springboot启动时候,调用run方法进行反射加载初始化。此时上下文还没有加载,如果通过@Compnant是起不了作用的。根据下图看下 springApplication.run()方法进入到getRunListeners(args)。 getRunListeners(args)方法进入到getSpringFactoriesInstances(…)方法(此处参数省略),继续走到SpringFa

qq_40204976的博客 3696

SpringBoot中SpringApplicationRunListeners类的作用

是 Spring Boot 中的一个重要类,它主要负责管理和触发应用程序运行期间的各种事件监听器。

z17826856787的博客 326

Spring Boot 深入剖析:SpringApplicationRunListener

在研究SpringBoot的启动源码的时候我们看到run方法中有一个之前没见过的类SpringApplicationRunListeners 类,那么这个类的主要作用是什么呢?接下来我们来解析一下这个类。

qq_65779957的博客 1235
上一篇: Spring Boot 事件机制四大核心应用场景实践指南
下一篇: Spring Boot 启动后执行器深度指南:CommandLineRunner vs ApplicationRunner
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值