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=====


目录
相关文章
|
2月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
228 2
|
1月前
|
Java 应用服务中间件
SpringBoot获取项目文件的绝对路径和相对路径
SpringBoot获取项目文件的绝对路径和相对路径
93 1
SpringBoot获取项目文件的绝对路径和相对路径
|
1月前
|
消息中间件 缓存 Java
手写模拟Spring Boot启动过程功能
【11月更文挑战第19天】Spring Boot自推出以来,因其简化了Spring应用的初始搭建和开发过程,迅速成为Java企业级应用开发的首选框架之一。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,帮助读者深入理解其工作机制。
42 3
|
1月前
|
分布式计算 关系型数据库 MySQL
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型 图像处理 光通信 分布式计算 算法语言 信息技术 计算机应用
55 8
|
1月前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
60 9
|
1月前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
42 2
|
2月前
|
JavaScript 前端开发 Java
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
这篇文章详细介绍了如何在前端Vue项目和后端Spring Boot项目中通过多种方式解决跨域问题。
395 1
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
|
2月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
76 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
存储 easyexcel Java
SpringBoot+EasyExcel轻松实现300万数据快速导出!
本文介绍了在项目开发中使用Apache POI进行数据导入导出的常见问题及解决方案。首先比较了HSSFWorkbook、XSSFWorkbook和SXSSFWorkbook三种传统POI版本的优缺点,然后根据数据量大小推荐了合适的使用场景。接着重点介绍了如何使用EasyExcel处理超百万数据的导入导出,包括分批查询、分批写入Excel、分批插入数据库等技术细节。通过测试,300万数据的导出用时约2分15秒,导入用时约91秒,展示了高效的数据处理能力。最后总结了公司现有做法的不足,并提出了改进方向。
|
1月前
|
JavaScript 前端开发 Java
SpringBoot项目的html页面使用axios进行get post请求
SpringBoot项目的html页面使用axios进行get post请求
53 2
下一篇
DataWorks