SpringBoot项目启动过程中做数据资源初始化的方式

简介: SpringBoot项目启动过程中做数据资源初始化的方式

SpringBoot项目经常遇到启动项目的过程中需要初始化一些数据,比如字典,前置条件数据之类的需求,这个时候需要在项目启动的过程中去做这一块的工作。下面根据经验总结了以下几种项目启动的时候初始化数据的方法,可以选择一个自己喜欢的,从项目启动运行可以看出来他们的加载顺序,在这里不对加载顺序做解释。

以下代码运行在jdk17,SpringBoot3.0.2环境下

先准备下面的接口和服务类,做三层业务逻辑开发的同学都懂

publicinterfaceInitService {
voidinitData();
}
@ServicepublicclassInitServiceImplimplementsInitService {
@Value("${data.param}")
privateStringdataParam;
@OverridepublicvoidinitData() {
System.out.println("initData Service:param is "+dataParam);
    }
}

准备个配置项在properties中

data.param=data param

一、直接在main方法里干,直接果断

@SpringBootApplicationpublicclassSpringbootApplication {
publicstaticvoidmain(String[] args) {
ApplicationContextac=SpringApplication.run(Springboot26DemoApplication.class, args);
InitServiceinitServiceImpl= (InitService) ac.getBean("initServiceImpl");
if(initServiceImpl!=null){
System.out.println("==== SpringApplication.run Start=====");
initServiceImpl.initData();
System.out.println("==== SpringApplication.run End=====");
        }else{
System.out.println("==== SpringApplication.run Start=====");
System.out.println("====initServiceImpl is null=====");
System.out.println("==== SpringApplication.run End=====");
        }
    }
}

二、@PostConstruct注解

@SpringBootApplicationpublicclassSpringbootApplication {
publicstaticvoidmain(String[] args) {
ApplicationContextac=SpringApplication.run(Springboot26DemoApplication.class, args);
    }
@AutowiredprivateInitServiceinitServiceImpl;
@PostConstructpublicvoidinit(){
if(initServiceImpl!=null){
System.out.println("====PostConstruct Start=====");
initServiceImpl.initData();
System.out.println("====PostConstruct End=====");
        }else{
System.out.println("====PostConstruct Start=====");
System.out.println("====initServiceImpl is null=====");
System.out.println("====PostConstruct End=====");
        }
    }
}

三、InitializingBean接口

@ComponentpublicclassInitBeanInitimplementsInitializingBean {
@AutowiredprivateInitServiceinitServiceImpl;
@OverridepublicvoidafterPropertiesSet() throwsException {
if(initServiceImpl!=null){
System.out.println("====InitializingBean afterPropertiesSet Start=====");
initServiceImpl.initData();
System.out.println("====InitializingBean afterPropertiesSet End=====");
        }else{
System.out.println("====InitializingBean afterPropertiesSet Start=====");
System.out.println("====initServiceImpl is null=====");
System.out.println("====InitializingBean afterPropertiesSet End=====");
        }
    }
}

四、@Bean(initMethod = "init")注解

@ComponentpublicclassInitDataBean {
@AutowiredprivateInitServiceinitServiceImpl;
@Bean(initMethod="init")
publicvoidinit() {
if(initServiceImpl!=null){
System.out.println("====@Bean(initMethod = \"init\") Start=====");
initServiceImpl.initData();
System.out.println("====@Bean(initMethod = \"init\") End=====");
        }else{
System.out.println("====@Bean(initMethod = \"init\") Start=====");
System.out.println("====initServiceImpl is null=====");
System.out.println("====@Bean(initMethod = \"init\") End=====");
        }
    }
}

五、ApplicationListener<ApplicationReadyEvent>接口

@ComponentpublicclassInitAppListenerimplementsApplicationListener<ApplicationReadyEvent> {
@AutowiredprivateInitServiceinitServiceImpl;
@OverridepublicvoidonApplicationEvent(ApplicationReadyEventevent) {
if(initServiceImpl!=null){
System.out.println("====ApplicationReadyEvent Start=====");
initServiceImpl.initData();
System.out.println("====ApplicationReadyEvent End=====");
        }else{
System.out.println("====ApplicationReadyEvent Start=====");
System.out.println("====initServiceImpl is null=====");
System.out.println("====ApplicationReadyEvent End=====");
        }
    }
}

六、ApplicationRunner接口

@ComponentpublicclassInitAppRunnerimplementsApplicationRunner {
@AutowiredprivateInitServiceinitServiceImpl;
@Overridepublicvoidrun(ApplicationArgumentsargs) throwsException {
if(initServiceImpl!=null){
System.out.println("====ApplicationRunner Start=====");
initServiceImpl.initData();
System.out.println("====ApplicationRunner End=====");
        }else{
System.out.println("====ApplicationRunner Start=====");
System.out.println("====initServiceImpl is null=====");
System.out.println("====ApplicationRunner End=====");
        }
    }
}

七、CommandLineRunner接口

@ComponentpublicclassInitCommandRunnerimplementsCommandLineRunner {
@AutowiredprivateInitServiceinitServiceImpl;
@Overridepublicvoidrun(String... args) throwsException {
if(initServiceImpl!=null){
System.out.println("====CommandLineRunner Start=====");
initServiceImpl.initData();
System.out.println("====CommandLineRunner End=====");
        }else{
System.out.println("====CommandLineRunner Start=====");
System.out.println("====initServiceImpl is null=====");
System.out.println("====CommandLineRunner End=====");
        }
    }
}

输出结果如下:

====PostConstruct Start=====
initData Service:param is data param
====PostConstruct End=====
====InitializingBean afterPropertiesSet Start=====
initData Service:param is data param
====InitializingBean afterPropertiesSet End=====
====@Bean(initMethod = "init") Start=====
initData Service:param is data param
====@Bean(initMethod = "init") End=====
====ApplicationRunner Start=====
initData Service:param is data param
====ApplicationRunner End=====
====CommandLineRunner Start=====
initData Service:param is data param
====CommandLineRunner End=====
====ApplicationReadyEvent Start=====
initData Service:param is data param
====ApplicationReadyEvent End=====
==== SpringApplication.run Start=====
initData Service:param is data param
==== SpringApplication.run End=====


目录
相关文章
|
12天前
|
Java 容器
如何在SpringBoot项目中使用过滤器和拦截器
过滤器和拦截器是日常开发中常用技术,用于对特定请求进行增强处理,如插入自定义代码以实现特定功能。过滤器在请求到达 `servlet` 前执行,而拦截器在请求到达 `servlet` 后执行。`SpringBoot` 中的拦截器依赖于 `SpringBoot` 容器,过滤器则由 `servlet` 提供。通过实现 `Filter` 接口并重写 `doFilter()` 方法可实现过滤器;通过实现 `HandlerInterceptor` 接口并重写相应方法可实现拦截器。两者的主要区别在于执行时机的不同,需根据具体场景选择使用。
如何在SpringBoot项目中使用过滤器和拦截器
|
6天前
|
Java 关系型数据库 MySQL
创建一个SpringBoot项目,实现简单的CRUD功能和分页查询
【9月更文挑战第6天】该内容介绍如何使用 Spring Boot 实现具备 CRUD 功能及分页查询的项目。首先通过 Spring Initializr 创建项目并选择所需依赖;其次配置数据库连接,并创建实体类与数据访问层;接着构建服务层处理业务逻辑;最后创建控制器处理 HTTP 请求。分页查询可通过添加 URL 参数实现。
|
16天前
|
缓存 Java 数据库连接
Spring Boot奇迹时刻:@PostConstruct注解如何成为应用初始化的关键先生?
【8月更文挑战第29天】作为一名Java开发工程师,我一直对Spring Boot的便捷性和灵活性着迷。本文将深入探讨@PostConstruct注解在Spring Boot中的应用场景,展示其在资源加载、数据初始化及第三方库初始化等方面的作用。
42 0
|
15天前
|
XML 前端开发 Java
还不会SpringBoot项目模块分层?来这手把手教你
本文详细介绍了如何为SpringBoot项目创建模块并进行合理的分层设计。通过逐步演示,从创建项目到构建各功能模块,再到具体代码实现,手把手教你实现整洁的代码分层。主要内容包括:创建依赖层、主启动层、模块层及其子模块(如共通层、控制器层、数据持久层等),并通过实例演示了从前端请求到后台服务调用的实际流程。适合SpringBoot初学者及有一定经验但需优化项目结构的开发者参考。
60 2
还不会SpringBoot项目模块分层?来这手把手教你
|
15天前
|
小程序 前端开发 Java
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
JavaDog Chat v1.0.0 是一款基于 SpringBoot、MybatisPlus 和 uniapp 的简易聊天软件,兼容 H5、小程序和 APP,提供丰富的注释和简洁代码,适合初学者。主要功能包括登录注册、消息发送、好友管理及群组交流。
37 0
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
|
24天前
|
JavaScript 前端开发 Java
SpringBoot + Vue 前端后分离项目精进版本
这篇文章详细介绍了一个基于SpringBoot + Vue的前后端分离项目的搭建过程,包括前端Vue项目的初始化、依赖安装、页面创建和路由配置,以及后端SpringBoot项目的依赖添加、配置文件修改、代码实现和跨域问题的解决,最后展示了项目运行效果。
SpringBoot + Vue 前端后分离项目精进版本
|
25天前
|
Java
SpringBoot项目配置热部署启动 及 热部署失效的问题解决
这篇文章介绍了如何在SpringBoot项目中配置热部署启动,包括在pom文件中添加热部署依赖、在IDEA中进行设置、修改配置文件以及IDEA启动设置,以解决热部署失效的问题。
SpringBoot项目配置热部署启动 及 热部署失效的问题解决
|
15天前
|
Java 数据库连接 测试技术
SpringBoot 3.3.2 + ShardingSphere 5.5 + Mybatis-plus:轻松搞定数据加解密,支持字段级!
【8月更文挑战第30天】在数据驱动的时代,数据的安全性显得尤为重要。特别是在涉及用户隐私或敏感信息的应用中,如何确保数据在存储和传输过程中的安全性成为了开发者必须面对的问题。今天,我们将围绕SpringBoot 3.3.2、ShardingSphere 5.5以及Mybatis-plus的组合,探讨如何轻松实现数据的字段级加解密,为数据安全保驾护航。
60 1
|
15天前
|
小程序 前端开发 JavaScript
【项目实战】SpringBoot+uniapp+uview2打造一个企业黑红名单吐槽小程序
【避坑宝】是一款企业黑红名单吐槽小程序,旨在帮助打工人群体辨别企业优劣。该平台采用SpringBoot+MybatisPlus+uniapp+uview2等技术栈构建,具备丰富的注释与简洁的代码结构,非常适合实战练习与学习。通过小程序搜索“避坑宝”即可体验。
37 0
【项目实战】SpringBoot+uniapp+uview2打造一个企业黑红名单吐槽小程序
|
15天前
|
JavaScript 前端开发 小程序
【项目实战】SpringBoot+vue+iview打造一个极简个人博客系统
这是一个基于 SpringBoot+MybatisPlus+Vue+Iview 技术栈构建的个人极简博客系统,适合初学者实战练习。项目包含文章分类、撰写文章、标签管理和用户管理等功能,代码简洁并配有详细注释,易于上手。此外,该项目也可作为毕业设计的基础进行二次开发。
61 0
【项目实战】SpringBoot+vue+iview打造一个极简个人博客系统