欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解Spring bean加載順序

 更新時間:2024年10月25日 10:16:26   作者:jeff-y  
在默認配置下,SpringBean的加載順序主要受到Bean定義順序、依賴關(guān)系和生命周期回調(diào)方法的影響,本文就來了解一下Spring bean加載順序,感興趣的同學可以學習

最近在開發(fā)過程中遇到一個Spring bean加載順序的問題,容器在啟動的時候 會通過InitializingBean 的afterPropertiesSet 加載兩級緩存,但是加載的過程中因為沒有將load的容器對象加載到Spring 容器中導(dǎo)致NPE ,所以今天來鞏固一下spring bean的加載順序會受那些影響

在默認配置下,Spring的Bean加載順序并不是隨機的,但也不是嚴格按某種預(yù)定順序進行的。默認情況下,Spring會按以下策略來加載和初始化Bean:

1. 加載順序的確定性

  • 配置順序:在Spring XML配置文件或Java配置類中定義的Bean,通常按照定義的順序加載。
  • 注解掃描順序:在使用組件掃描(例如@ComponentScan)時,Spring會按照類路徑掃描的順序加載Bean。但這個順序在不同的運行環(huán)境下可能有所不同,因為類路徑掃描的順序取決于文件系統(tǒng)或JAR包的排列方式。

2. 依賴關(guān)系的解析

Spring會在加載和初始化Bean時解析Bean之間的依賴關(guān)系,確保依賴的Bean先加載和初始化。這意味著如果Bean A依賴于Bean B,那么Bean B會先于Bean A加載和初始化。

3. Bean初始化順序

  • @DependsOn注解:可以使用@DependsOn注解明確指定一個Bean依賴于另外一個或多個Bean。這樣,被依賴的Bean會先初始化。
  • depends-on屬性:在XML配置中,可以使用depends-on屬性明確指定一個Bean依賴于另外一個或多個Bean。

4. FactoryBean

FactoryBean會優(yōu)先于普通Bean進行初始化,因為它們負責創(chuàng)建其他Bean的實例。

5. 生命周期回調(diào)方法

Spring會確保Bean按照以下順序進行生命周期回調(diào):

  • BeanPostProcessorpostProcessBeforeInitialization方法
  • 初始化回調(diào)(例如InitializingBeanafterPropertiesSet方法或自定義init-method
  • BeanPostProcessorpostProcessAfterInitialization方法

示例代碼和說明

以下是一些示例代碼,展示了不同情況下的Bean加載順序:

XML配置

<bean id="beanA" class="com.example.BeanA"/>
<bean id="beanB" class="com.example.BeanB" depends-on="beanA"/>

在這種情況下,beanA會先于beanB加載和初始化。

注解配置

@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
    @Bean
    @DependsOn("beanA")
    public BeanB beanB() {
        return new BeanB();
    }

    @Bean
    public BeanA beanA() {
        return new BeanA();
    }
}

在這種配置中,beanA會先于beanB加載和初始化,因為beanB使用了@DependsOn注解。

檢查Bean加載順序的代碼示例

為了演示Spring Bean加載的順序,我們可以編寫一個簡單的Spring應(yīng)用,并在Bean的構(gòu)造方法中打印日志:

@Component
public class BeanA {
    public BeanA() {
        System.out.println("BeanA instantiated");
    }
}

@Component
public class BeanB {
    public BeanB() {
        System.out.println("BeanB instantiated");
    }
}

@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        // Force initialization of beans
        context.getBean(BeanA.class);
        context.getBean(BeanB.class);
    }
}

在這個示例中,如果運行程序,控制臺輸出的順序?qū)砻鰾ean的加載順序。這種方式可以幫助我們驗證在不同配置和環(huán)境下Bean的加載順序。

總結(jié)

在默認配置下,Spring的Bean加載順序主要取決于Bean的定義順序、依賴關(guān)系和生命周期回調(diào)方法。雖然類路徑掃描的順序可能因運行環(huán)境而異,但通過使用@DependsOn注解和depends-on屬性,可以顯式控制Bean的加載和初始化順序。Spring并不會隨機改變Bean的加載順序,而是遵循上述策略確保Bean在合理的順序中加載和初始化。

到此這篇關(guān)于深入理解Spring bean加載順序的文章就介紹到這了,更多相關(guān)Spring bean加載順序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java從后臺重定向(redirect)到另一個項目的方法

    詳解Java從后臺重定向(redirect)到另一個項目的方法

    這篇文章主要介紹了詳解Java從后臺重定向(redirect)到另一個項目的方法,非常具有實用價值,需要的朋友可以參考下
    2017-04-04
  • SpringBoot @JsonDeserialize自定義Json序列化方式

    SpringBoot @JsonDeserialize自定義Json序列化方式

    這篇文章主要介紹了SpringBoot @JsonDeserialize自定義Json序列化方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • ibatis學習之搭建Java項目

    ibatis學習之搭建Java項目

    本文的主要內(nèi)容是簡單介紹了ibatis和如何通過iBatis搭建JAVA項目,包含了一個相關(guān)實例,需要的朋友可以參考下。
    2017-09-09
  • SpringBoot中的依賴管理詳解

    SpringBoot中的依賴管理詳解

    這篇文章主要介紹了SpringBoot中的依賴管理詳解,傳統(tǒng)的Spring框架實現(xiàn)一個Web服務(wù),需要導(dǎo)入各種依賴JAR包,然后編寫對應(yīng)的XML配置文件等,相較而言,Spring Boot顯得更加方便、快捷和高效,需要的朋友可以參考下
    2023-08-08
  • springboot如何靜態(tài)加載@configurationProperties

    springboot如何靜態(tài)加載@configurationProperties

    這篇文章主要介紹了springboot如何靜態(tài)加載@configurationProperties,本文一個錯誤案例和成功案例結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • QTabWidget標簽實現(xiàn)雙擊關(guān)閉的方法(推薦)

    QTabWidget標簽實現(xiàn)雙擊關(guān)閉的方法(推薦)

    這篇文章主要介紹了QTabWidget標簽實現(xiàn)雙擊關(guān)閉的方法(推薦)的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • SpringBoot使用hutool-captcha實現(xiàn)驗證碼生成與驗證

    SpringBoot使用hutool-captcha實現(xiàn)驗證碼生成與驗證

    在springboot的登陸頁面中為了防止機器大規(guī)模注冊,機器暴力破解數(shù)據(jù)密碼等危害,需要驗證隨機生成的驗證碼,本文主要介紹了SpringBoot使用hutool-captcha實現(xiàn)驗證碼生成與驗證,感興趣的可以了解一下
    2023-12-12
  • SpringBoot實現(xiàn)本地文件存儲及預(yù)覽過程

    SpringBoot實現(xiàn)本地文件存儲及預(yù)覽過程

    這篇文章主要介紹了SpringBoot實現(xiàn)本地文件存儲及預(yù)覽過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • maven依賴關(guān)系中的<scope>provided</scope>使用詳解

    maven依賴關(guān)系中的<scope>provided</scope>使用詳解

    這篇文章主要介紹了maven依賴關(guān)系中的<scope>provided</scope>使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Java中MD5的使用代碼示例

    Java中MD5的使用代碼示例

    這篇文章主要給大家介紹了關(guān)于Java中MD5的使用示例,MD5加密是一種常見的加密方式,我們經(jīng)常用在保存用戶密碼和關(guān)鍵信息上,需要的朋友可以參考下
    2023-08-08

最新評論