SpringBoot系列(20):SpringBoot項目啟動成功后初始化執(zhí)行一些騷操作

作者: 修羅debug
版權聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 by-sa 版權協(xié)議,轉載請附上原文出處鏈接和本聲明。


摘要:在開發(fā)企業(yè)級應用系統(tǒng)的過程中,難免需要設定項目在啟動過程中或者項目啟動成功后初始化一些資源,甚至執(zhí)行一些騷操作,比如初始化第三方應用服務的賬號密碼、將系統(tǒng)字典數據初始化至緩存中等操作。本文我們將介紹如何基于CommandLineRunner,實現項目在啟動成功之后執(zhí)行一些騷操作、初始化一些資源的功能!

內容:“在項目的啟動過程中或者項目啟動成功后初始化一些資源、或者執(zhí)行一些騷操作”,有些小伙伴聽到這么一句需求,可能第一時間會想到“@PostConstruct”注解,確實,這個注解可以實現項目在啟動過程中執(zhí)行一些操作或者初始化一些資源,但是請記住,這個注解所注解的方法的業(yè)務邏輯是在“項目的啟動過程中”階段執(zhí)行的,而不是“項目啟動成功后”階段。

如下代碼所示為“@PostConstruct”注解所注解的方法,其方法內容邏輯也不復雜,就只打印一句話:

/**
* @Author:debug (SteadyJack)
* @Link: weixin-> debug0868 qq-> 1948831260
* @Date: 2019/11/14 17:06
**/
@Service
public class InitRunnerService {
private static final Logger log= LoggerFactory.getLogger(InitRunnerService.class);

@PostConstruct
public void init(){
log.info("--@PostConstruct方式-SpringBoot容器啟動之后執(zhí)行一些初始化的內容....--");

}
}

點擊運行項目,觀察項目的運行情況,會發(fā)現,“@PostConstruct”注解所注解的方法的邏輯在項目的啟動過程的某個階段成功執(zhí)行了,如下所示:


然而,這并非是我們所想要的,我們想要的在“項目啟動成功后”的階段執(zhí)行一些我們制定的方法邏輯或者初始化一些資源,而不是在項目的啟動過程!

之所以不是在“項目的啟動過程”階段執(zhí)行,是因為萬一該注解所注解的方法的業(yè)務邏輯執(zhí)行起來時間很長或者在執(zhí)行的過程出現了一些令人意想不到的異常,那么很有可能會因此而影響整個項目的啟動過程,甚至會出現“項目啟動失敗”的現象!

因此,才有了本文的需求重點“在項目完全啟動成功后執(zhí)行一些騷操作或者初始化一些資源”!在講解怎么實現之前,Debug給大家繪制了一幅“SpringBoot項目在啟動的過程中大致需要做的一些表象上的事情的流程圖”,如下所示:


“@PostConstruct”注解所注解的方法的邏輯的執(zhí)行時機便是穿插在整個啟動流程的某個階段執(zhí)行!

下面我們介紹如何基于“CommandLineRunner”接口實現項目在啟動成功之后執(zhí)行一些騷操作、初始化一些資源的功能!如果需要在項目啟動成功之后做許多初始化操作,那么可以分成多個“實現CommandLineRunner接口”的實現類去執(zhí)行,同時采用@Order(num)注解標注該實現類,num數值越小,就越先執(zhí)行,其代碼如下所示:

第一個:

/**
* spring boot項目啟動之后執(zhí)行一些初始化的內容1
* @Author:debug (SteadyJack)
* @Link: weixin-> debug0868 qq-> 1948831260
* @Date: 2019/11/14 16:49
**/
@Component
@Order(1)
public class InitRunnerOne implements CommandLineRunner{

private static final Logger log= LoggerFactory.getLogger(InitRunnerOne.class);

@Autowired
private SysConfigMapper sysConfigMapper;

//TODO:SpringBoot容器啟動之后執(zhí)行一些初始化的內容:比如將一些頻繁訪問的數據字典塞至緩存中....
@Override
public void run(String... strings) throws Exception {
log.info("--1~SpringBoot容器啟動之后執(zhí)行一些初始化的內容....--");

SysConfig sysConfig=sysConfigMapper.selectByPrimaryKey(5);
log.info("--項目啟動成功后初始化資源:{}",sysConfig);
}
}

第二個:  

@Component
@Order(2)
public class InitRunnerTwo implements CommandLineRunner{

private static final Logger log= LoggerFactory.getLogger(InitRunnerTwo.class);

//TODO:SpringBoot容器啟動之后執(zhí)行一些初始化的內容....
@Override
public void run(String... strings) throws Exception {
log.info("--2~SpringBoot容器啟動之后執(zhí)行一些初始化的內容....--");

}
}

廢話不多說,直接將項目啟動起來,觀察控制臺的輸出,會發(fā)現最終的輸出結果如我們所愿!


好了,本篇文章我們就介紹到這里了,其他相關的技術,感興趣的小伙伴可以關注底部Debug的技術公眾號,或者加Debug的微信,拉你進“微信版”的真正技術交流群!一起學習、共同成長!

補充:

1、本文涉及到的相關的源代碼可以到此地址,check出來進行查看學習:

https://gitee.com/steadyjack/SpringBootTechnology

2、最近Debug發(fā)布了幾門重量級的課程,感興趣的小伙伴可以前往觀看學習:
(1) 緩存中間件Redis技術入門與應用場景實戰(zhàn)(SpringBoot2.x + 搶紅包系統(tǒng)設計與實戰(zhàn)) 
https://www.fightjava.com/web/index/course/detail/12

(2)  企業(yè)權限管理平臺(SpringBoot2.0+Shiro+Vue+Mybatis) 
https://www.fightjava.com/web/index/course/detail/8

3、關注一下Debug的技術微信公眾號,最新的技術文章、課程以及技術專欄將會第一時間在公眾號發(fā)布哦!