SpringBoot项目启动时初始化操作常见的几种方式

 更新时间:2025年02月12日 10:31:05   作者:一个努力成长的咸鱼  
这篇文章主要介绍了SpringBoot项目启动时初始化操作常见的几种方式,这些方法可以帮助开发者在服务启动时自动执行必要的初始化操作,需要的朋友可以参考下

一.前言    

通常的我们的项目开发中,经常会遇到那种在服务一启动就需要自动执行一些业务代码的情况。

    以下是常见的初始化场景:

    1.数据库初始化:创建表、加载数据。

    2.缓存初始化:初始化 Redis 或其他缓存。如数据库中的配置信息或者数据字典之类的缓存到redis

    3.消息队列初始化:初始化消息队列的连接和配置。

    4.定时任务初始化:设置定时任务的执行。

    5.Spring Security 配置初始化:设置默认用户和权限。

    6.外部服务连接初始化:初始化与外部服务的连接。等等等......

二.常见的几种方式    

1.使用 CommandLineRunner 或 ApplicationRunner 接口

CommandLineRunner 和 ApplicationRunner 接口可以用于 Spring Boot 启动时执行自定义的代码。这两者都提供了一个 run 方法,你可以在其中执行启动时需要的初始化操作。

CommandLineRunner 接口的 run(String... args) 方法接收启动时传入的命令行参数。
ApplicationRunner 接口的 run(ApplicationArguments args) 方法接收 Spring Boot 应用程序启动时的参数,这些参数可以是键值对格式。

CommandLineRunner 示例

@Component
public class StartupRunner implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        // 在应用启动时执行的初始化逻辑
        System.out.println("应用启动时执行初始化操作...");
        // 可以在这里进行一些数据加载、配置初始化等操作
    }
}

ApplicationRunner 示例

@Component
public class ApplicationStartupRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("应用启动时执行初始化操作...");
    }
}

2.使用 @PostConstruct 注解

@PostConstruct 注解的方法会在 Spring 完成所有 bean 的初始化之后自动执行。通常用来执行一些初始化的逻辑,比如加载配置、初始化数据等。

@Component
public class MyStartupService {

    @PostConstruct
    public void init() {
        // 这是 Spring 完成所有 bean 初始化后执行的代码
        System.out.println("Spring 容器初始化完成,执行初始化操作...");
    }
}

3. 使用 @EventListener 监听 ApplicationReadyEvent 或 ContextRefreshedEvent

Spring 提供了多种事件,可以在这些事件触发时执行初始化操作。例如,ApplicationReadyEvent 事件在 Spring Boot 应用完全启动之后触发,ContextRefreshedEvent 事件在 Spring 上下文刷新之后触发。

示例:使用 @EventListener 监听 ApplicationReadyEvent

@Component
public class StartupEventListener {

    @EventListener(ApplicationReadyEvent.class)
    public void onApplicationReady() {
        // 应用完全启动后执行的操作
        System.out.println("Spring Boot 应用启动完成,可以执行初始化操作...");
    }
}

 示例:使用 @EventListener 监听 ContextRefreshedEvent

@Component
public class ContextRefreshListener {

    @EventListener(ContextRefreshedEvent.class)
    public void onContextRefreshed() {
        // Spring 容器刷新时执行的操作
        System.out.println("Spring 容器刷新完毕,执行初始化操作...");
    }
}

4.实现org.springframework.beans.factory.InitializingBean接口并重写 afterPropertiesSet()方法 

InitializingBean接口只包含一个方法afterPropertiesSet(),凡是继承了InitializingBean接口的类,在初始化时都会调用这方法;
使用方法分为三个步骤:

1、被spring管理        2、 实现InitializingBean接口         3、重写afterPropertiesSet方法

@Component
public class InitializationBeanTest implements InitializingBean{
    private static final Logger LOG = LoggerFactory.getLogger(InitializationBeanTest.class);
 
    @Override
    public void afterPropertiesSet() throws Exception {
        LOG.info("InitializingBean 开始了。。。");
        //初始化操作
    }
}

5.通过 ApplicationRunner 或 CommandLineRunner 配置条件启动

你可以通过 @Profile 或其他条件注解,来控制某些初始化逻辑仅在特定环境下执行。

示例:根据 @Profile 条件执行初始化

@Component
@Profile("dev")  // 仅在 dev 配置下执行
public class DevStartupRunner implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        System.out.println("开发环境下执行初始化操作...");
    }
}

6. 使用 Spring Boot 自定义 Banner

Spring Boot 支持通过配置自定义启动时的 banner 内容。这种方式适合显示一些自定义的欢迎信息或者标识。

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(MyApplication.class);
        app.setBanner((environment, sourceClass, out) -> out.println("My Custom Banner!"));
        app.run(args);
    }
}

7. 初始化数据(例如:使用 @Bean 方法初始化数据库或其他资源)

你还可以通过 @Bean 方法配置 Spring Boot 应用启动时进行数据初始化,或者进行外部服务的连接初始化。

示例:初始化数据库

@Configuration
public class DataInitConfig {

    @Bean
    public CommandLineRunner initializeData() {
        return args -> {
            // 在应用启动时加载或初始化数据
            System.out.println("初始化数据...");
            // 可以在这里调用数据库服务或其他业务逻辑
        };
    }
}

总结 

到此这篇关于SpringBoot项目启动时初始化操作常见的几种方式的文章就介绍到这了,更多相关SpringBoot项目启动时初始化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java Http多次请求复用同一连接示例详解

    Java Http多次请求复用同一连接示例详解

    这篇文章主要为大家介绍了Java Http多次请求复用同一连接示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 详解Java 反射和反射的应用场景

    详解Java 反射和反射的应用场景

    这篇文章主要介绍了Java 反射和反射的应用场景的相关资料,帮助大家更好的理解和学习Java反射的相关知识,感兴趣的朋友可以了解下
    2020-08-08
  • JAVA返回PDF文件流并进行下载的实现方法

    JAVA返回PDF文件流并进行下载的实现方法

    这篇文章主要给大家介绍了关于JAVA返回PDF文件流并进行下载的实现方法,PDF文件流下载是通过HTTP协议将服务器上的PDF文件以流的方式发送给客户端,供客户端保存到本地磁盘或直接在浏览器中打开,需要的朋友可以参考下
    2024-02-02
  • Java21虚拟线程实践

    Java21虚拟线程实践

    java21正式版发布了,为我们带来了很多新的特性,其中我最感兴趣的就是虚拟线程,本文主要介绍了Java21虚拟线程实践,感兴趣的可以;了解一下
    2023-10-10
  • Java中Collection集合常用API之 Collection存储自定义类型对象的示例代码

    Java中Collection集合常用API之 Collection存储自定义类型对象的示例代码

    Collection是单列集合的祖宗接口,因此它的功能是全部单列集合都可以继承使用的,这篇文章主要介绍了Java中Collection集合常用API - Collection存储自定义类型对象,需要的朋友可以参考下
    2022-12-12
  • Java使用二分法进行查找和排序的示例

    Java使用二分法进行查找和排序的示例

    这篇文章主要介绍了Java使用二分法进行查找和排序的示例,二分插入排序和二分查找是基础的算法,需要的朋友可以参考下
    2016-04-04
  • java中switch选择语句代码详解

    java中switch选择语句代码详解

    这篇文章主要介绍了java中switch选择语句代码详解,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • SpringBoot Shiro权限管理方式

    SpringBoot Shiro权限管理方式

    这篇文章主要介绍了SpringBoot Shiro权限管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • Java图片批量压缩像素的实现方法

    Java图片批量压缩像素的实现方法

    我们开发中经常会遇到原图清晰度高,考虑到效率问题,我们不可能拿原图进行显示,服务端一般都要对图片进行压缩处理,然后发送给客户端显示,这篇文章主要给大家介绍了关于Java图片批量压缩像素的实现方法,需要的朋友可以参考下
    2021-12-12
  • 详细介绍Java函数式接口

    详细介绍Java函数式接口

    函数式接口在Java中是指有且仅有一个抽象方法的接口。当然接口中可以包含其他的方法默认、静态、私有,具体内容请参考下面文章内容
    2021-09-09

最新评论