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

SpringBoot 启动时执行某些操作的 8 种方式

<<< 点赞👍🏻+关注❤️ 每天分享干货好文 >>>

前言

在真实项目开发过程中,我们经常会需要在程序启动时执行一些特定的业务操作,比如系统预热、系统初始化等。小编为大家介绍 8 种实现方式。

实现方案

一、ApplicationRunner

1. 执行时机

SpringBoot 应用完全启动后。

2. 核心特点

实现 ApplicationRunner 接口,通过 ApplicationArguments 对象访问参数,可以更方便地解析命令行参数(例如获取--key=value形式的参数值)。

如果定义了多个Runner,可以使用 @Order 注解来控制他们的执行顺序,数值越小优先级越高。

3. 代码示例
@Component
@Order(1) // 执行顺序,可选
public class MyApplicationRunner implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {// 这里写你的启动执行逻辑,例如初始化缓存// args 可以访问应用参数}
}

二、CommandLineRunner

1. 执行时机

SpringBoot 应用完全启动后。

2. 核心特点

实现 CommandLineRunner 接口,通过 String... args 直接访问命令行原始参数数组。

如果定义了多个Runner,可以使用 @Order 注解来控制他们的执行顺序,数值越小优先级越高。

3. 代码示例
@Component
@Order(2) // 执行顺序,可选
public class MyCommandLineRunner implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {// 这里写你的启动执行逻辑// args 可以访问命令行原始参数}
}

三、@PostConstruct 注解

1. 执行时机

Bean 初始化时,在对象依赖注入完成后执行。

2. 核心特点

注解在方法上,使用简单。

此时 Spring 容器可能还未完全初始化完毕,部分 Bean 可能尚未就绪,需注意可能的依赖问题。

3. 代码示例
@Component
public class MyInitBean {@Autowiredprivate SomeRepository repository; // 假设的仓库类,用于数据访问@PostConstructpublic void init() {// 例如,在项目启动时从数据库加载数据到静态变量List<SomeData> data = repository.findAll();// ... 其他处理逻辑}
}

四、实现 InitializingBean 接口

1. 执行时机

Bean 的全部属性被设置之后执行。

2. 核心特点

实现接口的 afterPropertiesSet 方法。

与 @PostConstruct 类似,都是 Bean 生命周期中的初始化方法。

3. 代码示例
@Component
public class MyInitializingBean implements InitializingBean {@Autowiredprivate SomeDependency dependency;@Overridepublic void afterPropertiesSet() throws Exception {// 确保属性dependency注入后,再执行初始化// 你的初始化逻辑}
}

五、实现 BeanPostProcessor 接口

1. 执行时机

在 Bean 的初始化前后执行。

2. 核心特点

实现接口的 postProcessBeforeInitialization 与 postProcessAfterInitialization 方法。

这个接口会影响所有的 bean 初始化。

3. 代码示例
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {// 在初始化之前执行的逻辑System.out.println("Before Initialization: " + beanName);return bean; // 返回bean本身或一个新的bean实例(可选)}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {// 在初始化之后执行的逻辑System.out.println("After Initialization: " + beanName);return bean; // 返回bean本身或一个新的bean实例(可选)}
}

六、实现 BeanFactoryPostProcessor 接口

1. 执行时机

在 Spring 容器初始化时执行,此时容器中所有的 Bean 定义已经加载完,但是 Bean 的实例还未创建。

2. 核心特点

实现接口的 postProcessBeanFactory 方法。

这个接口只会执行一次,执行时机早于 BeanPostProcessor 。

3. 代码示例
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {System.out.println("******************** MyBeanFactoryPostProcessor#postProcessBeanFactory ****************");System.out.println("******************** bean的数量:[{}] ****************", beanFactory.getBeanDefinitionCount());BeanDefinition userBeanDef = beanFactory.getBeanDefinition("student");// 修改bean definition属性信息}}

七、实现 ServletContextListener 接口

1. 执行时机

Web 应用启动初期,在初始化任何过滤器或 Servlet 时或者销毁 Web 容器时执行。

2. 核心特点

实现接口的 contextInitialized 和 contextDestroyed 方法。

适用于 Web 环境,监听 Servlet 上下文。

3. 代码示例
@Component
public class MyServletContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {// 在这里写Web应用启动时的逻辑// 例如,初始化一些Web应用级别的资源}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// 在这里写Web应用关闭时的清理逻辑}
}

八、static 静态代码块

1. 执行时机

类被加载时执行。

2. 核心特点

仅仅是类被加载时,Bean 还未被创建。

3. 代码示例
@Component
public class MyClass {static {System.out.println("执行静态代码块")}
}

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

相关文章:

  • Cloud IDE vs 本地IDE:AI编程时代的“降维打击“
  • RocketMQ 事务消息
  • 做网站的不肯给ftp企业163邮箱登录
  • reactNative 遇到的问题记录
  • 使用 Cloudflare Turnstile 实现 Java 后端的人机验证
  • 【论文阅读】Knowledge Circuits in Pretrained Transformers
  • SpringBoot3集成Mybatis(开启第一个集成Mybatis的后端接口)
  • 论文阅读 (2) :Reducing Divergence in GPGPU Programs with Loop Merging
  • React 01
  • 建设开发网站潍坊百度网站优化
  • AI 在数据库操作中的各类应用场景、方案与实践指南
  • ASTM C615/C615M-23 花岗石检测
  • 用php做的网站论文抖音的商业营销手段
  • 子数组/子串问题
  • 办公空间设计网站浙江恒元建设网站
  • 银河麒麟 aarch64 linux 里面的 qt 怎么安装kit
  • 2025电脑价格数据集/构建电脑价格预测模型/数据量为 10 万行
  • Linux 系统下 MySQL 的安装配置
  • 16、Docker Compose 安装Kafka(含Zookeeper)
  • QT(c++)开发自学笔记:2.TCP/IP
  • C语言基础语法进阶
  • 池州网站建设公司好的网站你知道
  • 从零起步学习MySQL || 第五章:select语句的执行过程是怎么样的?(结合源码深度解析)
  • 专业的家居网站建设网站单页支付宝支付怎么做的
  • CC10-判断链表中是否有环
  • 【ZEGO即构开发者日报】谷歌推出新款视频生成模型 Veo 3.1;腾讯开源通用文本表示模型Youtu-Embedding;AI 陪伴赛道观察……
  • [Sora] 视频自动编码器(VAE) | `encode_``decode`
  • 算法沉淀第四天(Winner)
  • 西藏地图飞线html
  • 网站建设与管理课程代码做徽章标牌的企业网站