SpringBoot中資源初始化加載的幾種方式

一、問題

在平時的業(yè)務模塊開發(fā)過程中光稼,難免會需要做一些全局的任務或南、緩存、線程等等的初始化工作艾君,那么如何解決這個問題呢采够?方法有多種,但具體又要怎么選擇呢冰垄?

二蹬癌、資源初始化

1.既然要做資源的初始化,那么就需要了解一下springboot啟動過程(這里大體說下啟動過程,詳細:https://www.cnblogs.com/dennyzhangdd/p/8028950.html
image.png

按照前面的分析虹茶,Spring-boot容器啟動流程總體可劃分為2部分:

執(zhí)行注解:掃描指定范圍下的bean逝薪、載入自動配置類對應的bean加載到IOC容器。
man方法中具體SpringAppliocation.run()蝴罪,全流程貫穿SpringApplicationEvent(經(jīng)典的spring事件驅(qū)動模型),有6個子類:
  • ApplicationFailedEvent.class
  • ApplicationPreparedEvent.class
  • ApplicationReadyEvent.class
  • ApplicationStartedEvent.class
  • ApplicationStartingEvent.class
  • SpringApplicationEvent.class
2董济、CommandLineRunner和ApplicationRunner

由上可知,我們只要實現(xiàn)這兩個中的任何一個接口便可以完成我們的資源初始化任務要门,可以看到它們的加載是在容器完全啟動之前虏肾。它兩的區(qū)別是:前者的run方法參數(shù)是String...args,直接傳入字符串欢搜,后者的參數(shù)是ApplicationArguments封豪,對參數(shù)進行了封裝。功能上是一樣的炒瘟。同時也可以使用 @Order注解來實現(xiàn)資源加載的先后順序吹埠,值越小,優(yōu)先級越高。實例如下:

@Component
@Order(1)
public class MyCommandLineRunner implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        System.out.println("...init resources by implements CommandLineRunner");
    }
}

@Component
@Order(2)
public class MyApplicationRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {
        System.out.println("...init resources by implements ApplicationRunner");
    }
}
3藻雌、@PostConstruct

在具體Bean的實例化過程中執(zhí)行,@PostConstruct注解的方法斩个,會在構(gòu)造方法之后執(zhí)行胯杭,順序為Constructor > @Autowired > @PostConstruct > 靜態(tài)方法,所以這個注解就避免了一些需要在構(gòu)造方法里使用依賴組件的尷尬(與之對應的還有@PreDestroy受啥,在對象消亡之前執(zhí)行做个,原理差不多)。使用特點如下:

  • 只有一個非靜態(tài)方法能使用此注解
  • 被注解的方法不得有任何參數(shù)
  • 被注解的方法返回值必須為void
  • 被注解方法不得拋出已檢查異常
  • 此方法只會被執(zhí)行一次
@Component
public Class AAA {    
    @Autowired    
    private BBB b;   

    public AAA() {        
        System.out.println("此時b還未被注入: b = " + b);    
    }    
    @PostConstruct    
    private void init() {        
        System.out.println("此時b已經(jīng)被注入: b = " + b);    
    }
}
4滚局、InitializingBean

InitializingBean 是 Spring 提供的一個接口居暖,只包含一個方法 afterPropertiesSet()。凡是實現(xiàn)了該接口的類藤肢,當其對應的 Bean 交由 Spring 管理后太闺,當其必要的屬性全部設置完成后,Spring 會調(diào)用該 Bean 的 afterPropertiesSet()嘁圈。在Bean在實例化的過程中執(zhí)執(zhí)行順序為:Constructor > @PostConstruct > InitializingBean > init-method

public class InitSequenceBean implements InitializingBean {   
    
    public InitSequenceBean() {   
       System.out.println("InitSequenceBean: constructor");   
    }   
      
    @PostConstruct  
    public void postConstruct() {   
       System.out.println("InitSequenceBean: postConstruct");   
    }   
      
    public void initMethod() {   
       System.out.println("InitSequenceBean: init-method");   
    }   
      
    @Override  
    public void afterPropertiesSet() throws Exception {   
       System.out.println("InitSequenceBean: afterPropertiesSet");   
    }   
}
5省骂、ApplicationListener

ApplicationListener 就是spring的監(jiān)聽器,能夠用來監(jiān)聽事件最住,典型的觀察者模式钞澳。如果容器中有一個ApplicationListener Bean,每當ApplicationContext發(fā)布ApplicationEvent時涨缚,ApplicationListener Bean將自動被觸發(fā)轧粟。這種事件機制都必須需要程序顯示的觸發(fā)。其中spring有一些內(nèi)置的事件脓魏,當完成某種操作時會發(fā)出某些事件動作兰吟。比如監(jiān)聽ContextRefreshedEvent事件,當所有的bean都初始化完成并被成功裝載后會觸發(fā)該事件轧拄,實現(xiàn)ApplicationListener接口可以收到監(jiān)聽動作揽祥,然后可以寫自己的邏輯。同樣事件可以自定義檩电、監(jiān)聽也可以自定義拄丰,完全根據(jù)自己的業(yè)務邏輯來處理。所以也能做到資源的初始化加載俐末!

@Component
public class DataSourceInitListener implements ApplicationListener<ContextRefreshedEvent> {//ContextRefreshedEvent為啟動事件
 
    private static final Logger LOGGER = LoggerFactory.getLogger(DataSourceInitListener.class);
 
    @Autowired
    private SystemConfigService systemConfigService;
    @Autowired
    private ItemService itemService;
    @Autowired
    private SystemResultService systemResultService;
 
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        if(event.getApplicationContext().getParent() == null) {//判斷是否執(zhí)行過料按,執(zhí)行過則不再執(zhí)行
            LOGGER.info("初始化systemConfig數(shù)據(jù)");
            systemConfigService.initConfig();
            LOGGER.info("初始化返回消息數(shù)據(jù)");
            systemResultService.initResult();
            LOGGER.info("系統(tǒng)初始化結(jié)束...........");
        }
    }
 
}

全文引用自https://www.cnblogs.com/cnndevelop/p/12064645.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市卓箫,隨后出現(xiàn)的幾起案子载矿,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闷盔,死亡現(xiàn)場離奇詭異弯洗,居然都是意外死亡,警方通過查閱死者的電腦和手機逢勾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門牡整,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人溺拱,你說我怎么就攤上這事逃贝。” “怎么了迫摔?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵沐扳,是天一觀的道長。 經(jīng)常有香客問我句占,道長沪摄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任纱烘,我火速辦了婚禮卓起,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凹炸。我一直安慰自己戏阅,他們只是感情好,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布啤它。 她就那樣靜靜地躺著奕筐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪变骡。 梳的紋絲不亂的頭發(fā)上离赫,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機與錄音塌碌,去河邊找鬼渊胸。 笑死,一個胖子當著我的面吹牛台妆,可吹牛的內(nèi)容都是我干的翎猛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼接剩,長吁一口氣:“原來是場噩夢啊……” “哼切厘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起懊缺,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤疫稿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遗座,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡舀凛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了途蒋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腾降。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖碎绎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抗果,我是刑警寧澤筋帖,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站冤馏,受9級特大地震影響日麸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逮光,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一代箭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涕刚,春花似錦嗡综、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至驾茴,卻和暖如春盼樟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锈至。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工晨缴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人峡捡。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓击碗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親们拙。 傳聞我的和親對象是個殘疾皇子延都,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容