1. @PostConstruct

  • JSR-250 标准注解(不是 Spring 独有),用来标记 Bean 初始化完成后要执行的方法。
  • 会在 Bean 的构造方法执行完、依赖注入完成后执行。

使用实例:

@Component
public class Demo {@PostConstructpublic void init() {System.out.println("PostConstruct执行");}
}

执行时机: Bean 构造 → 依赖注入 → @PostConstruct方法 → 初始化完成

2. InitializingBean (afterPropertiesSet)

  • Spring 提供的接口,只要实现了它,就必须实现afterPropertiesSet()方法。
  • afterPropertiesSet()在 Bean 的依赖注入完成后执行(和 @PostConstruct 类似,但优先级稍后一些)。

使用实例:

@Component
public class Demo implements InitializingBean {@Overridepublic void afterPropertiesSet() {System.out.println("afterPropertiesSet执行");}
}

执行时机: Bean 构造 → 依赖注入 → @PostConstructafterPropertiesSet

3. ApplicationListener

  • Spring 的事件监听器机制的一部分,用于监听 Spring 容器内发生的事件(如 ContextRefreshedEvent、ApplicationReadyEvent 等)。
  • 可以实现 ApplicationListener 或使用 @EventListener 注解。

示例:监听 ContextRefreshedEvent

@Component
public class Demo implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {System.out.println("ApplicationListener执行");}
}

执行时机:

  • ContextRefreshedEvent:Spring 容器初始化或刷新完成后发布,通常用于监听上下文准备完毕(比 CommandLineRunner 更早一点)。
  • ApplicationReadyEvent:Spring Boot 特有,表示整个 Spring Boot 应用完全启动(更接近 CommandLineRunner)。

4. CommandLineRunner

  • Spring Boot 提供的接口。实现后会在整个 Spring 容器启动完成(所有 Bean 初始化结束)之后执行。
  • 用来执行一些项目启动后的逻辑,比如初始化数据、打印信息。

使用示例:

@Component
public class Demo implements CommandLineRunner {@Overridepublic void run(String... args) {System.out.println("CommandLineRunner执行");}
}

执行时机: Spring 容器完全启动 → run 方法执行 → 也就是在所有 @PostConstruct、InitializingBean 执行完之后

5. Bean生命周期(Spring容器级别)

  • 实例化(Instantiation):Spring 通过反射调用构造方法,创建 Bean 实例。
  • 属性填充(Dependency Injection):Spring 把依赖(@Autowired@Value@Resource等)注入到 Bean 里。
  • BeanPostProcessor 前置处理(postProcessBeforeInitialization):Spring 会调用注册的所有 BeanPostProcess 的 postProcessBeforeInitialization()@PostConstruct的执行就是这里触发的:CommonAnnotationBeanPostProcessor 负责找出@PostConstruct并执行。
  • 初始化(InitializingBean、init-method):如果实现了InitializingBean,调用afterPropertiesSet()。如果在@Bean(initMethod="xxx")指定了初始化方法,也会执行。
  • BeanPostProcessor 后置处理(postProcessAfterInitialization):再次调用注册的 BeanPostProcessor 的 postProcessAfterInitialization()。比如 AOP、代理包装,就是这一步做的。
  • Bean 就绪,可使用:到这里,这个 Bean 就放到 Spring 容器里了,可以被别的 Bean 使用。
实例化 ➜ 依赖注入 ➜ postProcessBeforeInitialization⮑ @PostConstruct
➜ InitializingBean.afterPropertiesSet()init-method
➜ postProcessAfterInitialization
➜ 可用

6. SpringBoot 的启动时间线(整个应用级别)

  • SpringApplication.run()启动入口:创建ApplicationContext (即Spring容器)。
  • 准备环境(ApplicationEnvironmentPreparedEvent):配置文件、属性源准备好。
  • 容器初始化(ApplicationPreparedEvent):ApplicationContext已经创建,但 Bean 还没加载。
  • Bean 加载 → Bean 生命周期
  • 容器刷新完成(ContextRefreshedEvent):所有 Bean 都加载完成。可以用ApplicationListener<ContextRefreshedEvent>在这里干事。
  • ApplicationStartedEvent:Spring 容器准备好,还没执行 CommandLineRunner / ApplicationRunner
  • 执行 CommandLineRunner / ApplicationRunner:所有事件都发完,启动逻辑完成。
  • ApplicationReadyEvent:SpringBoot 应用准备就绪,可以对外提供服务了。
SpringApplication.run() ➜ 加载环境 (EnvironmentPrepared)➜ 创建容器 (Prepared)➜ Bean 生命周期 (实例化 ➜ @PostConstruct ➜ afterPropertiesSet)➜ 容器刷新完成 (ContextRefreshedEvent)➜ ApplicationStartedEvent➜ CommandLineRunner / ApplicationRunner➜ ApplicationReadyEvent

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

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

相关文章

【AI】Java生态对接大语言模型:主流框架深度解析

文章目录1. Deep Java Library (DJL)2. LangChain4j&#xff08;LLM&#xff09;3. HuggingFace Inference API4. OpenAI Java Client技术对比矩阵架构设计建议在人工智能浪潮下&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为技术核心。Java生态通过以下框架实现高效…

【06】C#入门到精通——C# 多个 .cs文件项目 同一项目下添加多个 .cs文件

文章目录1 单个 .cs文件2 创建 多个 .cs文件2.1 添加Hero类2.1 添加ShowInfo类2.3 关于命名空间的引用2.4 所有.cs文件代码3 test3项目文件下载1 单个 .cs文件 上一讲中 描述游戏中英雄的角色 所有代码在一个.cs文件中&#xff0c; 如果代码很多&#xff0c;类很多&#xff0…

【MySQL基础篇】:MySQL常用数据类型的选择逻辑与正确使用

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;MySQL篇–CSDN博客 文章目录数据类型1.数据类型分类2.数值类型int整形类型bit位类型float小…

三、搭建springCloudAlibaba2021.1版本分布式微服务-springcloud loadbalancer负载均衡

什么是负责均衡 Spring Cloud LoadBalancer是一个客户端负载均衡器&#xff0c;类似于Ribbon&#xff0c;但是由于Ribbon已经进入维护模式&#xff0c;并且Ribbon 2并不与Ribbon 1相互兼容&#xff0c;所以Spring Cloud全家桶在Spring Cloud Commons项目中&#xff0c;添加了Sp…

Oracle不完全恢复实战指南:从原理到操作详解

核心提示&#xff1a;当误删表、日志损坏或控制文件丢失时&#xff0c;Oracle的不完全恢复是DBA最后的救命稻草。掌握关键恢复技术&#xff0c;可在数据灾难中力挽狂澜。一、不完全恢复核心概念 1. 核心特点 必须关闭数据库&#xff1a;在MOUNT状态下执行重做日志恢复权限要求&…

Linux之shell脚本篇(二)

一、shell编程之if语句引言Linux在shell编程中&#xff0c;通常都是以自上而下运行&#xff0c;但是为了提高其代码严谨性&#xff0c;我们即引入了多条件 控制语句例如&#xff1a;if、for、while、case等语句&#xff0c;有时候针对条件我们还会结合正则表达式去运用。将这些…

如何在android framewrok dump camera data

实现dump 函数 实现1 void dumpBufferToFile(buffer_handle_t* buffer, int width, int height, int frameNum) {void* data NULL;GraphicBufferMapper::getInstance().lock(*buffer, GRALLOC_USAGE_SW_READ_OFTEN, Rect(width, height), &data);char filename[128];sprin…

机器学习中的可解释性:深入理解SHAP值及其应用

机器学习可解释性的重要性在人工智能技术快速发展的2025年&#xff0c;机器学习模型已经深度渗透到医疗诊断、金融风控、司法量刑等关键领域。然而&#xff0c;随着模型复杂度的不断提升&#xff0c;一个根本性矛盾日益凸显&#xff1a;模型预测性能的提升往往以牺牲可解释性为…

.NET9 使用 OData 协议项目实战

.NET 中 ODate 协议介绍 OData(Open Data Protocol) 是一个开放的 Web 协议&#xff0c;用于查询和更新数据。在 .NET 生态系统中&#xff0c;OData 被广泛支持和使用。 主要特性 1. 统一的数据访问方式 提供标准化的查询语法支持 CRUD 操作支持元数据描述 2. 查询能力 标…

Android 性能优化:提升应用启动速度(GC抑制)

前言 在移动应用开发领域&#xff0c;启动速度是用户体验的重要指标。对于Android应用而言&#xff0c;垃圾回收&#xff08;Garbage Collection, GC&#xff09;机制虽然是内存管理的核心&#xff0c;但在应用启动期间频繁触发GC会显著拖慢启动速度。本文将深入探讨如何通过GC…

做了一款小而美的本地校验器

需求说明 前阵子收到一则读者留言&#xff0c;指出&#xff1a;市面上AI核稿工具&#xff08;ProWritingAid&#xff0c;WPS AI Spell Check&#xff0c;Writer&#xff0c;QuillBot&#xff0c;Grammarly&#xff09;要么收费太高&#xff0c;要么让人担心文章泄露。 如下图所…

uniapp + uview-plus 微信小程序二维码生成和保存完整解决方案

uniapp + uview-plus 微信小程序二维码生成和保存完整解决方案 📋 项目背景 在开发微信小程序时,经常需要实现二维码的生成和保存功能。本文档提供了一个基于 uniapp + uview-plus 框架的完整解决方案,彻底解决了以下常见问题: ✅ Canvas API 兼容性问题 ✅ 微信小程序权…

Linux中应用程序的安装于管理

Linux中应用程序的安装于管理 一 . rpm安装 1.挂载 光驱里面存放了很多rpm的软件包 光驱在系统中使用时&#xff0c;需要挂载 mount /dev/cdrom /mnt/ cd /mnt[rootstw mnt]# ls CentOS_BuildTag GPL LiveOS RPM-GPG-KEY-CentOS-7 EFI images Packag…

mysql重置密码

要区分 MySQL 是通过 systemd 还是传统 service 管理&#xff0c;以及对应的密码重置方案&#xff0c;可按以下步骤操作&#xff1a; 一、如何区分管理方式&#xff08;systemd 还是传统 service&#xff09; 通过以下命令判断系统默认的服务管理方式&#xff1a;检查系统是否使…

C++ TAP(基于任务的异步编程模式)

&#x1f680; C TAP&#xff08;基于任务的异步编程模式&#xff09;1. 引言&#xff1a;走进异步编程新时代&#xff08;&#x1f680;&#xff09; 在当今高性能计算领域&#xff0c;同步编程模型的局限性日益凸显。传统的回调地狱和线程管理复杂性促使微软提出了基于任务的…

利用C++手撕栈与队列的基本功能(四)

栈和队列详细教程可以观看 https://www.bilibili.com/video/BV1nJ411V7bd?spm_id_from333.788.videopod.episodes&vd_sourcedaed5b8a51d3ab7eb209efa9d0ff9a34&p48栈和队列概念 栈和队列是限定插入和删除只能在表的端点进行的线性表在装电池、装弹夹、拿放盘子时都会出…

net8.0一键创建支持(Redis)

Necore项目生成器 - 在线创建Necore模板项目 | 一键下载 RedisController.cs using CSRedis; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using UnT.Template.Application.Responses; using UnT.Template.Domain;namespace UnT.Template.Controllers {…

Leetcode——42. 接雨水

还记得第一次见该题根本无从下手。其实&#xff0c;我们不妨把问题拆解&#xff0c;简单化。不要怕自己写的是暴力算法&#xff0c;有很多算法技巧其实就是在暴力算法的基础上优化得来。题目目的是求所有可接雨水数量&#xff0c;我们可以求出每一个位置可接雨水数量&#xff0…

Go 语言-->指针

Go 语言–>指针 它允许你操作内存中的实际数据&#xff0c;而不仅仅是数据的副本。指针存储的是另一个变量的内存地址&#xff0c;而不是变量的实际值。 1. 什么是指针 指针是存储变量内存地址的变量&#xff0c;它指向另一个变量。通过指针&#xff0c;你可以间接地访问和修…

软工八将:软件开发全流程核心角色体系解析

软工八将&#xff1a;软件开发全流程核心角色体系解析 作者注&#xff1a;本概念是由大学生董翔提出&#xff0c;具有一些影响意义。 在现代软件开发领域&#xff0c;团队角色的专业化分工是产品成功的核心保障。“软工八将”作为一套系统梳理软件开发全流程核心角色的术语&…