Springboot啟動執(zhí)行特定代碼的方式匯總
實現(xiàn)InitializingBean接口或使用@PostConstruct注解
實現(xiàn)InitializingBean如下
public class AnotherExampleBean implements InitializingBean {
@Override
public void afterPropertiesSet() {
// 做一些初始化的工作
}
}
官方對其的解釋是這樣的:實現(xiàn)這個接口會讓這個bean的所有必要的屬性都被容器注入后(依賴注入),再去執(zhí)行afterPropertiesSet()里的方法。
筆者再用一個簡單的例子去實際演示一下(注意:使用@PostConstruct和實現(xiàn)接口是等價的,可以二選一)
我們在init方法上使用了@PostConstruct注解,并且方法里使用到了Chicken類,而這個Chicken類是通過依賴注入來設(shè)置的,所以印證了官方說的話,會在依賴注入完以后才會調(diào)用@PostConstruct注解的方法。那為什么不在構(gòu)造器里往List里面方Chicken類呢,因為容器調(diào)用構(gòu)造器方法的時候,Chicken類還沒被注入,所以要寫在@PostConstruct注解的方法里。
// 首先聲明一個實體類
@Data
public class Chicken {
private String name ;
}
// 將他注入容器
@Configuration
public class UserConfig {
@Bean
public Chicken putUser(){
Chicken chinken = new Chicken();
chinken.setName("普通雞塊");
return chinken;
}
}
// 在family 類中調(diào)用 注入chinken
@Component
public class Family {
@Resource
Chicken chicken;
public static List<String> names;
@PostConstruct
public void init(){
names.add(chicken.getName());
}
public Family() {
names = new LinkedList<>();
}
}

實現(xiàn)ApplicationListener接口
如果一個容器里的bean實現(xiàn)了ApplicationListener接口,那么在任何時候,如果有ApplicationEvent(事件)在ApplicationContext(容器)中被發(fā)布,該bean會收到通知,從而可以執(zhí)行相應策略。
下面是Spring提供的幾種常用的ApplicationEvent事件
| 事件名稱 | 解釋 |
|---|---|
| ContextRefreshedEvent | 當容器ApplicationContext容器正在初始化或refreshed時會發(fā)布這個事件。這里的初始化意味著所有的bean都被加載,并且有后置處理的bean都被檢測到并激活了。 |
| ContextStartedEvent | 當容器啟動調(diào)用start()方法是會發(fā)布這個事件,這里的開始是所有生命周期的bean都收到了一個開始的信號 |
| ContextStoppedEvent | 當容器調(diào)用stop方法時會發(fā)布這個事件 |
舉一個簡單的例子,下面的代碼我實現(xiàn)ApplicationListener接口并監(jiān)聽ContextRefreshedEvent事件,所以當springboot啟動并且初始化完成后,就能執(zhí)行下面的方法了。
@Component
@Slf4j
public class MenuManage implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
//做一些事情
}
}
實現(xiàn)CommandLineRunner或ApplicationRunner 接口
實現(xiàn)了CommandLineRunner的bean會被springboot監(jiān)測到,并在項目啟動后執(zhí)行run方法,如果有多個bean實現(xiàn)了CommandLineRunner接口,那么可以使用order注解來指定執(zhí)行順序。
@Order(2)
@Component
public class ServerStartedReport implements CommandLineRunner{
@Override
public void run(String... args) throws Exception {
//do something
}
}
而實現(xiàn)ApplicationRunner接口與實現(xiàn)CommandLineRunner的唯一不同是,后者接收的參數(shù)是main方法傳進去的原始參數(shù),而ApplicationRunner接收的參數(shù)是封裝過原始參數(shù)的,可以通過參數(shù)名字name來獲取指定的參數(shù)。
@Component
public class MyApplicationRunner implements ApplicationRunner{
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("ApplicationRunner:"+ Arrays.asList(args.getSourceArgs()));
System.out.println("getOptionNames:"+args.getOptionNames());
System.out.println("getOptionValues:"+args.getOptionValues("foo"));
System.out.println("getOptionValues:"+args.getOptionValues("log"));
}
}
到此這篇關(guān)于Springboot啟動執(zhí)行特定代碼的幾種方式的文章就介紹到這了,更多相關(guān)Springboot啟動執(zhí)行代碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解SpringBoot啟動項目后執(zhí)行方法的幾種方式
- SpringBoot項目啟動執(zhí)行任務(wù)的多種方法小結(jié)
- SpringBoot實現(xiàn)啟動項目后立即執(zhí)行的方法總結(jié)
- springboot項目啟動后執(zhí)行方法的三種方式
- Springboot啟動后立即某個執(zhí)行方法的四種方式
- SpringBoot啟動時自動執(zhí)行代碼的幾種實現(xiàn)方式
- springboot啟動前執(zhí)行方法的四種方式總結(jié)
- springboot 項目容器啟動后如何自動執(zhí)行指定方法
- Springboot項目啟動成功后可通過五種方式繼續(xù)執(zhí)行
相關(guān)文章
Java 單鏈表數(shù)據(jù)結(jié)構(gòu)的增刪改查教程
這篇文章主要介紹了Java 單鏈表數(shù)據(jù)結(jié)構(gòu)的增刪改查教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
Spring-cloud Config Server的3種配置方式
這篇文章主要介紹了Spring-cloud Config Server的3種配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
Java數(shù)據(jù)結(jié)構(gòu)之紅黑樹的原理及實現(xiàn)
紅黑樹是一種特殊的二叉查找樹,每個結(jié)點都要儲存位表示結(jié)點的顏色,或紅或黑。本文將通過示例為大家詳細講講紅黑樹的原理及Java實現(xiàn),感興趣的可以了解一下2022-09-09
Springboot項目使用html5的video標簽完成視頻播放功能
這篇文章主要介紹了Springboot項目使用html5的video標簽完成視頻播放功能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
SpringBoot在 POM 中引入本地 JAR 包的方法
在開發(fā) Spring Boot 應用程序時,您可能需要使用本地 JAR 包來添加自定義庫或功能,本文將介紹在 Spring Boot 項目的 POM 文件中如何引入本地 JAR 包,感興趣的朋友跟隨小編一起看看吧2023-08-08

