Spring?Boot如何在加載bean時(shí)優(yōu)先選擇我
引言
Spring Boot 是當(dāng)前業(yè)界最受歡迎和廣泛使用的 Java Web 應(yīng)用開發(fā)框架之一。在 Spring Boot 應(yīng)用中,bean
是通過自動(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 注解來實(shí)現(xiàn)。當(dāng)指定多個(gè) bean 時(shí),可以使用逗號(hào)來分隔。
使用方法如下:
(1) 在使用 @Component 注解的類中,使用 @DependsOn 注解來明確指定 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 接口來確保這些 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 來覆蓋先前聲明的 bean。
- 可以在所有 bean 上使用 @Order 注解或?qū)崿F(xiàn) Ordered 接口來實(shí)現(xiàn) bean 的排序。
- 使用多個(gè)技術(shù)棧時(shí),可以混合使用這些技術(shù)棧來達(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)文章
SpringBoot中API接口參數(shù)獲取方式小結(jié)
在Spring Boot中,API接口參數(shù)可以通過多種方式獲取,具體取決于你定義的API接口參數(shù)類型(如路徑參數(shù)、查詢參數(shù)、請(qǐng)求體參數(shù)、請(qǐng)求頭等),本文給大家就介紹了一些常見的參數(shù)獲取方式,需要的朋友可以參考下2024-06-06MyBatis-Plus如何最優(yōu)雅最簡(jiǎn)潔地完成數(shù)據(jù)庫(kù)操作
Mybatis-Plus是一個(gè)?Mybatis?的增強(qiáng)工具,在?Mybatis?的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于MyBatis-Plus如何最優(yōu)雅最簡(jiǎn)潔地完成數(shù)據(jù)庫(kù)操作的相關(guān)資料,需要的朋友可以參考下2022-03-03Eclipse下編寫java程序突然不會(huì)自動(dòng)生成R.java文件和包的解決辦法
這篇文章主要介紹了Eclipse下編寫java程序突然不會(huì)自動(dòng)生成R.java文件和包的解決辦法 的相關(guān)資料,需要的朋友可以參考下2016-01-01Spring Cloud升級(jí)最新Finchley版本的所有坑
這篇文章主要介紹了Spring Cloud升級(jí)最新Finchley版本的所有坑,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08如何基于Idea遠(yuǎn)程調(diào)試tomcat war包及jar包
這篇文章主要介紹了如何基于Idea遠(yuǎn)程調(diào)試tomcat war包及jar包,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08SpringCloud微服務(wù)之Config知識(shí)總結(jié)
今天帶大家學(xué)習(xí)SpringCloud微服務(wù)中的Config的相關(guān)知識(shí),文中有非常詳細(xì)的介紹,對(duì)正在學(xué)習(xí)SpringCloud微服務(wù)的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05解決mybatis-plus3.1.1版本使用lambda表達(dá)式查詢報(bào)錯(cuò)的方法
這篇文章主要介紹了解決mybatis-plus3.1.1版本使用lambda表達(dá)式查詢報(bào)錯(cuò)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08JavaScript中HTML元素操作的實(shí)現(xiàn)
本文主要介紹了JavaScript中HTML元素操作的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06