Spring Boot 資源初始化的幾種方法

原文鏈接

問題

項目啟動會加載一些資源到緩存,或者開啟一些任務

方法

  1. 既然要做資源的初始化,那么就需要了解一下springboot啟動過程(這里大體說下啟動過程,詳細:https://www.cnblogs.com/dennyzhangdd/p/8028950.html
    按照前面的分析,Spring-boot容器啟動流程總體可劃分為2部分:

執(zhí)行注解:掃描指定范圍下的bean、載入自動配置類對應的bean加載到IOC容器。
main方法中具體SpringAppliocation.run(),全流程貫穿SpringApplicationEvent(經(jīng)典的spring事件驅動模型),有6個子類:

  • ApplicationFailedEvent.class
  • ApplicationPreparedEvent.class
  • ApplicationReadyEvent.class
  • ApplicationStartedEvent.class
  • ApplicationStartingEvent.class
  • SpringApplicationEvent.class
  1. CommandLineRunner和ApplicationRunner
    由上可知,我們只要實現(xiàn)這兩個中的任何一個接口便可以完成我們的資源初始化任務,可以看到它們的加載是在容器完全啟動之前。它兩的區(qū)別是:前者的run方法參數(shù)是String…args,直接傳入字符串,后者的參數(shù)是ApplicationArguments,對參數(shù)進行了封裝。功能上是一樣的。同時也可以使用 @Order注解來實現(xiàn)資源加載的先后順序,值越小,優(yōu)先級越高。
@Slf4j
@Component
public class MyCommandLineRunner implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        log.info("-------------MyCommandLineRunner-----------");
    }
}
@Slf4j
@Component
public class MyApplicationRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        log.info("-------------MyApplicationRunner---------");
    }
}
  1. @PostConstruct
    在具體Bean的實例化過程中執(zhí)行,@PostConstruct注解的方法,會在構造方法之后執(zhí)行,順序為Constructor > @Autowired > @PostConstruct > 靜態(tài)方法,所以這個注解就避免了一些需要在構造方法里使用依賴組件的尷尬(與之對應的還有@PreDestroy,在對象消亡之前執(zhí)行,原理差不多)。
    使用特點如下:
  • 只有一個非靜態(tài)方法能使用此注解
  • 被注解的方法不得有任何參數(shù)
  • 被注解的方法返回值必須為void
  • 被注解方法不得拋出已檢查異常
  • 此方法只會被執(zhí)行一次
@Slf4j
@Component
public class MyPostConstruct {
 
    public MyPostConstruct() {
        log.info("-------------MyPostConstruct 構造方法------------"); 
    }
    @PostConstruct
    private void init() {
        log.info("-------------MyPostConstruct PostContrust注解方法---------");
    }
}
  1. InitializingBean
    InitializingBean 是 Spring 提供的一個接口,只包含一個方法 afterPropertiesSet()。凡是實現(xiàn)了該接口的類,當其對應的 Bean 交由 Spring 管理后,當其必要的屬性全部設置完成后,Spring 會調(diào)用該 Bean 的 afterPropertiesSet()。在Bean在實例化的過程中執(zhí)執(zhí)行順序為:Constructor > @PostConstruct > InitializingBean > init-method
@Slf4j
@Component
public class MyInitializingBean implements InitializingBean{

    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("-------------MyInitializingBean--------------");
    }

}
  1. 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è)務邏輯來處理。所以也能做到資源的初始化加載!
@Slf4j
@Component
public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent>{

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        if (event.getApplicationContext().getParent() == null) {//判斷是否執(zhí)行過,執(zhí)行過則不再執(zhí)行
            log.info("-------------MyApplicationListener---------------------");
        }       
    }
}

輸出結果

輸出結果
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容