SpringBoot項(xiàng)目啟動(dòng)時(shí)初始化操作常見(jiàn)的幾種方式
一.前言
通常的我們的項(xiàng)目開(kāi)發(fā)中,經(jīng)常會(huì)遇到那種在服務(wù)一啟動(dòng)就需要自動(dòng)執(zhí)行一些業(yè)務(wù)代碼的情況。
以下是常見(jiàn)的初始化場(chǎng)景:
1.數(shù)據(jù)庫(kù)初始化:創(chuàng)建表、加載數(shù)據(jù)。
2.緩存初始化:初始化 Redis 或其他緩存。如數(shù)據(jù)庫(kù)中的配置信息或者數(shù)據(jù)字典之類的緩存到redis
3.消息隊(duì)列初始化:初始化消息隊(duì)列的連接和配置。
4.定時(shí)任務(wù)初始化:設(shè)置定時(shí)任務(wù)的執(zhí)行。
5.Spring Security 配置初始化:設(shè)置默認(rèn)用戶和權(quán)限。
6.外部服務(wù)連接初始化:初始化與外部服務(wù)的連接。等等等......
二.常見(jiàn)的幾種方式
1.使用 CommandLineRunner 或 ApplicationRunner 接口
CommandLineRunner 和 ApplicationRunner 接口可以用于 Spring Boot 啟動(dòng)時(shí)執(zhí)行自定義的代碼。這兩者都提供了一個(gè) run 方法,你可以在其中執(zhí)行啟動(dòng)時(shí)需要的初始化操作。
CommandLineRunner 接口的 run(String... args) 方法接收啟動(dòng)時(shí)傳入的命令行參數(shù)。
ApplicationRunner 接口的 run(ApplicationArguments args) 方法接收 Spring Boot 應(yīng)用程序啟動(dòng)時(shí)的參數(shù),這些參數(shù)可以是鍵值對(duì)格式。
CommandLineRunner 示例
@Component public class StartupRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { // 在應(yīng)用啟動(dòng)時(shí)執(zhí)行的初始化邏輯 System.out.println("應(yīng)用啟動(dòng)時(shí)執(zhí)行初始化操作..."); // 可以在這里進(jìn)行一些數(shù)據(jù)加載、配置初始化等操作 } }
ApplicationRunner 示例
@Component public class ApplicationStartupRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { System.out.println("應(yīng)用啟動(dòng)時(shí)執(zhí)行初始化操作..."); } }
2.使用 @PostConstruct 注解
@PostConstruct 注解的方法會(huì)在 Spring 完成所有 bean 的初始化之后自動(dòng)執(zhí)行。通常用來(lái)執(zhí)行一些初始化的邏輯,比如加載配置、初始化數(shù)據(jù)等。
@Component public class MyStartupService { @PostConstruct public void init() { // 這是 Spring 完成所有 bean 初始化后執(zhí)行的代碼 System.out.println("Spring 容器初始化完成,執(zhí)行初始化操作..."); } }
3. 使用 @EventListener 監(jiān)聽(tīng) ApplicationReadyEvent 或 ContextRefreshedEvent
Spring 提供了多種事件,可以在這些事件觸發(fā)時(shí)執(zhí)行初始化操作。例如,ApplicationReadyEvent 事件在 Spring Boot 應(yīng)用完全啟動(dòng)之后觸發(fā),ContextRefreshedEvent 事件在 Spring 上下文刷新之后觸發(fā)。
示例:使用 @EventListener 監(jiān)聽(tīng) ApplicationReadyEvent
@Component public class StartupEventListener { @EventListener(ApplicationReadyEvent.class) public void onApplicationReady() { // 應(yīng)用完全啟動(dòng)后執(zhí)行的操作 System.out.println("Spring Boot 應(yīng)用啟動(dòng)完成,可以執(zhí)行初始化操作..."); } }
示例:使用 @EventListener 監(jiān)聽(tīng) ContextRefreshedEvent
@Component public class ContextRefreshListener { @EventListener(ContextRefreshedEvent.class) public void onContextRefreshed() { // Spring 容器刷新時(shí)執(zhí)行的操作 System.out.println("Spring 容器刷新完畢,執(zhí)行初始化操作..."); } }
4.實(shí)現(xiàn)org.springframework.beans.factory.InitializingBean接口并重寫 afterPropertiesSet()方法
InitializingBean接口只包含一個(gè)方法afterPropertiesSet(),凡是繼承了InitializingBean接口的類,在初始化時(shí)都會(huì)調(diào)用這方法;
使用方法分為三個(gè)步驟:
1、被spring管理 2、 實(shí)現(xiàn)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 開(kāi)始了。。。"); //初始化操作 } }
5.通過(guò) ApplicationRunner 或 CommandLineRunner 配置條件啟動(dòng)
你可以通過(guò) @Profile 或其他條件注解,來(lái)控制某些初始化邏輯僅在特定環(huán)境下執(zhí)行。
示例:根據(jù) @Profile 條件執(zhí)行初始化
@Component @Profile("dev") // 僅在 dev 配置下執(zhí)行 public class DevStartupRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("開(kāi)發(fā)環(huán)境下執(zhí)行初始化操作..."); } }
6. 使用 Spring Boot 自定義 Banner
Spring Boot 支持通過(guò)配置自定義啟動(dòng)時(shí)的 banner 內(nèi)容。這種方式適合顯示一些自定義的歡迎信息或者標(biāo)識(shí)。
@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. 初始化數(shù)據(jù)(例如:使用 @Bean 方法初始化數(shù)據(jù)庫(kù)或其他資源)
你還可以通過(guò) @Bean 方法配置 Spring Boot 應(yīng)用啟動(dòng)時(shí)進(jìn)行數(shù)據(jù)初始化,或者進(jìn)行外部服務(wù)的連接初始化。
示例:初始化數(shù)據(jù)庫(kù)
@Configuration public class DataInitConfig { @Bean public CommandLineRunner initializeData() { return args -> { // 在應(yīng)用啟動(dòng)時(shí)加載或初始化數(shù)據(jù) System.out.println("初始化數(shù)據(jù)..."); // 可以在這里調(diào)用數(shù)據(jù)庫(kù)服務(wù)或其他業(yè)務(wù)邏輯 }; } }
總結(jié)
到此這篇關(guān)于SpringBoot項(xiàng)目啟動(dòng)時(shí)初始化操作常見(jiàn)的幾種方式的文章就介紹到這了,更多相關(guān)SpringBoot項(xiàng)目啟動(dòng)時(shí)初始化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot項(xiàng)目之相互依賴報(bào)錯(cuò)問(wèn)題(基于idea)
這篇文章主要介紹了springboot項(xiàng)目之相互依賴報(bào)錯(cuò)問(wèn)題(基于idea),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02java同步器AQS架構(gòu)AbstractQueuedSynchronizer原理解析下
這篇文章主要為大家介紹了java同步器AQS架構(gòu)AbstractQueuedSynchronizer原理解析下,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03詳解Java Fibonacci Search斐波那契搜索算法代碼實(shí)現(xiàn)
這篇文章主要介紹了詳解Java Fibonacci Search斐波那契搜索算法代碼實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的緩存方法
本篇文章主要介紹了Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的緩存方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04一文搞清楚Java中Comparable和Comparator的區(qū)別
Java中的Comparable和Comparator都是用于集合排序的接口,但它們有明顯的區(qū)別,文中通過(guò)一些實(shí)例代碼詳細(xì)介紹了Java中Comparable和Comparator的區(qū)別,感興趣的同學(xué)跟著小編一起學(xué)習(xí)吧2023-05-05spring 整合 mybatis 中數(shù)據(jù)源的幾種配置方式(總結(jié)篇)
因?yàn)閟pring 整合mybatis的過(guò)程中, 有好幾種整合方式,尤其是數(shù)據(jù)源那塊,經(jīng)常看到不一樣的配置方式,總感覺(jué)有點(diǎn)亂,所以今天有空總結(jié)下,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05