Spring?Boot如何在加載bean時優(yōu)先選擇我
引言
Spring Boot 是當(dāng)前業(yè)界最受歡迎和廣泛使用的 Java Web 應(yīng)用開發(fā)框架之一。在 Spring Boot 應(yīng)用中,bean
是通過自動配置進行裝載的,因為其按照約定順序位置,Spring Boot
希望盡可能提供正確的自動配置,在應(yīng)用運行時重寫或自定義擴展。這樣,bean
的優(yōu)先級可以在應(yīng)用程序的所有層次結(jié)構(gòu)中管理。如果我們需要在應(yīng)用程序啟動時優(yōu)先加載某些 bean,那么本文就是為大家詳細介紹如何實現(xiàn)。
一、適用場景
- 如果我們需要在應(yīng)用程序的所有層次結(jié)構(gòu)中對特定 bean 的啟動順序進行管理。例如,需要在應(yīng)用程序啟動的時候初始化某個bean。
- 如果我們公共庫中的 bean 被其他開發(fā)者服務(wù)用到,但是他們需要在部分場景下自定義 bean,則我們需要在這些自定義的 bean前面先加載公共庫中的 bean。
二、三種實現(xiàn)方式
在 Spring Boot 應(yīng)用程序中,我們可以采取以下三種方式實現(xiàn)自己的 bean 優(yōu)先加載:
1. @Configuration 注解 + @DependsOn 注解
@Configuration 注解在 Spring Boot 應(yīng)用程序中聲明 bean 并允許我們指定 bean 的優(yōu)先級。然后,我們可以使用 @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)用程序啟動時執(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)用程序啟動時首先被加載,那么我們可以使用 @DependsOn 注解來實現(xiàn)。當(dāng)指定多個 bean 時,可以使用逗號來分隔。
使用方法如下:
(1) 在使用 @Component 注解的類中,使用 @DependsOn 注解來明確指定 bean 的加載順序。
@Component("myBean")
@DependsOn({"bean1", "bean2"})
public class MyBean {
// ...
}(2) 將 @Component 注解引入到 Spring Boot 應(yīng)用程序中,以便在應(yīng)用程序啟動時執(zhí)行。
@SpringBootApplication
@ComponentScan(basePackages = "com.example.demo")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}3. 實現(xiàn) PriorityOrdered 接口
實現(xiàn) PriorityOrdered 接口并實現(xiàn) getOrder() 方法可以使我們控制 bean 的加載順序。最后,我們可以使用 BeanPostProcessor 接口來確保這些 bean 第一次生成時被加載。
使用方法如下:
(1) 實現(xiàn) PriorityOrdered 接口,并使用 getOrder() 方法返回一個正整數(shù)以指定 bean 的優(yōu)先級。該數(shù)值越小,優(yōu)先級越高。
public class MyBean implements InitializingBean, PriorityOrdered {
public void afterPropertiesSet() {
// ...
}
public int getOrder() {
return 0; // 這個值將確保此 bean 被最先加載
}
}(2) 提供 BeanPostProcessor 實例,并用 @Order 注解指定順序。在 Spring 容器的生命周期中,此實例將在所有常規(guī) bean 之前執(zhí)行。
@Component
@Order(value = 1)
public class MyBeanPostProcessor implements BeanPostProcessor {
// ...
}(3) 將 @ComponentScan 注解引入到 Spring Boot 應(yīng)用程序中,以便在應(yīng)用程序啟動時執(zhí)行。
@SpringBootApplication
@ComponentScan(basePackages = {"com.example.demo"})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}注意事項
- 在應(yīng)用程序中使用上述方式之一都能夠幫助您管理 bean 的優(yōu)先級,但這并不意味著其優(yōu)先級不會被其他 bean 覆蓋。
- 如果想覆蓋先前聲明的 bean,可以使用相應(yīng)技術(shù)棧的高優(yōu)先級 bean 來覆蓋先前聲明的 bean。
- 可以在所有 bean 上使用 @Order 注解或?qū)崿F(xiàn) Ordered 接口來實現(xiàn) bean 的排序。
- 使用多個技術(shù)棧時,可以混合使用這些技術(shù)棧來達到目的。
三、參考資料
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時優(yōu)先選擇我?的文章就介紹到這了,更多相關(guān)springboot加載bean優(yōu)先選擇我內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中API接口參數(shù)獲取方式小結(jié)
在Spring Boot中,API接口參數(shù)可以通過多種方式獲取,具體取決于你定義的API接口參數(shù)類型(如路徑參數(shù)、查詢參數(shù)、請求體參數(shù)、請求頭等),本文給大家就介紹了一些常見的參數(shù)獲取方式,需要的朋友可以參考下2024-06-06
MyBatis-Plus如何最優(yōu)雅最簡潔地完成數(shù)據(jù)庫操作
Mybatis-Plus是一個?Mybatis?的增強工具,在?Mybatis?的基礎(chǔ)上只做增強不做改變,為簡化開發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于MyBatis-Plus如何最優(yōu)雅最簡潔地完成數(shù)據(jù)庫操作的相關(guān)資料,需要的朋友可以參考下2022-03-03
Eclipse下編寫java程序突然不會自動生成R.java文件和包的解決辦法
這篇文章主要介紹了Eclipse下編寫java程序突然不會自動生成R.java文件和包的解決辦法 的相關(guān)資料,需要的朋友可以參考下2016-01-01
Spring Cloud升級最新Finchley版本的所有坑
這篇文章主要介紹了Spring Cloud升級最新Finchley版本的所有坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08
如何基于Idea遠程調(diào)試tomcat war包及jar包
這篇文章主要介紹了如何基于Idea遠程調(diào)試tomcat war包及jar包,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08
SpringCloud微服務(wù)之Config知識總結(jié)
今天帶大家學(xué)習(xí)SpringCloud微服務(wù)中的Config的相關(guān)知識,文中有非常詳細的介紹,對正在學(xué)習(xí)SpringCloud微服務(wù)的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05
解決mybatis-plus3.1.1版本使用lambda表達式查詢報錯的方法
這篇文章主要介紹了解決mybatis-plus3.1.1版本使用lambda表達式查詢報錯的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

