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

 更新时间:2025年10月17日 10:40:52   作者:(farerboy)  
在真实项目开发过程中,我们经常会需要在程序启动时执行一些特定的业务操作,比如系统预热、系统初始化等,小编为大家介绍 8 种实现方式,需要的朋友可以参考下

实现方案

一、ApplicationRunner

1. 执行时机

SpringBoot 应用完全启动后。

2. 核心特点

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

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

3. 代码示例

@Component
@Order(1) // 执行顺序,可选
public class MyApplicationRunner implements ApplicationRunner {
    @Override
    public 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 {
    @Override
    public void run(String... args) throws Exception {
        // 这里写你的启动执行逻辑
        // args 可以访问命令行原始参数
    }
}

三、@PostConstruct 注解

1. 执行时机

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

2. 核心特点

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

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

3. 代码示例

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

四、实现 InitializingBean 接口

1. 执行时机

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

2. 核心特点

实现接口的 afterPropertiesSet 方法。

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

3. 代码示例

@Component
public class MyInitializingBean implements InitializingBean {
    @Autowired
    private SomeDependency dependency;
 
    @Override
    public void afterPropertiesSet() throws Exception {
        // 确保属性dependency注入后,再执行初始化
        // 你的初始化逻辑
    }
}

五、实现 BeanPostProcessor 接口

1. 执行时机

在 Bean 的初始化前后执行。

2. 核心特点

实现接口的 postProcessBeforeInitialization 与 postProcessAfterInitialization 方法。

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

3. 代码示例

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // 在初始化之前执行的逻辑
        System.out.println("Before Initialization: " + beanName);
        return bean; // 返回bean本身或一个新的bean实例(可选)
    }
    @Override
    public 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 {
 
    @Override
    public 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 {
 
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // 在这里写Web应用启动时的逻辑
        // 例如,初始化一些Web应用级别的资源
    }
 
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // 在这里写Web应用关闭时的清理逻辑
    }
}

八、static 静态代码块

1. 执行时机

类被加载时执行。

2. 核心特点

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

3. 代码示例

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

以上就是SpringBoot启动时执行某些操作的8种方式的详细内容,更多关于SpringBoot启动时执行某些操作的资料请关注脚本之家其它相关文章!

相关文章

  • Java时间轮调度算法的代码实现

    Java时间轮调度算法的代码实现

    时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂度和资源开销,本文给大家介绍了Java时间轮调度算法的代码实现,需要的朋友可以参考下
    2025-03-03
  • springBoot使用JdbcTemplate代码实例

    springBoot使用JdbcTemplate代码实例

    这篇文章主要介绍了springBoot使用JdbcTemplate代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 使用Jenkins来构建SVN+Maven项目的实现

    使用Jenkins来构建SVN+Maven项目的实现

    这篇文章主要介绍了使用Jenkins来构建SVN+Maven项目的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • spring注解@SneakyThrows用法及说明

    spring注解@SneakyThrows用法及说明

    @SneakyThrows是Lombok提供的一个注解,用于消除显式抛出或捕获受检异常的模板代码,使用该注解后,编译器会自动生成try-catch块来捕获这些异常,从而使代码更加简洁和易读
    2025-12-12
  • Java package编译乱码问题解决

    Java package编译乱码问题解决

    这篇文章主要介绍了Java package编译乱码问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Mybatis在sqlite中无法读写byte[]类问题的解决办法

    Mybatis在sqlite中无法读写byte[]类问题的解决办法

    这篇文章主要给大家介绍了关于Mybatis在sqlite中无法读写byte[]类问题的解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Spring中@Value注解的使用方法详解

    Spring中@Value注解的使用方法详解

    这篇文章主要介绍了Spring中@Value注解的使用方法详解,在spring项目中必不可少的就是读取配置文件,那么读取配置文件就有两种方式,一种就是使用Spring中@Value注解,还有一种是使用SpringBoot中的@ConfigurationProperties注解,需要的朋友可以参考下
    2024-01-01
  • Java实现集合和Excel文件相互转换

    Java实现集合和Excel文件相互转换

    本文主要介绍了使用Java和ApachePOI库将集合转化为包含合并单元格的Excel文件,及从Excel文件流中读取并转化为集合,具有一定的参考价值,感兴趣的可以了解一下
    2025-08-08
  • Java JDK17没有源码的问题及解决

    Java JDK17没有源码的问题及解决

    这篇文章主要介绍了Java JDK17没有源码的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 关于jdk9、jdk10、jdk11、jdk12、jdk13新特性说明

    关于jdk9、jdk10、jdk11、jdk12、jdk13新特性说明

    这篇文章主要介绍了关于jdk9、jdk10、jdk11、jdk12、jdk13新特性说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05

最新评论