日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

docker启动后自动退出_Spring Boot项目启动后如何自动执行逻辑

發布時間:2024/1/23 javascript 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 docker启动后自动退出_Spring Boot项目启动后如何自动执行逻辑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 前言

不知道你有沒有接到這種需求,項目啟動后立馬執行一些邏輯。比如簡單的緩存預熱,或者上線后的廣播之類等等。如果你使用 Spring Boot 框架的話就可以借助其提供的接口CommandLineRunner和 ApplicationRunner來實現。

2. CommandLineRunner

org.springframework.boot.CommandLineRunner 是Spring Boot提供的一個接口,當你實現該接口并將之注入Spring IoC容器后,Spring Boot應用啟動后就會執行其run方法。一個Spring Boot可以存在多個CommandLineRunner的實現,當存在多個時,你可以實現Ordered接口控制這些實現的執行順序(Order 數值越大優先級越低)。接下來我們來聲明兩個實現并指定順序:

優先執行:

package?cn.felord;

import?lombok.extern.slf4j.Slf4j;
import?org.springframework.boot.CommandLineRunner;
import?org.springframework.core.Ordered;
import?org.springframework.stereotype.Component;

/**
?*?優先級最高
?*?該類期望在springboot?啟動后第一順位執行
?*?@author?felord.cn
?*?@since?12:57
?**/
@Slf4j
@Component
public?class?HighOrderCommandLineRunner?implements?CommandLineRunner,?Ordered?{
????@Override
????public?void?run(String...?args)?throws?Exception?{
????????for?(String?arg?:?args)?{
????????????log.info("arg?=?"?+?arg);
????????}
????????log.info("i?am?highOrderRunner");
????}

????@Override
????public?int?getOrder()?{
????????return?Integer.MIN_VALUE+1;
????}
}

第二順序執行:

package?cn.felord;

import?lombok.extern.slf4j.Slf4j;
import?org.springframework.boot.CommandLineRunner;
import?org.springframework.core.Ordered;
import?org.springframework.stereotype.Component;

/**
?*?優先級低于{@code?HighOrderCommandLineRunner}
?*?@author?felord.cn
?*?@since?12:59
?**/
@Slf4j
@Component
public?class?LowOrderCommandLineRunner?implements?CommandLineRunner,?Ordered?{

????@Override
????public?void?run(String...?args)?throws?Exception?{
????????log.info("i?am?lowOrderRunner");
????}

????@Override
????public?int?getOrder()?{
????????return?Integer.MIN_VALUE+1;
????}
}

然后啟動Spring Boot應用后,控制臺按照預定的順序打印出了結果:

2020-05-30 23:11:03.685 INFO 11976 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2020-05-30 23:11:03.701 INFO 11976 --- [ main] c.f.Application : Started SpringBootApplication in 4.272 seconds (JVM running for 6.316)
2020-05-30 23:11:03.706 INFO 11976 --- [ main] c.f.HighOrderCommandLineRunner : i am highOrderRunner
2020-05-30 23:11:03.706 INFO 11976 --- [ main] c.f.LowOrderCommandLineRunner : i am lowOrderRunner

3. ApplicationRunner

Spring Boot 1.3.0又引入了一個和CommandLineRunner功能一樣的接口ApplicationRunner。CommandLineRunner接收可變參數String... args,而ApplicationRunner 接收一個封裝好的對象參數ApplicationArguments。除此之外它們功能完全一樣,甚至連方法名都一樣。聲明一個ApplicationRunner并讓它優先級最低:

package?cn.felord;

import?lombok.extern.slf4j.Slf4j;
import?org.springframework.boot.ApplicationArguments;
import?org.springframework.boot.ApplicationRunner;
import?org.springframework.core.Ordered;
import?org.springframework.stereotype.Component;

import?java.util.Arrays;
import?java.util.List;
import?java.util.Set;

/**
?*?優先級最低
?*?@author?felord.cn
?*?@since?13:00
?**/
@Slf4j
@Component
public?class?DefaultApplicationRunner?implements?ApplicationRunner,?Ordered?{
????@Override
????public?void?run(ApplicationArguments?args)?throws?Exception?{
????????log.info("i?am?applicationRunner");
????????Set?optionNames?=?args.getOptionNames();
????????log.info("optionNames?=?"?+?optionNames);
????????String[]?sourceArgs?=?args.getSourceArgs();
????????log.info("sourceArgs?=?"?+?Arrays.toString(sourceArgs));
????????List?nonOptionArgs?=?args.getNonOptionArgs();
????????log.info("nonOptionArgs?=?"?+?nonOptionArgs);
????????List?optionValues?=?args.getOptionValues("foo");
????????log.info("optionValues?=?"?+?optionValues);
????}@Overridepublic?int?getOrder()?{return?Integer.MIN_VALUE+2;
????}
}

按照順序打印了三個類的執行結果:

2020-06-01 13:02:39.420 INFO 19032 --- [ main] c.f.MybatisResultmapApplication : Started MybatisResultmapApplication in 1.801 seconds (JVM running for 2.266)
2020-06-01 13:02:39.423 INFO 19032 --- [ main] c.f.HighOrderCommandLineRunner : i am highOrderRunner
2020-06-01 13:02:39.423 INFO 19032 --- [ main] c.f.LowOrderCommandLineRunner : i am lowOrderRunner
2020-06-01 13:02:39.423 INFO 19032 --- [ main] c.f.DefaultApplicationRunner : i am applicationRunner
2020-06-01 13:02:39.423 INFO 19032 --- [ main] c.f.DefaultApplicationRunner : optionNames = []
2020-06-01 13:02:39.423 INFO 19032 --- [ main] c.f.DefaultApplicationRunner : sourceArgs = []
2020-06-01 13:02:39.423 INFO 19032 --- [ main] c.f.DefaultApplicationRunner : nonOptionArgs = []
2020-06-01 13:02:39.423 INFO 19032 --- [ main] c.f.DefaultApplicationRunner : optionValues = null

Ordered接口并不能被 @Order注解所代替。

4. 傳遞參數

相信很多同學看到這里都開始對這兩個run方法的入參感興趣了。Spring Boot應用啟動時是可以接受參數的,換句話說也就是Spring Boot的main方法是可以接受參數的。這些參數通過命令行 java -jar yourapp.jar 來傳遞。CommandLineRunner會原封不動照單全收這些接口,這些參數也可以封裝到ApplicationArguments對象中供ApplicationRunner調用。我們來認識一下ApplicationArguments的相關方法:

  • getSourceArgs() 被傳遞給應用程序的原始參數,返回這些參數的字符串數組。

  • getOptionNames() 獲取選項名稱的Set字符串集合。如 --spring.profiles.active=dev --debug 將返回["spring.profiles.active","debug"] 。

  • getOptionValues(String name) 通過名稱來獲取該名稱對應的選項值。如--foo=bar --foo=baz 將返回["bar","baz"]。

  • containsOption(String name) 用來判斷是否包含某個選項的名稱。

  • getNonOptionArgs() 用來獲取所有的無選項參數。

    接下來我們試驗一波,你可以通過下面的命令運行一個 Spring Boot應用 Jar

java?-jar?yourapp.jar?--foo=bar?--foo=baz?--dev.name=碼農小胖哥?java?felordcn

或者在IDEA開發工具中打開Spring Boot應用main方法的配置項,進行如下配置,其他IDE工具同理。

運行Spring Boot應用,將會打印出:

2020-06-01 15:04:31.490 INFO 13208 --- [ main] c.f.HighOrderCommandLineRunner : arg = --foo=bar
2020-06-01 15:04:31.490 INFO 13208 --- [ main] c.f.HighOrderCommandLineRunner : arg = --foo=baz
2020-06-01 15:04:31.490 INFO 13208 --- [ main] c.f.HighOrderCommandLineRunner : arg = --dev.name=碼農小胖哥
2020-06-01 15:04:31.490 INFO 13208 --- [ main] c.f.HighOrderCommandLineRunner : arg = java
2020-06-01 15:04:31.490 INFO 13208 --- [ main] c.f.HighOrderCommandLineRunner : arg = felordcn
2020-06-01 15:04:31.491 INFO 13208 --- [ main] c.f.HighOrderCommandLineRunner : i am highOrderRunner
2020-06-01 15:04:31.491 INFO 13208 --- [ main] c.f.LowOrderCommandLineRunner : i am lowOrderRunner
2020-06-01 15:04:31.491 INFO 13208 --- [ main] c.f.DefaultApplicationRunner : i am applicationRunner
2020-06-01 15:04:31.491 INFO 13208 --- [ main] c.f.DefaultApplicationRunner : optionNames = [dev.name, foo]
2020-06-01 15:04:31.491 INFO 13208 --- [ main] c.f.DefaultApplicationRunner : sourceArgs = [--foo=bar, --foo=baz, --dev.name=碼農小胖哥, java, felordcn]
2020-06-01 15:04:31.491 INFO 13208 --- [ main] c.f.DefaultApplicationRunner : nonOptionArgs = [java, felordcn]
2020-06-01 15:04:31.491 INFO 13208 --- [ main] c.f.DefaultApplicationRunner : optionValues = [bar, baz]

然后你就可以根據實際需要動態地執行一些邏輯。

5. 總結

今天我們對CommandLineRunner和ApplicationRunner進行了講解,從用法到順序執行,又對Spring Boot傳遞參數進行了介紹和演示,希望對你有所幫助。多多關注:碼農小胖哥,更多編程干貨分享給你。

往期推薦:

寫著寫著代碼就被帶上了警車

Java設計模式之命令模式

總結

以上是生活随笔為你收集整理的docker启动后自动退出_Spring Boot项目启动后如何自动执行逻辑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。