<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SpringBoot 啟動(dòng)時(shí)實(shí)現(xiàn)自動(dòng)執(zhí)行代碼的幾種方式講解

          共 2348字,需瀏覽 5分鐘

           ·

          2022-02-15 19:04



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

          details/81813662

          前言

          目前開(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)代碼塊,在類(lè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)ⅰ?code style="margin-right: 2px;margin-left: 2px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;background: rgb(248, 245, 236);color: rgb(255, 53, 2);line-height: 1.5;font-size: 90%;padding: 3px 5px;border-radius: 2px;">ApplicationRunner的run方法入?yún)?code style="margin-right: 2px;margin-left: 2px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;background: rgb(248, 245, 236);color: rgb(255, 53, 2);line-height: 1.5;font-size: 90%;padding: 3px 5px;border-radius: 2px;">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è)類(lèi)實(shí)現(xiàn)了CommandLineRunnerApplicationRunner接口時(shí),可以通過(guò)在類(lèi)上添加@Order注解來(lái)設(shè)定運(yùn)行順序。

          代碼測(cè)試

          為了測(cè)試啟動(dòng)時(shí)運(yùn)行的效果和順序,編寫(xiě)幾個(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注解的類(lèi),加載類(lèi)并初始化對(duì)象進(jìn)行自動(dòng)注入。加載類(lèi)時(shí)首先要執(zhí)行static靜態(tài)代碼塊中的代碼,之后再初始化對(duì)象時(shí)會(huì)執(zhí)行構(gòu)造方法。

          在對(duì)象注入完成后,調(diào)用帶有@PostConstruct注解的方法。當(dāng)容器啟動(dòng)成功后,再根據(jù)@Order注解的順序調(diào)用CommandLineRunnerApplicationRunner接口類(lèi)中的run方法。

          因此,加載順序?yàn)?code style="margin-right: 2px;margin-left: 2px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;background: rgb(248, 245, 236);color: rgb(255, 53, 2);line-height: 1.5;font-size: 90%;padding: 3px 5px;border-radius: 2px;">static>constructer>@PostConstruct>CommandLineRunnerApplicationRunner.

          程序汪資料鏈接

          程序汪接的7個(gè)私活都在這里,經(jīng)驗(yàn)整理

          Java項(xiàng)目分享 最新整理全集,找項(xiàng)目不累啦 06版

          堪稱(chēng)神級(jí)的Spring Boot手冊(cè),從基礎(chǔ)入門(mén)到實(shí)戰(zhàn)進(jìn)階

          臥槽!字節(jié)跳動(dòng)《算法中文手冊(cè)》火了,完整版 PDF 開(kāi)放下載!

          臥槽!阿里大佬總結(jié)的《圖解Java》火了,完整版PDF開(kāi)放下載!

          字節(jié)跳動(dòng)總結(jié)的設(shè)計(jì)模式 PDF 火了,完整版開(kāi)放下載!

          歡迎添加程序汪個(gè)人微信 itwang009? 進(jìn)粉絲群或圍觀朋友圈

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

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  狠狠干天天 | 在线观看视频一区 | 2大在线观看国内黄色 | 黄色免费在线观看 | 区美一级AA免费观看 |