SpringBoot启动后初始化的几种方式汇总

 更新时间:2025年04月27日 16:25:01   作者:蓝眸少年CY  
这篇文章主要介绍了SpringBoot启动后初始化的几种方式汇总,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

在 Spring Boot 项目中,程序启动后需要做一些初始化的操作,如需要将一些原始数据写入缓存、或者一些资源的加载等。

一、静态代码块

当我们将某个类交给Spring管理的时候,静态代码块是优先执行的,此时可以在代码块中做一些初始化操作,这个无需过多解释。

@Component
@Slf4j
public class TestDemo {

    @Value("${netty.port}")
    private Integer nettyPort;

    static {
        log.info("静态代码块执行======");
    }

}

二、构造方法

构造方法是静态代码块之后执行的,这种方式也无需过多解释。

@Component
@Slf4j
public class TestDemo {

    @Value("${netty.port}")
    private Integer nettyPort;

    public TestDemo(){
        log.info("构造方法执行======配置文件读取:{}", nettyPort);
    }

    static {
        log.info("静态代码块执行======");
    }

}

三、@PostConstruct

@PostConstruct 注解,它标记的方法会在依赖注入完成后立即被调用。它适用于简单的初始化逻辑,执行顺序较早。

@Component
@Slf4j
public class MyPostConstructBean {

    @Value("${netty.port}")
    private Integer nettyPort;

    @PostConstruct
    public void init() {
        log.info("PostConstruct执行======配置文件读取:{}", nettyPort);
    }
}

四、InitializingBean 接口

实现 InitializingBean 接口并重写 afterPropertiesSet 方法,它比 @PostConstruct 更具可读性,适合复杂的初始化逻辑。它也是在依赖注入完成后调用,执行顺序与比@PostConstruct 要早一些。

@Component
@Slf4j
public class MyInitializingBean implements InitializingBean {

    @Value("${netty.port}")
    private Integer nettyPort;
    @Override
    public void afterPropertiesSet() {
        log.info("InitializingBean接口的afterProperiesSet执行======配置文件读取:{}", nettyPort);
    }
}

五、 @Bean 注解中的 initMethod

@Configuration 配置类中的 @Bean 注解,可以指定 initMethod 属性来定义初始化方法。需要指定初始化方法,它在 @PostConstruct 和 InitializingBean 之后执行。

@Configuration
@Slf4j
public class MyInitMethod {

    @Value("${netty.port}")
    private Integer nettyPort;

    @Bean(initMethod = "init")
    public MyTestBean myBean() {
        return new MyTestBean();
    }

    class MyTestBean {
        public void init() {
            log.info("@Bean的initMethod方法执行 ==== 配置文件读取:{}", nettyPort);
        }
    }
}

六、 CommandLineRunner 接口

实现 CommandLineRunner 接口的类会在 SpringBoot 应用启动完成后执行。它可以接收启动参数。

@Component
@Slf4j
public class MyCommandLineRunner implements CommandLineRunner {

    @Value("${netty.port}")
    private Integer nettyPort;

    @Override
    public void run(String... args) {
        log.info("CommandLineRunner接口的run方法执行======配置文件读取:{}", nettyPort);
    }
}

七、ApplicationRunner 接口

与 CommandLineRunner 类似。

@Component
@Slf4j
public class MyApplicationRunner implements ApplicationRunner {

    @Value("${netty.port}")
    private Integer nettyPort;

    @Override
    public void run(ApplicationArguments args) {
        log.info("ApplicationRunner接口的run方法执行======配置文件读取:{}", nettyPort);
    }
}

八、@EventListener事件

@EventListener 注解,可以在应用启动的某个生命周期阶段执行初始化逻辑。比如监听 ContextRefreshedEvent 事件。它适用于需要在特定生命周期事件发生时执行的初始化逻辑,可以监听各种生命周期事件。

@Component
@Slf4j
public class MyContextRefreshedListener {

    @Value("${netty.port}")
    private Integer nettyPort;

    @EventListener
    public void handleContextRefreshed(ContextRefreshedEvent event) {
        log.info("@EventListener监听ContextRefreshedEvent事件执行======配置文件读取:{}", nettyPort);
    }
}

九、SmartInitializingSingleton接口

实现 SmartInitializingSingleton 接口的 afterSingletonsInstantiated 方法,在所有单例 bean 都初始化完成后执行。

@Component
@Slf4j
public class MySmartInitializingSingleton implements SmartInitializingSingleton {

    @Value("${netty.port}")
    private Integer nettyPort;

    @Override
    public void afterSingletonsInstantiated() {
        log.info("SmartInitializingSingleton接口的afterSingletonsInstantiated方法执行======配置文件读取:{}", nettyPort);
    }
}

十、ApplicationListener接口

实现 ApplicationListener 接口,可以监听特定的 Spring 事件,如 ApplicationReadyEvent,用于在应用完全启动后执行逻辑。监听各种 Spring 事件,提供灵活的初始化时机。

@Component
@Slf4j
public class MyApplicationReadyListener implements ApplicationListener<ApplicationReadyEvent> {

    @Value("${netty.port}")
    private Integer nettyPort;

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        log.info("监听ApplicationReadyEvent事件,ApplicationListener接口的onApplicationEvent方法执行======配置文件读取:{}", nettyPort);
    }
}

十一、执行顺序

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • spring boot mybatis枚举映射示例代码

    spring boot mybatis枚举映射示例代码

    这篇文章主要给大家介绍了关于spring boot mybatis枚举映射的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • springboot集成es插入和查询的简单使用示例详解

    springboot集成es插入和查询的简单使用示例详解

    这篇文章主要介绍了springboot集成es 插入和查询的简单使用,本文分步骤结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • SpringCloud Alibaba Nacos 整合SpringBoot Admin实战

    SpringCloud Alibaba Nacos 整合SpringBoot A

    这篇文章主要介绍了SpringCloud Alibaba Nacos 整合SpringBoot Admin实战,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java里遍历Map集合的多种方法总结

    Java里遍历Map集合的多种方法总结

    Java中的Map是一种键值对映射的数据结构,它提供了一些常用的方法用于获取、添加、删除和修改元素,在Java中,有多种方式可以遍历Map,本文将介绍其中的四种常用方式,并比较它们之间的优缺点,需要的朋友可以参考下
    2024-07-07
  • Java如何基于反射机制获取不同的类

    Java如何基于反射机制获取不同的类

    这篇文章主要介绍了Java如何基于反射机制获取不同的类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • SpringBoot RESTful风格入门讲解

    SpringBoot RESTful风格入门讲解

    RESTful是一种web软件风格,它不是标准也不是协议,它不一定要采用,只是一种风格,它倡导的是一个资源定位(url)及资源操作的风格,这篇文章主要介绍了SpringBoot使用RESTful接口
    2022-11-11
  • Java8深入学习系列(三)你可能忽略了的新特性

    Java8深入学习系列(三)你可能忽略了的新特性

    一提到Java 8就只能听到lambda,但这不过是其中的一个而已,Java 8还有许多新的特性,有一些功能强大的新类或者新的用法,还有一些功能则是早就应该加到Java里了,所以下面这篇文章主要给大家介绍了关于Java8中大家可能忽略了的一些新特性,需要的朋友可以参考下。
    2017-08-08
  • Spring boot项目整合WebSocket方法

    Spring boot项目整合WebSocket方法

    这篇文章主要介绍了WebSocket使用Spring boot整合方法,需要继承webSocketHandler类,重写几个方法就可以了,具体实例代码跟随小编一起看看吧
    2021-09-09
  • java 中的static关键字和final关键字的不同之处

    java 中的static关键字和final关键字的不同之处

    java 中的static关键字和final关键字的不同之处,需要的朋友可以参考一下
    2013-03-03
  • 解决Mybatis-plus找不到对应表及默认表名命名规则的问题

    解决Mybatis-plus找不到对应表及默认表名命名规则的问题

    这篇文章主要介绍了解决Mybatis-plus找不到对应表及默认表名命名规则的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11

最新评论