一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 詳解Spring Boot中初始化資源的幾種方式

詳解Spring Boot中初始化資源的幾種方式

2021-05-23 15:52happyJared Java教程

這篇文章主要介紹了詳解Spring Boot中初始化資源的幾種方式,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

假設有這么一個需求,要求在項目啟動過程中,完成線程池的初始化,加密證書加載等功能,你會怎么做?如果沒想好答案,請接著往下看。今天介紹幾種在spring boot中進行資源初始化的方式,幫助大家解決和回答這個問題。

commandlinerunner

  1. 定義初始化類 mycommandlinerunner
  2. 實現 commandlinerunner 接口,并實現它的 run() 方法,在該方法中編寫初始化邏輯
  3. 注冊成bean,添加 @component注解即可

示例代碼如下:

?
1
2
3
4
5
6
7
8
9
@component
public class mycommandlinerunner implements commandlinerunner {
 
  @override
  public void run(string... args) throws exception {
    system.out.println("...init resources by implements commandlinerunner");
  }
  
}

實現了 commandlinerunner 接口的 component 會在所有 spring beans 初始化完成之后, 在 springapplication.run() 執行之前完成。下面通過加兩行打印來驗證我們的測試。

?
1
2
3
4
5
6
7
8
9
10
@springbootapplication
public class demoapplication {
 
  public static void main(string[] args) {
    system.out.println("... start springapplication.run()");
    springapplication.run(demoapplication.class, args);
    system.out.println("... end springapplication.run()");
  }
  
}

控制臺打印結果如下。

... start springapplication.run()
 
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: spring boot ::       (v1.5.11.release)
。。。。。。(此處省略一堆打印信息)
2018-05-02 17:01:19.700  info 21236 --- [           main] s.b.c.e.t.tomcatembeddedservletcontainer : tomcat started on port(s): 8080 (http)
...init resources by implements commandlinerunner
2018-05-02 17:01:19.708  info 21236 --- [           main] cn.mariojd.demo.demoapplication          : started demoapplication in 2.282 seconds (jvm running for 3.125)
... end springapplication.run()

applicationrunner

  1. 定義初始化類 myapplicationrunner
  2. 實現 applicationrunner 接口,并實現它的 run() 方法,在該方法中編寫初始化邏輯
  3. 注冊成bean,添加 @component注解即可

示例代碼如下:

?
1
2
3
4
5
6
7
8
9
@component
public class myapplicationrunner implements applicationrunner {
 
  @override
  public void run(applicationarguments applicationarguments) throws exception {
    system.out.println("...init resources by implements applicationrunner");
  }
 
}

可以看到,通過實現 applicationrunner 接口,和通過實現 commandlinerunner 接口都可以完成項目的初始化操作,實現相同的效果。兩者之間唯一的區別是 run() 方法中自帶的形參不相同,在 commandlinerunner 中只是簡單的string... args形參,而 applicationrunner 則是包含了 applicationarguments 對象,可以幫助獲得更豐富的項目信息。

applicationarguments

@order

如果項目中既有實現了 applicationrunner 接口的初始化類,又有實現了 commandlinerunner 接口的初始化類,那么會是哪一個先執行呢?測試告訴我們,答案是實現了 applicationrunner 接口的初始化類先執行,我想這點倒是不需要大家過分去關注為什么。但如果需要改變兩個初始化類之間的默認執行順序,那么使用 @order 注解就可以幫助我們解決這個問題。

?
1
2
3
4
5
6
7
8
9
10
@order
@component
@order(1)
public class mycommandlinerunner implements commandlinerunner {
 
  @override
  public void run(string... args) throws exception {
    system.out.println("...init resources by implements commandlinerunner");
  }
}
?
1
2
3
4
5
6
7
8
9
10
@component
@order(2)
public class myapplicationrunner implements applicationrunner {
 
  @override
  public void run(applicationarguments applicationarguments) throws exception {
    system.out.println("...init resources by implements applicationrunner");
  }
 
}

最終,控制臺中打印如下。通過控制臺輸出我們發現, @order 注解值越小,該初始化類也就越早執行。

。。。。。。(此處省略一堆打印信息)
2018-05-02 17:27:31.450  info 28304 --- [           main] s.b.c.e.t.tomcatembeddedservletcontainer : tomcat started on port(s): 8080 (http)
...init resources by implements commandlinerunner
...init resources by implements applicationrunner
2018-05-02 17:27:31.453  info 28304 --- [           main] cn.mariojd.demo.demoapplication          : started demoapplication in 2.086 seconds (jvm running for 2.977)

@postconstruct

使用 @postconstruct 注解同樣可以幫助我們完成資源的初始化操作,前提是這些初始化操作不需要依賴于其它spring beans的初始化工作。

@postconstruct

可以看到 @postconstruct 注解是用在方法上的,寫一個方法測試一下吧。

?
1
2
3
4
@postconstruct
public void postconstruct() {
  system.out.println("... postconstruct");
}

啟動項目,控制臺中最終打印如下。

... start springapplication.run()
 
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: spring boot ::       (v1.5.11.release)
。。。。。。(此處省略一堆打印信息)
... postconstruct
。。。。。。(此處省略一堆打印信息)
2018-05-02 17:40:22.300  info 29796 --- [           main] s.b.c.e.t.tomcatembeddedservletcontainer : tomcat started on port(s): 8080 (http)
...init resources by implements commandlinerunner
...init resources by implements applicationrunner
2018-05-02 17:40:22.303  info 29796 --- [           main] cn.mariojd.demo.demoapplication          : started demoapplication in 2.387 seconds (jvm running for 3.267)
... end springapplication.run()

文末小結

綜上,使用 @postconstruct 注解進行初始化操作的順序是最快的,前提是這些操作不能依賴于其它bean的初始化完成。通過添加 @order 注解,我們可以改變同層級之間不同bean的加載順序。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/qq_28804275/article/details/80891941

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲社区在线 | 色综合天天综合 | 日本亚洲欧洲高清有码在线播放 | 成人快插 | 女人把扒开给男人爽 | 天使萌痴汉在线中文字幕 | 暖暖 免费 高清 中文 日本 | 日本一区二区三区四区无限 | 日本中文字幕不卡在线一区二区 | 小早川怜子息梦精在线播放 | 日本一区二区三区国产 | 2020中文字幕 | 三级视频中文字幕 | 97大香伊在人人线色 | gayxxx视频| 亚洲六月丁香婷婷综合 | 日本在线观看www鲁啊鲁视频 | 91九色视频无限观看免费 | 国产欧美一区二区三区精品 | 密臀tv| 四虎精品成人免费观看 | ai换脸杨颖被啪在线观看 | 国模娜娜a4u1546全套 | 国产美女操 | 日本不卡在线一区二区三区视频 | 91日本在线 | 禁漫H天堂免费A漫 | 国产一区二区精品久久 | 色综合合久久天天综合绕视看 | 初尝黑人巨大h文 | 视频一区二区国产 | 日本高清视频在线观看 | 国产成人亚洲精品91专区手机 | 日本不卡在线一区二区三区视频 | 久久se精品一区二区国产 | 亚洲社区在线观看 | jizz漫画| 99夜色| 欧美一级视频免费观看 | 亚洲精品卡一卡2卡3卡4卡 | 国产成人咱精品视频免费网站 |