前言
上一篇我們著重按照分類講解了一下Spring Boot的常見擴(kuò)展點(diǎn),接下來我們講解一下Spring Boot 的應(yīng)用程序生命周期擴(kuò)展點(diǎn)的一些妙用。
Spring Boot的應(yīng)用程序生命周期擴(kuò)展點(diǎn)是一些接口,可以讓開發(fā)者在應(yīng)用程序的不同生命周期階段插入自己的邏輯。這些擴(kuò)展點(diǎn)可以幫助開發(fā)者在應(yīng)用程序啟動、關(guān)閉、重啟等階段執(zhí)行一些額外的操作。
下面介紹幾個常用的應(yīng)用程序生命周期擴(kuò)展點(diǎn):
-
ApplicationRunner和CommandLineRunner:這兩個接口可以在應(yīng)用程序啟動完成后執(zhí)行一些初始化的操作。例如,你可以實(shí)現(xiàn)一個ApplicationRunner來初始化數(shù)據(jù)庫連接池,或者實(shí)現(xiàn)一個CommandLineRunner來加載一些初始化數(shù)據(jù)。
-
ApplicationPreparedEvent:這個事件在應(yīng)用程序準(zhǔn)備啟動時(shí)觸發(fā),可以在其中執(zhí)行一些準(zhǔn)備工作。例如,你可以監(jiān)聽這個事件,然后在應(yīng)用程序啟動之前執(zhí)行一些配置文件的加載操作。
-
ApplicationStartedEvent:這個事件在應(yīng)用程序開始啟動時(shí)觸發(fā),可以在其中執(zhí)行一些初始化的操作。例如,你可以監(jiān)聽這個事件,然后在應(yīng)用程序啟動之前執(zhí)行一些初始化的邏輯。
-
ApplicationReadyEvent:這個事件在應(yīng)用程序完全啟動后觸發(fā),可以在其中執(zhí)行一些額外的初始化操作。例如,你可以監(jiān)聽這個事件,然后在應(yīng)用程序啟動之后執(zhí)行一些數(shù)據(jù)緩存的加載操作。
-
ApplicationFailedEvent:這個事件在應(yīng)用程序啟動失敗時(shí)觸發(fā),可以在其中執(zhí)行一些錯誤處理的邏輯。例如,你可以監(jiān)聽這個事件,然后在應(yīng)用程序啟動失敗時(shí)發(fā)送一封錯誤報(bào)告郵件。
通過實(shí)現(xiàn)這些擴(kuò)展點(diǎn),你可以在應(yīng)用程序的不同生命周期階段插入自己的邏輯,并且可以方便地?cái)U(kuò)展和定制應(yīng)用程序的行為。這些擴(kuò)展點(diǎn)的使用可以幫助你更好地管理和控制應(yīng)用程序的生命周期,提高應(yīng)用程序的可靠性和可維護(hù)性。
還是那句老話,這個不是八股文,只有知道才遇到相似場景的才能知道怎么用。學(xué)以致用,是我們分享內(nèi)容的不變的宗旨
。
冰點(diǎn)出品,必屬精品
1. 應(yīng)用程序生命周期擴(kuò)展點(diǎn)
應(yīng)用程序生命周期擴(kuò)展點(diǎn)是指在Spring Boot應(yīng)用程序的生命周期中,提供了一系列的擴(kuò)展點(diǎn),開發(fā)人員可以通過實(shí)現(xiàn)這些擴(kuò)展點(diǎn)來對應(yīng)用程序的生命周期進(jìn)行控制和定制。這些擴(kuò)展點(diǎn)主要包括以下幾個:
此圖來自網(wǎng)絡(luò)
2. 使用場景示例
2.1 SpringApplicationRunListener
它是一個監(jiān)聽器接口,用于在Spring應(yīng)用程序的運(yùn)行生命周期中監(jiān)聽和響應(yīng)相關(guān)事件??梢酝ㄟ^實(shí)現(xiàn)該接口來自定義應(yīng)用程序的啟動和關(guān)閉行為。
好的,讓我們來看一個使用SpringApplicationRunListener的例子。
假設(shè)你正在開發(fā)一個在線學(xué)習(xí)平臺的后端系統(tǒng)。在應(yīng)用程序啟動時(shí),你想要執(zhí)行一些特定的操作,例如加載配置文件、初始化數(shù)據(jù)庫連接等。這時(shí)候,你可以使用SpringApplicationRunListener來監(jiān)聽?wèi)?yīng)用程序的啟動事件,并在事件觸發(fā)時(shí)執(zhí)行這些操作。
首先,需要創(chuàng)建一個名為CustomSpringApplicationRunListener的類,實(shí)現(xiàn)SpringApplicationRunListener接口,并重寫相應(yīng)的方法。CustomSpringApplicationRunListener類實(shí)現(xiàn)了SpringApplicationRunListener接口的各個方法。你可以根據(jù)需要在這些方法中執(zhí)行特定的操作。例如,在starting方法中,你可以執(zhí)行啟動前的操作,如加載配置文件;在started方法中,你可以執(zhí)行應(yīng)用程序已啟動的操作,如啟動后臺任務(wù)等。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.SpringApplicationRunListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
public class CustomSpringApplicationRunListener implements SpringApplicationRunListener {
public CustomSpringApplicationRunListener(SpringApplication application, String[] args) {
}
@Override
public void starting() {
System.out.println("Application starting...");
// 執(zhí)行啟動前的操作,如加載配置文件等
}
@Override
public void environmentPrepared(ConfigurableEnvironment environment) {
System.out.println("Environment prepared...");
// 執(zhí)行環(huán)境準(zhǔn)備的操作,如設(shè)置環(huán)境變量等
}
@Override
public void contextPrepared(ConfigurableApplicationContext context) {
System.out.println("Context prepared...");
// 執(zhí)行上下文準(zhǔn)備的操作,如初始化數(shù)據(jù)庫連接等
}
@Override
public void contextLoaded(ConfigurableApplicationContext context) {
System.out.println("Context loaded...");
// 執(zhí)行上下文加載的操作,如配置Bean等
}
@Override
public void started(ConfigurableApplicationContext context) {
System.out.println("Application started...");
// 執(zhí)行應(yīng)用程序已啟動的操作,如啟動后臺任務(wù)等
}
@Override
public void running(ConfigurableApplicationContext context) {
System.out.println("Application running...");
// 執(zhí)行應(yīng)用程序運(yùn)行的操作,如執(zhí)行定時(shí)任務(wù)等
}
@Override
public void failed(ConfigurableApplicationContext context, Throwable exception) {
System.out.println("Application failed to start...");
// 執(zhí)行應(yīng)用程序啟動失敗的操作,如記錄錯誤日志等
}
}
接下來,需要在應(yīng)用程序的META-INF
目錄下創(chuàng)建一個名為spring.factories
的文件,并在其中配置CustomSpringApplicationRunListener
類。
org.springframework.boot.SpringApplicationRunListener=com.example.CustomSpringApplicationRunListener
這樣,當(dāng)你的應(yīng)用程序啟動時(shí),Spring Boot將會自動創(chuàng)建CustomSpringApplicationRunListener
實(shí)例,并在適當(dāng)?shù)臅r(shí)機(jī)調(diào)用對應(yīng)的方法。
這只是一個簡單的例子,展示了如何使用SpringApplicationRunListener接口來監(jiān)聽?wèi)?yīng)用程序的啟動事件,并在事件觸發(fā)時(shí)執(zhí)行特定的操作 。實(shí)際項(xiàng)目可能需要考慮的問題更多,比如加載順序,依賴關(guān)系等等。
2.2 ApplicationEnvironmentPreparedEvent
該事件在應(yīng)用程序啟動前觸發(fā),用于在環(huán)境準(zhǔn)備階段執(zhí)行一些操作,例如:加載配置文件、設(shè)置系統(tǒng)屬性等。
當(dāng)應(yīng)用程序的環(huán)境準(zhǔn)備就緒時(shí),可以使用ApplicationEnvironmentPreparedEvent來執(zhí)行某些操作。例如,假設(shè)你正在開發(fā)一個基于Spring Boot的社交媒體應(yīng)用程序,你可以使用這個事件來加載特定環(huán)境的配置文件,以便根據(jù)不同的環(huán)境配置進(jìn)行不同的操作。
在這個例子中,我們可以通過創(chuàng)建一個實(shí)現(xiàn)了ApplicationListener接口的類來監(jiān)聽ApplicationEnvironmentPreparedEvent事件。然后在onApplicationEvent方法中,我們可以根據(jù)當(dāng)前的環(huán)境配置加載不同的配置文件??赡芘e的事例不是很合理,大家能夠理解就OK。
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.context.ApplicationListener;
public class EnvironmentPreparedListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {
@Override
public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
String environment = event.getEnvironment().getActiveProfiles()[0];
// 根據(jù)環(huán)境配置加載不同的配置文件
if (environment.equals("dev")) {
// 加載dev環(huán)境的配置文件
} else if (environment.equals("prod")) {
// 加載prod環(huán)境的配置文件
} else if (environment.equals("windows")) {
// 加載prod環(huán)境的配置文件
} else if (environment.equals("linux")) {
// 加載prod環(huán)境的配置文件
}
// 執(zhí)行其他操作
}
}
在Spring Boot應(yīng)用程序的入口類中,我們可以將這個監(jiān)聽器注冊到Spring容器中:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SocialMediaApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(SocialMediaApplication.class);
application.addListeners(new EnvironmentPreparedListener());
application.run(args);
}
}
這樣,當(dāng)應(yīng)用程序的環(huán)境準(zhǔn)備就緒時(shí),EnvironmentPreparedListener中的onApplicationEvent方法將會被觸發(fā),你可以在該方法中執(zhí)行一些特定于環(huán)境配置的操作,例如加載特定的配置文件。這在開發(fā)和部署應(yīng)用程序時(shí)非常有用,可以根據(jù)不同的環(huán)境配置進(jìn)行不同的初始化操作。
2.3 ApplicationPreparedEvent
該事件在應(yīng)用程序上下文創(chuàng)建完成后觸發(fā),用于在應(yīng)用程序準(zhǔn)備階段執(zhí)行一些操作,例如:創(chuàng)建和初始化Bean等。
好的,我可以舉一個使用ApplicationPreparedEvent的例子。
假設(shè)你正在開發(fā)一個電子商務(wù)網(wǎng)站的后端系統(tǒng),當(dāng)應(yīng)用程序啟動時(shí),你希望自動初始化一些商戶數(shù)據(jù)到緩存中。
首先,你需要創(chuàng)建一個實(shí)現(xiàn)ApplicationListener接口的類,用于監(jiān)聽ApplicationPreparedEvent事件。例如,你可以創(chuàng)建一個名為DataInitializationListener的類:
import org.springframework.boot.context.event.ApplicationPreparedEvent;
import org.springframework.context.ApplicationListener;
public class DataInitializationListener implements ApplicationListener<ApplicationPreparedEvent> {
@Override
public void onApplicationEvent(ApplicationPreparedEvent event) {
// 在應(yīng)用程序準(zhǔn)備階段執(zhí)行初始化數(shù)據(jù)的操作
initializeData();
}
private void initializeData() {
// 在這里執(zhí)行初始化數(shù)據(jù)的邏輯,例如將商戶數(shù)據(jù)加載到緩存中去
// ...
}
}
然后,在你的Spring Boot應(yīng)用程序的主類中,將DataInitializationListener注冊為一個bean,以便在應(yīng)用程序啟動時(shí)被自動調(diào)用:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class YourApplication {
public static void main(String[] args) {
SpringApplication.run(YourApplication.class, args);
}
@Bean
public DataInitializationListener dataInitializationListener() {
return new DataInitializationListener();
}
}
現(xiàn)在, 運(yùn)行應(yīng)用程序時(shí),DataInitializationListener將會監(jiān)聽ApplicationPreparedEvent事件,并在應(yīng)用程序準(zhǔn)備階段執(zhí)行initializeData方法,從而實(shí)現(xiàn)自動初始化商戶數(shù)據(jù)的功能。
ApplicationPreparedEvent事件是在應(yīng)用程序準(zhǔn)備階段觸發(fā)的,該階段是在ApplicationContext創(chuàng)建之前,但已經(jīng)加載了bean定義。因此,你可以在該事件中執(zhí)行與應(yīng)用程序初始化相關(guān)的操作。
2.4 ApplicationStartedEvent
該事件在應(yīng)用程序啟動完成后觸發(fā),用于在應(yīng)用程序啟動后執(zhí)行一些操作,例如:向日志中輸出啟動信息等。
2.5 ApplicationReadyEvent
該事件在應(yīng)用程序準(zhǔn)備就緒后觸發(fā),用于在應(yīng)用程序運(yùn)行期間執(zhí)行一些操作,例如:啟動定時(shí)任務(wù)、初始化緩存等。
2.6 ApplicationFailedEvent
該事件在應(yīng)用程序啟動失敗后觸發(fā),用于在應(yīng)用程序啟動失敗時(shí)執(zhí)行一些操作,例如:記錄日志、發(fā)送告警等。
當(dāng)應(yīng)用程序啟動失敗時(shí),可以使用ApplicationFailedEvent事件來發(fā)送通知或記錄日志,以便進(jìn)行故障排查和問題解決。例如,假設(shè)我們的應(yīng)用程序依賴于數(shù)據(jù)庫連接,如果數(shù)據(jù)庫連接失敗導(dǎo)致應(yīng)用程序無法啟動,我們可以創(chuàng)建一個監(jiān)聽器類來處理這種情況。下面是一個簡單的例子:
創(chuàng)建一個實(shí)現(xiàn)ApplicationListener接口的監(jiān)聽器類,例如ApplicationFailedListener:
import org.springframework.boot.context.event.ApplicationFailedEvent;
import org.springframework.context.ApplicationListener;
public class ApplicationFailedListener implements ApplicationListener<ApplicationFailedEvent> {
@Override
public void onApplicationEvent(ApplicationFailedEvent event) {
// 獲取失敗的異常信息
Throwable throwable = event.getException();
// 發(fā)送通知或記錄日志,進(jìn)行故障排查和問題解決
System.out.println("應(yīng)用程序啟動失敗:" + throwable.getMessage());
}
}
然后,在Spring Boot應(yīng)用程序的入口類中,將該監(jiān)聽器類注冊為一個Bean:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
// 其他應(yīng)用程序邏輯
}
@Bean
public ApplicationFailedListener applicationFailedListener() {
return new ApplicationFailedListener();
}
}
現(xiàn)在,當(dāng)應(yīng)用程序啟動失敗時(shí),ApplicationFailedListener監(jiān)聽器中的onApplicationEvent方法將被調(diào)用,并打印出失敗的異常信息。
這個例子只是一個簡單的示例,你可以根據(jù)實(shí)際需求進(jìn)行擴(kuò)展和定制化。你可以根據(jù)具體的業(yè)務(wù)場景,使用該事件來發(fā)送郵件、短信通知、記錄日志或進(jìn)行其他故障處理操作。
2.7 ApplicationRunner
可以利用ApplicationRunner接口來執(zhí)行一些應(yīng)用程序啟動后的初始化任務(wù)。
@Component
public class MyApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
// 在應(yīng)用程序啟動后執(zhí)行的任務(wù)
System.out.println("應(yīng)用程序啟動后執(zhí)行的任務(wù)");
// 可以在這里執(zhí)行一些初始化操作,如加載配置文件、初始化數(shù)據(jù)庫連接等
}
}
我們創(chuàng)建了一個名為MyApplicationRunner的類,并實(shí)現(xiàn)了ApplicationRunner接口。在類中,我們重寫了run方法,該方法會在應(yīng)用程序啟動后被自動調(diào)用。在run方法中,可以編寫需要在應(yīng)用程序啟動后執(zhí)行的任務(wù)。例如,可以在這里加載配置文件、初始化數(shù)據(jù)庫連接、創(chuàng)建一些初始數(shù)據(jù)等。
要讓Spring Boot應(yīng)用程序自動執(zhí)行該任務(wù),需要將MyApplicationRunner類注解為一個@Component或者@Service等Spring Bean,并將其注冊到Spring容器中。這樣,當(dāng)應(yīng)用程序啟動時(shí),Spring Boot會自動調(diào)用MyApplicationRunner的run方法。
這樣 也就可以利用ApplicationRunner接口來執(zhí)行一些應(yīng)用程序啟動后的初始化任務(wù)。
3. 參考文檔
- Spring Boot官方文檔:https://spring.io/projects/spring-boot
- Spring Boot Reference Guide:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/
- Spring Boot官方文檔相關(guān) https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-customizing-bean-definitions
- Spring Boot 自動配置 https://docs.spring.io/spring-boot/docs/3.1.2/reference/html/auto-configuration-classes.html#appendix.auto-configuration-classes
文章來源:http://www.zghlxwxcb.cn/news/detail-618067.html
??好了,本次的Spring Boot 的擴(kuò)展點(diǎn)分享就到這兒,我是冰點(diǎn),下次見。如果我的文章對你有所收獲,可以給個贊。如果有疑問可以在評論區(qū)留言。
文章來源地址http://www.zghlxwxcb.cn/news/detail-618067.html
到了這里,關(guān)于Spring Boot 應(yīng)用程序生命周期擴(kuò)展點(diǎn)妙用的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!