springboot~ EventListener事件監聽的使用
https://www.cnblogs.com/lori/p/9871362.html
SpringBoot的ApplicationRunner
執行時機為容器啟動完成的時候。
https://blog.csdn.net/jdd92/article/details/81053404
——————————————————————————————————————————————————
在開發中可能會有這樣的情景。需要在容器啟動的時候執行一些內容。比如讀取配置文件,數據庫連接之類的。SpringBoot給我們提供了兩個接口來幫助我們實現這種需求。這兩個接口分別為CommandLineRunner和ApplicationRunner。他們的執行時機為容器啟動完成的時候。
這兩個接口中有一個run方法,我們只需要實現這個方法即可。這兩個接口的不同之處在於:ApplicationRunner中run方法的參數為ApplicationArguments,而CommandLineRunner接口中run方法的參數為String數組。目前我在項目中用的是ApplicationRunner。是這么實現的:
package com.jdddemo.demo.controller;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
@Component
public class JDDRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(args);
System.out.println("這個是測試ApplicationRunner接口");
}
}
———————————————————————————————————————————————————————————
讀取參數?
在我們開始快速說明之前。在這兩種情況下,無論是CommandLineRunner還是ApplicationRunner,都始終支持Spring的屬性處理。我們可以像往常一樣使用@Value注釋注入值。
完整的工作源代碼在這里
首先,我們創建一個簡單的Spring Boot應用程序並實現ApplicationRunner接口。現在,Spring可以獲得我們的這個類並執行它。它類似於CommandLineRunner。
我們還必須實現一個方法run,但是我們將ApplicationArguments 作為入參數而不是String列表。
ApplicationArguments區分選項參數和非選項參數。選項參數是我們可以通過Spring Boot屬性處理使用的(如 app.name = Myapp)。它們還可以通過傳入逗號分隔列表或多次使用參數來為每個選項包含多個值。
非選項參數是我們在命令行傳遞除了VM參數的所有其他參數。
在示例中,我們將打印出我們收到的每種類型的參數,然后顯示它們。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@SpringBootApplication
public
class
CommandlineAppApplication
implements
ApplicationRunner{
public
static
void
main(String[] args) {
SpringApplication.run(CommandlineAppApplication.
class
, args);
}
@Override
public
void
run(ApplicationArguments args)
throws
Exception {
System.out.println(
"# NonOptionArgs: "
+ args.getNonOptionArgs().size());
System.out.println(
"NonOptionArgs:"
);
args.getNonOptionArgs().forEach(System.out::println);
System.out.println(
"# OptionArgs: "
+ args.getOptionNames().size());
System.out.println(
"OptionArgs:"
);
args.getOptionNames().forEach(optionName -> {
System.out.println(optionName +
"="
+ args.getOptionValues(optionName));
});
}
}
|
非選項參數通過getNonOptionArgs()
作為字符串列表重新獲得。
而對於選項參數,我們可以通過接收選項名稱getOptionNames和實際值通過getOptionValues,它會返回一個列表字符串。
當我們現在啟動應用程序並傳遞一些參數,如:
1
|
java -jar commandline-app-
0.0
.
1
-SNAPSHOT.jar iamnonoption --app.name=CmdRulez --app.hosts=abc,def,ghi --app.name=
2
|
上述執行的輸出:
#NonOptionArgs:1個
NonOptionArgs:
nonoption
#OptionArgs:2個
OptionArgs:
app.hosts = [ABC,DEF,GHI]
app.name = [CmdRulez,2]
——————————————————————————————————————————————————————————
spring boot:ApplicationRunner和CommandLineRunner用法區別
業務場景:
應用服務啟動時,加載一些數據和執行一些應用的初始化動作。如:刪除臨時文件,清除緩存信息,讀取配置文件信息,數據庫連接等。
1、SpringBoot提供了CommandLineRunner和ApplicationRunner接口。當接口有多個實現類時,提供了@order注解實現自定義執行順序,也可以實現Ordered接口來自定義順序。
注意:數字越小,優先級越高,也就是@Order(1)注解的類會在@Order(2)注解的類之前執行。
兩者的區別在於:
ApplicationRunner中run方法的參數為ApplicationArguments,而CommandLineRunner接口中run方法的參數為String數組。想要更詳細地獲取命令行參數,那就使用ApplicationRunner接口
ApplicationRunner
@Component
@Order(value = 10)
public class AgentApplicationRun2 implements ApplicationRunner {
@Override
public void run(ApplicationArguments applicationArguments) throws Exception {
}
}
CommandLineRunner
@Component
@Order(value = 11)
public class AgentApplicationRun implements CommandLineRunner {
@Override
public void run(String... strings) throws Exception {
}
}