Spring?Boot如何在加載bean時(shí)優(yōu)先選擇我
引言
Spring Boot 是當(dāng)前業(yè)界最受歡迎和廣泛使用的 Java Web 應(yīng)用開發(fā)框架之一。在 Spring Boot 應(yīng)用中,bean
是通過(guò)自動(dòng)配置進(jìn)行裝載的,因?yàn)槠浒凑占s定順序位置,Spring Boot
希望盡可能提供正確的自動(dòng)配置,在應(yīng)用運(yùn)行時(shí)重寫或自定義擴(kuò)展。這樣,bean
的優(yōu)先級(jí)可以在應(yīng)用程序的所有層次結(jié)構(gòu)中管理。如果我們需要在應(yīng)用程序啟動(dòng)時(shí)優(yōu)先加載某些 bean,那么本文就是為大家詳細(xì)介紹如何實(shí)現(xiàn)。
一、適用場(chǎng)景
- 如果我們需要在應(yīng)用程序的所有層次結(jié)構(gòu)中對(duì)特定 bean 的啟動(dòng)順序進(jìn)行管理。例如,需要在應(yīng)用程序啟動(dòng)的時(shí)候初始化某個(gè)bean。
- 如果我們公共庫(kù)中的 bean 被其他開發(fā)者服務(wù)用到,但是他們需要在部分場(chǎng)景下自定義 bean,則我們需要在這些自定義的 bean前面先加載公共庫(kù)中的 bean。
二、三種實(shí)現(xiàn)方式
在 Spring Boot 應(yīng)用程序中,我們可以采取以下三種方式實(shí)現(xiàn)自己的 bean 優(yōu)先加載:
1. @Configuration 注解 + @DependsOn 注解
@Configuration 注解在 Spring Boot 應(yīng)用程序中聲明 bean 并允許我們指定 bean 的優(yōu)先級(jí)。然后,我們可以使用 @DependsOn 注解明確地告訴 Spring 容器這些 bean 應(yīng)該在應(yīng)用程序的哪一階段被加載。
使用方法如下:
(1) 聲明 @Configuration 注解以及使用 @DependsOn 注解并且確保引用的 bean 已經(jīng)存在(可以是其他的 bean 或配置類)。
@Configuration
@DependsOn("myOrderBean")
public class MyOrderedBeanConfig {
// 配置類內(nèi)普通Bean
@Bean
public MyBean myBean() {
return new MyBean();
}
}(2) 將 @Configuration 注解引入到 Spring Boot 應(yīng)用程序中,以便在應(yīng)用程序啟動(dòng)時(shí)執(zhí)行。
@SpringBootApplication
@Import(MyOrderedBeanConfig.class)
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}2. @Component 注解 + @DependsOn 注解
@Component 注解是最快速的聲明 bean 的方法之一,并允許我們指定 bean 的名稱。如果我們希望已有的 bean 在應(yīng)用程序啟動(dòng)時(shí)首先被加載,那么我們可以使用 @DependsOn 注解來(lái)實(shí)現(xiàn)。當(dāng)指定多個(gè) bean 時(shí),可以使用逗號(hào)來(lái)分隔。
使用方法如下:
(1) 在使用 @Component 注解的類中,使用 @DependsOn 注解來(lái)明確指定 bean 的加載順序。
@Component("myBean")
@DependsOn({"bean1", "bean2"})
public class MyBean {
// ...
}(2) 將 @Component 注解引入到 Spring Boot 應(yīng)用程序中,以便在應(yīng)用程序啟動(dòng)時(shí)執(zhí)行。
@SpringBootApplication
@ComponentScan(basePackages = "com.example.demo")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}3. 實(shí)現(xiàn) PriorityOrdered 接口
實(shí)現(xiàn) PriorityOrdered 接口并實(shí)現(xiàn) getOrder() 方法可以使我們控制 bean 的加載順序。最后,我們可以使用 BeanPostProcessor 接口來(lái)確保這些 bean 第一次生成時(shí)被加載。
使用方法如下:
(1) 實(shí)現(xiàn) PriorityOrdered 接口,并使用 getOrder() 方法返回一個(gè)正整數(shù)以指定 bean 的優(yōu)先級(jí)。該數(shù)值越小,優(yōu)先級(jí)越高。
public class MyBean implements InitializingBean, PriorityOrdered {
public void afterPropertiesSet() {
// ...
}
public int getOrder() {
return 0; // 這個(gè)值將確保此 bean 被最先加載
}
}(2) 提供 BeanPostProcessor 實(shí)例,并用 @Order 注解指定順序。在 Spring 容器的生命周期中,此實(shí)例將在所有常規(guī) bean 之前執(zhí)行。
@Component
@Order(value = 1)
public class MyBeanPostProcessor implements BeanPostProcessor {
// ...
}(3) 將 @ComponentScan 注解引入到 Spring Boot 應(yīng)用程序中,以便在應(yīng)用程序啟動(dòng)時(shí)執(zhí)行。
@SpringBootApplication
@ComponentScan(basePackages = {"com.example.demo"})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}注意事項(xiàng)
- 在應(yīng)用程序中使用上述方式之一都能夠幫助您管理 bean 的優(yōu)先級(jí),但這并不意味著其優(yōu)先級(jí)不會(huì)被其他 bean 覆蓋。
- 如果想覆蓋先前聲明的 bean,可以使用相應(yīng)技術(shù)棧的高優(yōu)先級(jí) bean 來(lái)覆蓋先前聲明的 bean。
- 可以在所有 bean 上使用 @Order 注解或?qū)崿F(xiàn) Ordered 接口來(lái)實(shí)現(xiàn) bean 的排序。
- 使用多個(gè)技術(shù)棧時(shí),可以混合使用這些技術(shù)棧來(lái)達(dá)到目的。
三、參考資料
Spring Boot 官方文檔: Controlling Startup Behaviour of Spring BootApplication
Spring 官方文檔: Prioritized Bean Applicatons
Medium: Order execution with Spring Boot
Baeldung: Bean Order in Spring
到此這篇關(guān)于Spring Boot如何在加載bean時(shí)優(yōu)先選擇我?的文章就介紹到這了,更多相關(guān)springboot加載bean優(yōu)先選擇我內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis-Plus saveBatch()批量保存失效的解決
本文主要介紹了Mybatis-Plus saveBatch()批量保存失效的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
SpringBoot之bootstrap和application的區(qū)別解讀
這篇文章主要介紹了SpringBoot之bootstrap和application的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
springMVC4之強(qiáng)大類型轉(zhuǎn)換器實(shí)例解析
本篇文章主要介紹了springMVC4之強(qiáng)大類型轉(zhuǎn)換器實(shí)例解析,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
Java獲取環(huán)境變量(System.getenv)的方法
本文主要介紹了Java獲取環(huán)境變量(System.getenv)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
使用proguard對(duì)maven構(gòu)建的springboot項(xiàng)目進(jìn)行混淆方式
文章介紹了如何使用ProGuard對(duì)Maven構(gòu)建的Spring Boot項(xiàng)目進(jìn)行混淆,并解決混淆后可能遇到的版本兼容性問(wèn)題和類名沖突問(wèn)題,主要步驟包括下載高版本的ProGuard、配置POM文件、添加ProGuard配置文件、修改Spring Boot啟動(dòng)文件以避免類名沖突2024-11-11
spring-boot實(shí)現(xiàn)增加自定義filter(新)
本篇文章主要介紹了spring-boot實(shí)現(xiàn)增加自定義filter(新),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
springboot封裝JsonUtil,CookieUtil工具類代碼實(shí)例
這篇文章主要介紹了springboot封裝JsonUtil,CookieUtil工具類過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Java 數(shù)據(jù)結(jié)構(gòu)之刪除鏈表中重復(fù)的結(jié)點(diǎn)
在一個(gè)排序的鏈表中,會(huì)存在重復(fù)的結(jié)點(diǎn),如何實(shí)現(xiàn)刪除該鏈表中重復(fù)的結(jié)點(diǎn),重復(fù)的結(jié)點(diǎn)不保留,并返回鏈表頭指針呢?接下來(lái)小編將帶你詳細(xì)介紹2021-12-12

