SpringBoot初始化8个常用方法
在 Spring Boot 中,初始化方法通常是在应用程序启动时被调用的,可以用来执行应用启动时的一些准备工作。以下是几种常见的初始化方法:
一、顺序
1. 图解
┌─────────────────────────────┐│ Spring Boot启动 │└─────────────────────────────┘│▼┌─────────────────────────────┐│ Spring Application ││ Context 加载和注入 │└─────────────────────────────┘│▼┌─────────────────────────────┐│ 依赖注入完成 ││ (`@PostConstruct`) │└─────────────────────────────┘│▼┌─────────────────────────────┐│ `InitializingBean` ││ 调用 `afterPropertiesSet()`│└─────────────────────────────┘│▼┌─────────────────────────────┐│ 初始化 `@Bean` ││ (配置类中 `@Bean` 方法) │└─────────────────────────────┘│▼┌─────────────────────────────┐│ `CommandLineRunner` ││ 和 `ApplicationRunner` │└─────────────────────────────┘│▼┌─────────────────────────────┐│ 触发应用事件 ││ (`ApplicationListener`) │└─────────────────────────────┘│▼┌─────────────────────────────┐│ 应用启动完成 ││ (`ApplicationReadyEvent`) │└─────────────────────────────┘
2. 执行顺序过程
-
Spring Boot 启动 (SpringApplication.run())
这是应用启动的入口,它会初始化 Spring 上下文,加载所有 Bean 配置等。 -
依赖注入完成后 (@PostConstruct / InitializingBean)
@PostConstruct 在所有依赖注入完成后立即执行,用于执行一些初始化工作。
InitializingBean 的 afterPropertiesSet() 方法也在所有依赖注入完成后执行,通常用于进行一些逻辑初始化。 -
初始化 @Bean 方法
Spring 会在容器启动过程中调用配置类中的 @Bean 方法进行 Bean 初始化。这些方法通常用于返回一些 Spring 管理的 Bean。 -
CommandLineRunner 和 ApplicationRunner 执行
这些接口的 run() 方法会在 Spring Boot 完全初始化后执行,通常用于执行一些在应用启动完成后的操作。 -
ApplicationListener 监听器触发
ApplicationListener 可以监听 ApplicationReadyEvent 事件等,这个事件会在应用完全启动并准备就绪后触发。 -
应用启动完成 (ApplicationReadyEvent)
当应用启动并准备好后,ApplicationReadyEvent 会被触发。此时,应用就可以接受请求或执行其他操作了。
二、方法详解
1. @PostConstruct 注解
@PostConstruct 注解用于标注一个方法,表示在 Spring 完成所有依赖注入后,会调用该方法。这通常用于类初始化时执行的操作。
@Component
public class MyService {@PostConstructpublic void init() {System.out.println("Initializing MyService...");}
}
2. CommandLineRunner 接口
CommandLineRunner 是 Spring Boot 提供的一个接口,它的 run 方法会在应用启动完成后执行。CommandLineRunner 接口允许开发者在应用启动时执行一些特定的逻辑。
@SpringBootApplication
public class MyApplication implements CommandLineRunner {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}@Overridepublic void run(String... args) throws Exception {System.out.println("Application started with CommandLineRunner...");}
}
3. ApplicationRunner 接口
ApplicationRunner 接口与 CommandLineRunner 类似,区别在于它提供了一个 ApplicationArguments 参数,可以获取启动时传入的命令行参数。
@SpringBootApplication
public class MyApplication implements ApplicationRunner {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}@Overridepublic void run(ApplicationArguments args) throws Exception {System.out.println("Application started with ApplicationRunner...");System.out.println("Non-option arguments: " + args.getNonOptionArgs());}
}
4. SpringApplication 类的 run() 方法
Spring Boot 的 SpringApplication 类的 run() 方法是应用启动的入口,它可以配置一些初始化行为,如设置应用的环境、启用配置文件等。
public static void main(String[] args) {SpringApplication app = new SpringApplication(MyApplication.class);app.setAdditionalProfiles("dev");app.run(args);
}
5. @Configuration 配置类中的 @Bean 方法
在配置类中,通过 @Bean 注解定义的 Bean 方法,会在应用启动时被执行。
@Configuration
public class AppConfig {@Beanpublic MyService myService() {return new MyService();}
}
6. ApplicationListener 监听器
ApplicationListener 可以监听 Spring Boot 应用的启动事件,例如 ContextRefreshedEvent 或 ApplicationReadyEvent,这些事件可以用于执行初始化逻辑。
@Component
public class AppStartupListener implements ApplicationListener<ApplicationReadyEvent> {@Overridepublic void onApplicationEvent(ApplicationReadyEvent event) {System.out.println("Application is ready!");}
}
7. @Bean 注解与 @PostConstruct 配合
如果你在 Spring 配置类中使用 @Bean 注解创建一个 Bean,并且需要在该 Bean 被创建后进行一些初始化操作,可以将 @PostConstruct 注解添加到 Bean 类中的初始化方法。
@Configuration
public class MyConfig {@Beanpublic MyService myService() {return new MyService();}@PostConstructpublic void setup() {System.out.println("Initializing configuration...");}
}
8. InitializingBean 接口
InitializingBean 是 Spring 提供的一个接口,允许开发者在 Bean 被初始化之后执行特定的操作。这个接口与 @PostConstruct 注解有些类似,但 InitializingBean 是一个更传统的方式,适用于较早的 Spring 版本,而 @PostConstruct 是 Java EE 标准的一部分。InitializingBean 接口的主要方法是 afterPropertiesSet(),它会在 Spring 容器完成依赖注入并且所有 Bean 属性都设置好之后执行。也就是说,afterPropertiesSet() 方法在 Bean 初始化时被调用,通常用于执行一些与 Bean 相关的初始化工作。
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;@Component
public class MyService implements InitializingBean {@Overridepublic void afterPropertiesSet() throws Exception {// 执行初始化操作System.out.println("MyService has been initialized!");}
}
执行顺序
在 Spring 中,InitializingBean 的 afterPropertiesSet() 方法的调用顺序如下:
- 依赖注入完成后:Spring 完成对所有 Bean 的依赖注入,确保所有的属性都被正确设置。
InitializingBean的afterPropertiesSet()被调用:Spring 会依次调用实现了InitializingBean接口的 Bean 的afterPropertiesSet()方法。@PostConstruct注解方法被调用:如果@PostConstruct方法存在,它将在afterPropertiesSet()后调用。
InitializingBean 与 @PostConstruct 的区别
| 特性 | InitializingBean | @PostConstruct |
|---|---|---|
| 接口/注解 | 接口 (InitializingBean) | 注解 (@PostConstruct) |
| 调用时机 | 在依赖注入完成之后调用 (afterPropertiesSet()) | 在依赖注入完成之后调用(容器初始化后,通常早于 afterPropertiesSet()) |
| 使用范围 | 需要实现 InitializingBean 接口 | 可以标注在任何一个方法上 |
| 适用场景 | 适用于老版本的 Spring 或者需要控制初始化逻辑的情况 | 适用于更简洁的场景,推荐用于标注简单初始化方法 |
与 @Bean 配合 | 可以与配置类中的 @Bean 配合,调用 afterPropertiesSet() | 一般情况下,@PostConstruct 用于实例化 Bean 时的初始化方法 |
相关文章:
SpringBoot初始化8个常用方法
在 Spring Boot 中,初始化方法通常是在应用程序启动时被调用的,可以用来执行应用启动时的一些准备工作。以下是几种常见的初始化方法: 一、顺序 1. 图解 ┌─────────────────────────────┐│ Spring Boot…...
boolen盲注和时间盲注
获取当前数据库名 import requestsdef inject_database(url):namemax_length20low{a: 97, z: 122, A: 65, Z: 90, 0: 48, 9: 57, _: 95}high{97: a, 122: z, 65: A, 90: Z, 48: 0, 57: 9, 95: _}for i in range(1, max_length 1):low_val32high_val122while low_val < hi…...
CTF-web:java-h2 堆叠注入rec -- N1ctf Junior EasyDB
代码存在sql注入 // 处理登录表单的POST请求PostMapping({"/login"})public String handleLogin(RequestParam String username, RequestParam String password, HttpSession session, Model model) throws SQLException {// 验证用户凭据if (this.userService.valid…...
TUSB422 MCU 软件用户指南
文章目录 TUSB422 MCU 软件用户指南 目录表格图表1. 介绍2. 配置2.1 通用配置2.2 USB-PD 3.0 支持2.3 VDM 支持 3. 代码 ROM/RAM 大小优化4. 通过 UART 调试4. 移植到其他微控制器 TUSB422 MCU 软件用户指南 摘要 本文档是 TUSB422 微控制器基于 Type-C 端口控制(…...
BUU37 [DASCTF X GFCTF 2024|四月开启第一局]web1234100
Hint1:本题的 flag 不在环境变量中 Hint2:session_start(),注意链子挖掘 题目: 扫描出来www.zip class.php <?phpclass Admin{public $Config;public function __construct($Config){//安全获取基…...
常见的排序算法:插入排序、选择排序、冒泡排序、快速排序
1、插入排序 步骤: 1.从第一个元素开始,该元素可以认为已经被排序 2.取下一个元素tem,从已排序的元素序列从后往前扫描 3.如果该元素大于tem,则将该元素移到下一位 4.重复步骤3,直到找到已排序元素中小于等于tem的元素…...
vue学习9
1.文章分类页面-element-plus表格 基本架子-PageContainer封装 按需引入的彩蛋,components里面的内容都会自动注册 用el-card组件,里面使用插槽或具名插槽 文章分类渲染 & loading处理 序号: <el-table-column type"index"…...
TDengine 性能测试工具 taosBenchmark
简介工具获取运行 无参数模式命令行模式配置文件模式 命令行参数配置文件参数 通用配置参数写入配置参数 数据库相关超级表相关标签列与数据列写入行为相关 查询配置参数 执行指定查询语句查询超级表 订阅配置参数数据类型对照表 配置文件示例 写入 JSON 示例查询 JSON 示例订阅…...
【xdoj离散数学上机】T283
递归函数易错: 防止出现递归死循环! 题目 题目:求诱导出的等价关系的关系矩阵 问题描述 给定有限集合上二元关系的关系矩阵,求由其诱导出的等价关系的关系矩阵。 输入格式 第一行输入n,表示矩阵为n阶方阵,…...
Javaweb中,使用Servlet编写简单的接口
案例:网页提交用户名和密码信息,后端校验密码长度需在6-12位之间 后端部分 WebServlet("/valid") public class SimpleServlet extends HttpServlet{public void service(HttpServletRequest req, HttpServletResponse resp) throws IOExcepti…...
GESP5级语法知识(十):初级数论(三)
埃氏筛法: #include <iostream> using namespace std; const int N1e61; int pri[N]; void prime(int n){for(int i2;i*i<n;i){if(pri[i]0){ // 如果i为素数for(int jii;j<n;ji){pri[j]1; // 将i的倍数标记为合数}}} } int main(){int n;cin>>n;…...
“PEP 8: W292 no newline at end of file“报错 IntelliJ IDEA自动添加空行问题
"PEP 8: W292 no newline at end of file"报错 IntelliJ IDEA自动添加空行问题 在使用IntelliJ IDEA的过程中,经常会发现不管是对于代码文件或者纯文本文件,在保存时中会在文件末尾加上一个空行,提交GIT对比检查时,总是…...
ComfyUI工作流 FluxRedux基础换装
文章目录 FluxRedux基础换装SD模型Node节点工作流程效果展示开发与应用FluxRedux基础换装 该工作流的目标是实现服装换装功能,利用多种深度学习模型和图像处理技术,通过用户输入的服装图像和模特图像,生成逼真的换装效果图。整个工作流涵盖了从图像加载、模型编码、条件生成…...
【机器学习】常见采样方法详解
在机器学习领域,数据采样(Sampling)是一项至关重要的技术。它不仅影响模型的训练效率,还直接关系到模型的性能与泛化能力。本文将从基础概念出发,逐步深入介绍机器学习中常见的采样方法,帮助读者全面理解并…...
使用瑞芯微RK3588的NPU进行模型转换和推理
使用边缘设备进行算法落地时,通常要考虑模型推理速度,NVIDA系列平台可以使用TensorRT和CUDA加速,瑞芯微RK3588的板子上都是Arm的手机GPU,虽然没有类似CUDA的加速计算方式,但是提供了NPU进行加速推理,本文说…...
Flutter项目试水
1基本介绍 本文章在构建您的第一个 Flutter 应用指导下进行实践 可作为项目实践的辅助参考资料 Flutter 是 Google 的界面工具包,用于通过单一代码库针对移动设备、Web 和桌面设备构建应用。在此 Codelab 中,您将构建以下 Flutter 应用。 该应用可以…...
【算法学习】DFS与BFS
目录 一,深度优先搜索 1,DFS 2,图的DFS遍历 (1),递归实现(隐士栈) (2),显示栈实现(非递归) 二,广度优先搜索 1,BFS 2,图的BF…...
100.16 AI量化面试题:监督学习技术在量化金融中的应用方案
目录 0. 承前1. 解题思路1.1 应用场景维度1.2 技术实现维度1.3 实践应用维度 2. 市场预测模型2.1 趋势预测2.2 模型训练与评估 3. 风险评估模型3.1 信用风险评估 4. 投资组合优化4.1 资产配置模型 5. 回答话术 0. 承前 本文通过通俗易懂的方式介绍监督学习在量化金融中的应用&a…...
基于deepseek api和openweather 天气API实现Function Calling技术讲解
以下是一个结合DeepSeek API和OpenWeather API的完整Function Calling示例,包含意图识别、API调用和结果整合: import requests import json import os# 配置API密钥(从环境变量获取) DEEPSEEK_API_KEY os.getenv("DEEPSEE…...
线性数据结构解密:数组的定义、操作与实际应用
系列文章目录 01-从零开始掌握Python数据结构:提升代码效率的必备技能! 02-算法复杂度全解析:时间与空间复杂度优化秘籍 03-线性数据结构解密:数组的定义、操作与实际应用 文章目录 系列文章目录前言一、数组的定义与特点1.1 数组…...
模拟电路缩放迷思破解:从挑战到协同优化的设计范式转变
1. 模拟电路缩放:一个被误解的“物理定律”在半导体行业里,尤其是数字电路设计工程师和项目经理之间,流传着一个近乎“常识”的观点:模拟电路不能像数字电路那样随着工艺节点进步而有效缩放。这个说法听起来很有道理,毕…...
医疗软件开发框架Framewright:HIPAA合规与FHIR集成实践
1. 项目概述:一个为医疗软件量身定制的开发框架 如果你在医疗软件行业摸爬滚打过几年,一定会对开发过程中的那些“特殊要求”深有体会。这不仅仅是写个增删改查的CRUD应用那么简单,你得时刻绷紧神经,处理HIPAA合规、处理复杂的医学…...
Human Skill Tree:基于认知科学的AI学习操作系统,重塑AI时代学习方式
1. 项目概述最近在折腾AI工具的时候,我一直在想一个问题:AI现在能通过Skill和MCP(模型上下文协议)调用各种工具,几乎无所不能,但我们人类的学习方式却还停留在“问一句,答一句”的原始阶段。这就…...
若依框架实战:参数验证异常处理(手机号码格式验证案例)
一、前言在后端开发中,参数校验是保证接口健壮性的第一道防线。若依(Ruoyi)框架作为主流的 Java 后台管理系统框架,内置了完善的参数验证与全局异常处理机制。本文将以用户管理模块的手机号码格式验证为例,从触发验证、…...
神经科学启发的边缘AI持续学习:从突触修剪到双记忆系统的架构设计
1. 项目概述:为什么我们需要一个“会学习”的边缘大脑?想象一下,你家里的扫地机器人,第一天它学会了绕过餐桌腿,第二天你搬来一把新椅子,它却一头撞了上去,然后彻底忘记了怎么绕过餐桌腿。这听起…...
HUM4D数据集:无标记人体动作捕捉的挑战与评估
1. HUM4D数据集概述HUM4D是一个专门针对无标记人体动作捕捉技术评估的基准数据集,由计算机视觉研究团队开发。这个数据集的核心价值在于填补了现有动作捕捉基准在复杂场景下的空白——那些包含快速运动、严重遮挡、深度突变和身份混淆的真实挑战。在动作捕捉领域&am…...
终极指南:NoSQL数据库大全awesome-bigdata - 文档型数据库实战入门 [特殊字符]
终极指南:NoSQL数据库大全awesome-bigdata - 文档型数据库实战入门 🚀 【免费下载链接】awesome-bigdata A curated list of awesome big data frameworks, ressources and other awesomeness. 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-b…...
为什么你的Perplexity Science搜索总错过最新预印本?——基于arXiv/medRxiv/SSRN实时源的3层校验机制(含Python自动化脚本)
更多请点击: https://intelliparadigm.com 第一章:为什么你的Perplexity Science搜索总错过最新预印本?——基于arXiv/medRxiv/SSRN实时源的3层校验机制(含Python自动化脚本) Perplexity Science 依赖第三方索引快照…...
Ctool:一站式解决开发者的日常编码烦恼
Ctool:一站式解决开发者的日常编码烦恼 【免费下载链接】Ctool 程序开发常用工具 chrome / edge / firefox / utools / windows / linux / mac 项目地址: https://gitcode.com/gh_mirrors/ct/Ctool 在日常开发工作中,我们常常需要处理各种编码转换…...
Linux终端美化:cmatrix屏保的安装与个性化配置指南
1. 初识cmatrix:从黑客帝国到你的终端 第一次看到cmatrix运行效果时,我正窝在咖啡馆调试服务器。黑色背景上不断下落的绿色字符,瞬间让我想起《黑客帝国》里尼奥看到的数字雨。这个诞生于2002年的开源项目,最初只是开发者Chris Al…...
