SpringBoot初始化8个常用方法

news2025/2/14 5:13:32

在 Spring Boot 中,初始化方法通常是在应用程序启动时被调用的,可以用来执行应用启动时的一些准备工作。以下是几种常见的初始化方法:

一、顺序

1. 图解

                ┌─────────────────────────────┐
                │    Spring Boot启动           │
                └─────────────────────────────┘
                           │
                           ▼
                ┌─────────────────────────────┐
                │     Spring Application      │
                │    Context 加载和注入         │
                └─────────────────────────────┘
                           │
                           ▼
                ┌─────────────────────────────┐
                │     依赖注入完成              │
                │       (`@PostConstruct`)    │
                └─────────────────────────────┘
                           │
                           ▼
                ┌─────────────────────────────┐
                │      `InitializingBean`     │
                │   调用 `afterPropertiesSet()`│
                └─────────────────────────────┘
                           │
                           ▼
                ┌─────────────────────────────┐
                │      初始化 `@Bean`          │
                │    (配置类中 `@Bean` 方法)    │
                └─────────────────────────────┘
                           │
                           ▼
                ┌─────────────────────────────┐
                │   `CommandLineRunner`       │
                │   和 `ApplicationRunner`    │
                └─────────────────────────────┘
                           │
                           ▼
                ┌─────────────────────────────┐
                │   触发应用事件                │
                │   (`ApplicationListener`)   │
                └─────────────────────────────┘
                           │
                           ▼
                ┌─────────────────────────────┐
                │     应用启动完成              │
                │  (`ApplicationReadyEvent`)  │
                └─────────────────────────────┘

2. 执行顺序过程

  1. Spring Boot 启动 (SpringApplication.run())
    这是应用启动的入口,它会初始化 Spring 上下文,加载所有 Bean 配置等。

  2. 依赖注入完成后 (@PostConstruct / InitializingBean)
    @PostConstruct 在所有依赖注入完成后立即执行,用于执行一些初始化工作。
    InitializingBean 的 afterPropertiesSet() 方法也在所有依赖注入完成后执行,通常用于进行一些逻辑初始化。

  3. 初始化 @Bean 方法
    Spring 会在容器启动过程中调用配置类中的 @Bean 方法进行 Bean 初始化。这些方法通常用于返回一些 Spring 管理的 Bean。

  4. CommandLineRunner 和 ApplicationRunner 执行
    这些接口的 run() 方法会在 Spring Boot 完全初始化后执行,通常用于执行一些在应用启动完成后的操作。

  5. ApplicationListener 监听器触发
    ApplicationListener 可以监听 ApplicationReadyEvent 事件等,这个事件会在应用完全启动并准备就绪后触发。

  6. 应用启动完成 (ApplicationReadyEvent)
    当应用启动并准备好后,ApplicationReadyEvent 会被触发。此时,应用就可以接受请求或执行其他操作了。

二、方法详解

1. @PostConstruct 注解

@PostConstruct 注解用于标注一个方法,表示在 Spring 完成所有依赖注入后,会调用该方法。这通常用于类初始化时执行的操作。

@Component
public class MyService {
    
    @PostConstruct
    public 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);
    }

    @Override
    public 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);
    }

    @Override
    public 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 {

    @Bean
    public MyService myService() {
        return new MyService();
    }
}

6. ApplicationListener 监听器

ApplicationListener 可以监听 Spring Boot 应用的启动事件,例如 ContextRefreshedEventApplicationReadyEvent,这些事件可以用于执行初始化逻辑。

@Component
public class AppStartupListener implements ApplicationListener<ApplicationReadyEvent> {

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        System.out.println("Application is ready!");
    }
}

7. @Bean 注解与 @PostConstruct 配合

如果你在 Spring 配置类中使用 @Bean 注解创建一个 Bean,并且需要在该 Bean 被创建后进行一些初始化操作,可以将 @PostConstruct 注解添加到 Bean 类中的初始化方法。

@Configuration
public class MyConfig {

    @Bean
    public MyService myService() {
        return new MyService();
    }

    @PostConstruct
    public 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 {

    @Override
    public void afterPropertiesSet() throws Exception {
        // 执行初始化操作
        System.out.println("MyService has been initialized!");
    }
}

执行顺序

在 Spring 中,InitializingBeanafterPropertiesSet() 方法的调用顺序如下:

  1. 依赖注入完成后:Spring 完成对所有 Bean 的依赖注入,确保所有的属性都被正确设置。
  2. InitializingBeanafterPropertiesSet() 被调用:Spring 会依次调用实现了 InitializingBean 接口的 Bean 的 afterPropertiesSet() 方法。
  3. @PostConstruct 注解方法被调用:如果 @PostConstruct 方法存在,它将在 afterPropertiesSet() 后调用。

InitializingBean@PostConstruct 的区别

特性InitializingBean@PostConstruct
接口/注解接口 (InitializingBean)注解 (@PostConstruct)
调用时机在依赖注入完成之后调用 (afterPropertiesSet())在依赖注入完成之后调用(容器初始化后,通常早于 afterPropertiesSet()
使用范围需要实现 InitializingBean 接口可以标注在任何一个方法上
适用场景适用于老版本的 Spring 或者需要控制初始化逻辑的情况适用于更简洁的场景,推荐用于标注简单初始化方法
@Bean 配合可以与配置类中的 @Bean 配合,调用 afterPropertiesSet()一般情况下,@PostConstruct 用于实例化 Bean 时的初始化方法

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

公然上线传销项目,Web3 的底线已经被无限突破

作者&#xff1a;Techub 热点速递 撰文&#xff1a;Yangz&#xff0c;Techub News 今天早些时候&#xff0c;OKX 将上线 PI 的消息在圈内引起轩然大波&#xff0c;对于上线被板上钉钉为传销盘子的「项目」 &#xff0c;Techub News 联系了 OKX 公关&#xff0c;但对方拒绝置评…

C语言第18节:自定义类型——联合和枚举

1. 联合体 C语言中的联合体&#xff08;Union&#xff09;是一种数据结构&#xff0c;它允许在同一内存位置存储不同类型的数据。不同于结构体&#xff08;struct&#xff09;&#xff0c;结构体的成员各自占有独立的内存空间&#xff0c;而联合体的所有成员共享同一块内存区域…

解锁网络安全:穿越数字世界的防护密码

个人主页&#xff1a;java之路-CSDN博客(期待您的关注) 目录 网络安全&#xff1a;数字时代的基石 网络安全面面观 &#xff08;一&#xff09;定义与范畴 &#xff08;二&#xff09;发展历程 网络安全面临的威胁 &#xff08;一&#xff09;恶意软件肆虐 &#xff08;二…

python爬虫解决无限debugger问题

方法一 关闭定时任务 关闭断点执行代码打开断点 # 无限debugger产生原因 # 1. web开发者工具打开 # 2. js代码中有debugger # 3. js有定时处理[推荐] for(let i0;i<99999;i){window.clearInterval(i)}方法二 关闭breakpoint 方法三 修改JS代码 使用fiddler&#xff0c;抓…

C# 两种方案实现调用 DeepSeek API

目录 序 开发运行环境 访问API的一个通用方法 原生官网实现 申请 API key 调用实现 调用示例 腾讯云知识引擎原子调用 申请 API key 调用示例 小结 序 DeepSeek&#xff08;深度求索&#xff09; 最近可谓火爆的一塌糊涂&#xff0c;具体的介绍这里不再赘述&#x…

Linux下的进程切换与调度

目录 1.进程的优先级 优先级是什么 Linux下优先级的具体做法 优先级的调整为什么要受限 2.Linux下的进程切换 3.Linux下进程的调度 1.进程的优先级 我们在使用计算机的时候&#xff0c;通常会启动多个程序&#xff0c;这些程序最后都会变成进程&#xff0c;但是我们的硬…

anolis os 8.9安装jenkins

一、系统版本 # cat /etc/anolis-release Anolis OS release 8.9 二、安装 # dnf install -y epel-release # wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo # rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.…

Java基础知识总结(四十八)--TCP传输、TCP客户端、TCP服务端

**TCP传输&#xff1a;**两个端点的建立连接后会有一个传输数据的通道&#xff0c;这通道称为流&#xff0c;而且是建立在网络基础上的流&#xff0c;称之为socket流。该流中既有读取&#xff0c;也有写入。 **tcp的两个端点&#xff1a;**一个是客户端&#xff0c;一个是服务…

【python】http.server内置库构建临时文件服务

需要从linux开发机上下载一个文件到本地&#xff0c;约700M比较大&#xff0c;通过sz命令下载较慢且传输过程不稳定连续失败&#xff0c;后采用下面方式解决。 cd到一个目录下执行python -m http.server port&#xff0c;port为服务的端口号&#xff1a; 启动后浏览器中访问…

网络安全ids是什么意思

1、 简述IPS和IDS的异同点&#xff1b; 入侵检测系统&#xff08;IDS&#xff09; IDS&#xff08;Intrusion Detection Systems&#xff0c;入侵检测系统&#xff09;&#xff0c;专业上讲就是依照一定的安全策略&#xff0c;对网络、系统、运行状况进行监视&#xff0c;尽可能…

优选驾考小程序

第2章 系统分析 2.1系统使用相关技术分析 2.1.1Java语言介绍 Java语言是一种分布式的简单的 开发语言&#xff0c;有很好的特征&#xff0c;在安全方面、性能方面等。非常适合在Internet环境中使用&#xff0c;也是目前企业级运用中最常用的一个编程语言&#xff0c;具有很大…

42.水果销售系统(springbootvue的Java项目[含微信小程序])

目录 1.系统的受众说明 2.开发环境与技术 2.1 MYSQL数据库 2.2 Java语言 2.3 微信小程序技术 2.4 SpringBoot框架 2.5 B/S架构 2.6 Tomcat 介绍 2.7 HTML简介 2.8 MyEclipse开发工具 3.系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作…

ffmpeg所有版本下载地址

地址如下&#xff1a;Index of /releaseshttps://ffmpeg.org/releases/

记PasteSpider部署工具的Windows.IIS版本开发过程之草稿-效果展示(4)

如果有人给你一串JSON数据,你需要编辑他,对于有开发基础的人来说,可能会好处理下,而对于没有开发基础的人来说,那就是灾难了! 那么有没有一个东西,可以让这个编辑更顺畅呢? 贴代码案例中的DynamicForm你值得拥有!本次展示作者在本机上操作IIS的示例,如下 IIS展示 先…

3D文档控件Aspose.3D实用教程: 在 Java 中创建 FBX 文件并无缝将圆柱体转换为网格

概述 创建FBX文件并将圆柱体转换为网格是 3D 建模和动画中的基本任务。这些过程在游戏、电影和建筑等行业中至关重要。通过使用Aspose.3D for Java &#xff0c;开发人员可以高效地管理 3D 场景和对象。这个强大的 Java 3D API 简化了 3D 模型的创建和操作。它的易用性和灵活性…

软考高级《系统架构设计师》知识点(一)

计算机硬件 校验码 码距&#xff1a;就单个编码A:00而言&#xff0c;其码距为1&#xff0c;因为其只需要改变一位就变成另一个编码。在两个编码中&#xff0c;从A码到B码转换所需要改变的位数称为码距&#xff0c;如A:00要转换为B:11&#xff0c;码距为2。一般来说&#xff0c;…

HTML 学习记录

HTML 学习记录 html是超文本标记语言&#xff0c;是一种标记语言 超文本&#xff1a;链接 标记&#xff1a;也叫标签&#xff0c;带尖括号的文本 标签语法 1.标签成对出现&#xff0c;中间包裹内容 2.<>里面放英文字母 3.结束标签比开始标签多一个 / 例如 <s…

Mac之JDK安装

Mac之JDK安装 一.安装 jdk 打开终端输入命令:java -version 查看是否已安装 JDK Oracle 官方下载地址 根据自己Mac 系统安装 查看 Mac 系统&#xff0c;打开中断命令&#xff0c;输入: uname -a Compressed Archive 是压缩文档&#xff0c;下载的是一个 .tar.gz 压缩包 D…

centos 10 离线安装dnf 和 设置dnf镜像源

离线安装dnf可用kimi搜索, centos 使用curl 下载dnf 的rpm包 mkdir ~/dnf_packages cd ~/dnf_packages# CentOS 7 示例 curl -O http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-0.6.4-2.sdl7.noarch.rpm curl -O http://springdale.math.ias.edu/data/pu…

【cocos creator】拖拽排序列表

DEMO下载 GameCtrl.ts import ItemCtrl from "./ItemCtrl";const { ccclass, property } cc._decorator;ccclass export default class GameCtrl extends cc.Component {property(cc.Node)content: cc.Node null;property(cc.Node)prefab: cc.Node null;arr []…