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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

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

發(fā)布時(shí)間:2024/1/23 javascript 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 docker启动后自动退出_Spring Boot项目启动后如何自动执行逻辑 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 前言

不知道你有沒(méi)有接到這種需求,項(xiàng)目啟動(dòng)后立馬執(zhí)行一些邏輯。比如簡(jiǎn)單的緩存預(yù)熱,或者上線后的廣播之類等等。如果你使用 Spring Boot 框架的話就可以借助其提供的接口CommandLineRunner和 ApplicationRunner來(lái)實(shí)現(xiàn)。

2. CommandLineRunner

org.springframework.boot.CommandLineRunner 是Spring Boot提供的一個(gè)接口,當(dāng)你實(shí)現(xiàn)該接口并將之注入Spring IoC容器后,Spring Boot應(yīng)用啟動(dòng)后就會(huì)執(zhí)行其run方法。一個(gè)Spring Boot可以存在多個(gè)CommandLineRunner的實(shí)現(xiàn),當(dāng)存在多個(gè)時(shí),你可以實(shí)現(xiàn)Ordered接口控制這些實(shí)現(xiàn)的執(zhí)行順序(Order 數(shù)值越大優(yōu)先級(jí)越低)。接下來(lái)我們來(lái)聲明兩個(gè)實(shí)現(xiàn)并指定順序:

優(yōu)先執(zhí)行:

package?cn.felord;

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

/**
?*?優(yōu)先級(jí)最高
?*?該類期望在springboot?啟動(dòng)后第一順位執(zhí)行
?*?@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;
????}
}

第二順序執(zhí)行:

package?cn.felord;

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

/**
?*?優(yōu)先級(jí)低于{@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;
????}
}

然后啟動(dòng)Spring Boot應(yīng)用后,控制臺(tái)按照預(yù)定的順序打印出了結(jié)果:

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又引入了一個(gè)和CommandLineRunner功能一樣的接口ApplicationRunner。CommandLineRunner接收可變參數(shù)String... args,而ApplicationRunner 接收一個(gè)封裝好的對(duì)象參數(shù)ApplicationArguments。除此之外它們功能完全一樣,甚至連方法名都一樣。聲明一個(gè)ApplicationRunner并讓它優(yōu)先級(jí)最低:

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;

/**
?*?優(yōu)先級(jí)最低
?*?@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;
????}
}

按照順序打印了三個(gè)類的執(zhí)行結(jié)果:

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. 傳遞參數(shù)

相信很多同學(xué)看到這里都開始對(duì)這兩個(gè)run方法的入?yún)⒏信d趣了。Spring Boot應(yīng)用啟動(dòng)時(shí)是可以接受參數(shù)的,換句話說(shuō)也就是Spring Boot的main方法是可以接受參數(shù)的。這些參數(shù)通過(guò)命令行 java -jar yourapp.jar 來(lái)傳遞。CommandLineRunner會(huì)原封不動(dòng)照單全收這些接口,這些參數(shù)也可以封裝到ApplicationArguments對(duì)象中供ApplicationRunner調(diào)用。我們來(lái)認(rèn)識(shí)一下ApplicationArguments的相關(guān)方法:

  • getSourceArgs() 被傳遞給應(yīng)用程序的原始參數(shù),返回這些參數(shù)的字符串?dāng)?shù)組。

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

  • getOptionValues(String name) 通過(guò)名稱來(lái)獲取該名稱對(duì)應(yīng)的選項(xiàng)值。如--foo=bar --foo=baz 將返回["bar","baz"]。

  • containsOption(String name) 用來(lái)判斷是否包含某個(gè)選項(xiàng)的名稱。

  • getNonOptionArgs() 用來(lái)獲取所有的無(wú)選項(xiàng)參數(shù)。

    接下來(lái)我們?cè)囼?yàn)一波,你可以通過(guò)下面的命令運(yùn)行一個(gè) Spring Boot應(yīng)用 Jar

java?-jar?yourapp.jar?--foo=bar?--foo=baz?--dev.name=碼農(nóng)小胖哥?java?felordcn

或者在IDEA開發(fā)工具中打開Spring Boot應(yīng)用main方法的配置項(xiàng),進(jìn)行如下配置,其他IDE工具同理。

運(yùn)行Spring Boot應(yīng)用,將會(huì)打印出:

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=碼農(nóng)小胖哥
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=碼農(nóng)小胖哥, 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]

然后你就可以根據(jù)實(shí)際需要?jiǎng)討B(tài)地執(zhí)行一些邏輯。

5. 總結(jié)

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

往期推薦:

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

Java設(shè)計(jì)模式之命令模式

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费观看久久 | 国产精品第七页 | 色婷婷一区二区 | 国产地址 | 久久久亚洲国产精品 | 欧美激情电影一区二区 | 九草av| av免费观看入口 | 日韩精品电影在线观看 | 极品销魂美女一区二区三区 | 日韩中文字幕精品 | 亚洲天堂男人网 | 五月天啪啪 | 中文字av | 欧美日韩成人一区二区 | 插我一区二区在线观看 | 中文字幕在线播放一区 | 18+视频在线观看 | 色骚综合 | 五月婷视频 | 五月天天色 | 亚洲精品国产精品乱码桃花 | 中文字幕一区二区视频 | 欧美一区二区三区在线播放 | 2021毛片| 国产精品第3页 | 亚洲精品国产精品乱码在线观看 | 天天躁夜夜躁狠狠躁 | 国产精品一区二区久久 | 成人免费在线播放 | 美女网站全黄 | 精品国产一区二区三区av性色 | 国产乱码视频 | 久久亚洲精少妇毛片午夜无码 | 欧美日韩亚洲免费 | 少妇精品一区 | 欧美在线中文字幕 | 亚洲成人 av | 日本女优一区 | www.玖玖玖| 黄色国产免费 | av在线播放中文字幕 | 色播五月激情五月 | 亚洲成人999| va婷婷在线免费观看 | 国产精品第12页 | 国产乱码在线观看 | 亚洲自拍中文字幕 | 黄色三级免费 | 18岁毛片| 正在播放欧美 | www啪啪| 尤物在线观看 | 久久精品国产亚洲AV成人雅虎 | 性爱一级视频 | 中文字幕 国产 | 狠狠的干狠狠的操 | 亚洲欧洲日韩综合 | 动漫毛片 | 国产激情av一区二区三区 | 亚洲成a| 国产一级久久 | 被各种性器调教到哭vk | 欧美偷拍视频 | 男人捅爽女人 | 丰满女邻居的色诱4hd | 视频免费在线观看 | 蜜桃视频成人 | 韩国女主播av | 欧美日韩色视频 | 无码人妻精品一区二区中文 | 亚洲最大成人综合网 | 欧美在线一区二区 | 亚洲综合图 | 国产福利午夜 | 蜜桃精品久久久久久久免费影院 | 欧美日韩性生活视频 | 亚州中文 | 亚洲大尺度在线观看 | 亚洲卡一卡二 | 一级黄色免费 | 99中文字幕 | 国产精品视频入口 | 九色视频偷拍少妇的秘密 | 久久免费视频99 | 欧美日本一区二区 | 成人黄色免费网站 | 国产偷自拍视频 | 亚洲欧美日韩天堂 | 乱码一区二区三区 | 欧美精品亚洲 | av大全在线观看 | 超碰香蕉| 日本美女啪啪 | 中文字幕国产专区 | 性欧美18—19sex性高清 | 久久av色| a毛片 | 蜜桃久久av |