1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        SpringBoot 啟動(dòng)時(shí)自動(dòng)執(zhí)行代碼的幾種方式,還有誰(shuí)不會(huì)??

        共 2495字,需瀏覽 5分鐘

         ·

        2022-06-06 18:52

        往期熱門文章:

        1、勁爆!Java 通用泛型要來(lái)了。。

        2、如何寫出讓同事吐血的代碼?

        3、遭棄用的 Docker Desktop 放大招!宣布支持 Linux

        4、IDEA公司再發(fā)新神器!超越 VS Code 騷操作!

        5、推薦好用 Spring Boot 內(nèi)置工具類

        來(lái)源:blog.csdn.net/u011291072/article/details/81813662

        • 前言

        • java自身的啟動(dòng)時(shí)加載方式

        • Spring啟動(dòng)時(shí)加載方式

        • 代碼測(cè)試

        • 總結(jié)


        前言

        目前開(kāi)發(fā)的SpringBoot項(xiàng)目在啟動(dòng)的時(shí)候需要預(yù)加載一些資源。而如何實(shí)現(xiàn)啟動(dòng)過(guò)程中執(zhí)行代碼,或啟動(dòng)成功后執(zhí)行,是有很多種方式可以選擇,我們可以在static代碼塊中實(shí)現(xiàn),也可以在構(gòu)造方法里實(shí)現(xiàn),也可以使用@PostConstruct注解實(shí)現(xiàn)。
        當(dāng)然也可以去實(shí)現(xiàn)Spring的ApplicationRunnerCommandLineRunner接口去實(shí)現(xiàn)啟動(dòng)后運(yùn)行的功能。在這里整理一下,在這些位置執(zhí)行的區(qū)別以及加載順序。

        java自身的啟動(dòng)時(shí)加載方式

        static代碼塊

        static靜態(tài)代碼塊,在類加載的時(shí)候即自動(dòng)執(zhí)行。

        構(gòu)造方法

        在對(duì)象初始化時(shí)執(zhí)行。執(zhí)行順序在static靜態(tài)代碼塊之后。

        Spring啟動(dòng)時(shí)加載方式

        @PostConstruct注解

        PostConstruct注解使用在方法上,這個(gè)方法在對(duì)象依賴注入初始化之后執(zhí)行。

        ApplicationRunner和CommandLineRunner

        SpringBoot提供了兩個(gè)接口來(lái)實(shí)現(xiàn)Spring容器啟動(dòng)完成后執(zhí)行的功能,兩個(gè)接口分別為CommandLineRunnerApplicationRunner。
        這兩個(gè)接口需要實(shí)現(xiàn)一個(gè)run方法,將代碼在run中實(shí)現(xiàn)即可。這兩個(gè)接口功能基本一致,其區(qū)別在于run方法的入?yún)ⅰ?/span>ApplicationRunner的run方法入?yún)?/span>ApplicationArguments,為CommandLineRunner的run方法入?yún)镾tring數(shù)組。

        何為ApplicationArguments

        官方文檔解釋為:
        Provides access to the arguments that were used to run a SpringApplication.
        在Spring應(yīng)用運(yùn)行時(shí)使用的訪問(wèn)應(yīng)用參數(shù)。即我們可以獲取到SpringApplication.run(…)的應(yīng)用參數(shù)。

        Order注解

        當(dāng)有多個(gè)類實(shí)現(xiàn)了CommandLineRunnerApplicationRunner接口時(shí),可以通過(guò)在類上添加@Order注解來(lái)設(shè)定運(yùn)行順序。

        代碼測(cè)試

        為了測(cè)試啟動(dòng)時(shí)運(yùn)行的效果和順序,編寫幾個(gè)測(cè)試代碼來(lái)運(yùn)行看看。
        TestPostConstruct
        @Component
        public?class?TestPostConstruct?{

        ????static?{
        ????????System.out.println("static");
        ????}
        ????public?TestPostConstruct()?{
        ????????System.out.println("constructer");
        ????}

        ????@PostConstruct
        ????public?void?init()?{
        ????????System.out.println("PostConstruct");
        ????}
        }
        TestApplicationRunner
        @Component
        @Order(1)
        public?class?TestApplicationRunner?implements?ApplicationRunner{
        ????@Override
        ????public?void?run(ApplicationArguments?applicationArguments)?throws?Exception?{
        ????????System.out.println("order1:TestApplicationRunner");
        ????}
        }
        TestCommandLineRunner
        @Component
        @Order(2)
        public?class?TestCommandLineRunner?implements?CommandLineRunner?{
        ????@Override
        ????public?void?run(String...?strings)?throws?Exception?{
        ????????System.out.println("order2:TestCommandLineRunner");
        ????}
        }
        執(zhí)行結(jié)果
        圖片

        總結(jié)

        Spring應(yīng)用啟動(dòng)過(guò)程中,肯定是要自動(dòng)掃描有@Component注解的類,加載類并初始化對(duì)象進(jìn)行自動(dòng)注入。加載類時(shí)首先要執(zhí)行static靜態(tài)代碼塊中的代碼,之后再初始化對(duì)象時(shí)會(huì)執(zhí)行構(gòu)造方法。
        在對(duì)象注入完成后,調(diào)用帶有@PostConstruct注解的方法。當(dāng)容器啟動(dòng)成功后,再根據(jù)@Order注解的順序調(diào)用CommandLineRunnerApplicationRunner接口類中的run方法。
        因此,加載順序?yàn)?/span>static>constructer>@PostConstruct>CommandLineRunnerApplicationRunner.

        最近熱文閱讀:

        1、如何寫出讓同事吐血的代碼?
        2、遭棄用的 Docker Desktop 放大招!宣布支持 Linux
        3、IDEA公司再發(fā)新神器!超越 VS Code 騷操作!
        4、推薦好用 Spring Boot 內(nèi)置工具類
        5、五個(gè)刁鉆的String面試問(wèn)題及解答
        6、IntelliJ平臺(tái)將完全停止使用Log4j
        7、神操作!我把 3000 行代碼重構(gòu)成 15 行!
        8、我用Java幾分鐘處理完30億個(gè)數(shù)據(jù)...
        9、一款自動(dòng)生成單元測(cè)試的 IDEA 插件
        10、微軟 10 大最受歡迎 GitHub 項(xiàng)目,最高 Star 數(shù)量 13 萬(wàn)
        關(guān)注公眾號(hào),你想要的Java都在這

        瀏覽 31
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            日批视频免费播放 | 好硬好深操我啊啊 | 插美女网站 | 动漫理伦片在线版观看 | 丁香五月在线观看视频 | 欧美精品国产白浆久久久久 | 久青操| 波多野结衣视频免费在线观看 | 欧美日韩国产网站 | 亚洲成人无码一区 |