最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring控制bean加載順序使用詳解

 更新時(shí)間:2024年01月03日 11:15:58   作者:你還有牽掛嗎  
在使用spring框架開(kāi)發(fā)過(guò)程中,我們可能會(huì)遇到某個(gè)bean被另一個(gè)bean依賴(lài),也就是bean-b的創(chuàng)建必須依賴(lài)bean-a等問(wèn)題,類(lèi)似這樣的場(chǎng)景還有很多,總結(jié)來(lái)說(shuō),這就涉及到bean的加載順序問(wèn)題,如何解決呢,本文將給大家列舉出幾種常用的解決方案,需要的朋友可以參考下

1.誤區(qū)

1.1 使用@Order注解去設(shè)置Ben的加載順序(Order里面的數(shù)值越小優(yōu)先級(jí)越高)

分別創(chuàng)建Config1,Config2

@Component
@Order(1)
public class Config1 {
    public Config1(){
        System.out.println("Config1構(gòu)建了.........");
    }
}
 
?
@Component
@Order(2)
public class Config2 {
    public Config2(){
        System.out.println("Config2構(gòu)建了.........");
    }
}
 
?

期間我還嘗試著將@Component都改為使用@Configuration,結(jié)果仍然不變

總結(jié):嘗試過(guò)同包下,不同包下。最終測(cè)試結(jié)果為:一般情況下會(huì)按照SPring類(lèi)的書(shū)寫(xiě)的順序去創(chuàng)建,但是也不一定,最終其實(shí)得看你的編譯出來(lái)的文件,的Class文件到底是什么樣子的,包括操作系統(tǒng)文件的排序規(guī)則等一系列的因素。反正這個(gè)順序是不確定的。如果包的順序Config1在Config2的下面,就算Config1的@Order值小于Config2的值也沒(méi)有用。

1.2使用@AutoConfigureAfter控制Ben的加載順序(當(dāng)前配置類(lèi)在指定配置類(lèi)之后執(zhí)行)

@AutoConfigureBefore(當(dāng)前配置類(lèi)在指定配置類(lèi)之前執(zhí)行)

@AutoConfigureOrder(指定優(yōu)先級(jí),數(shù)值越小,優(yōu)先級(jí)越高)

@Configuration
@AutoConfigureAfter(Config1.class)
public class Config2 {
    public Config2(){
        System.out.println("Config2構(gòu)建了.........");
    }
}
 
@Configuration
public class Config1 {
    public Config1(){
        System.out.println("Config1構(gòu)建了.........");
    }
}
@Configuration
@AutoConfigureAfter(Config1.class)
public class Config2 {
    public Config2(){
        System.out.println("Config2構(gòu)建了.........");
    }
}
 
@Configuration
public class Config1 {
    public Config1(){
        System.out.println("Config1構(gòu)建了.........");
    }
}
@Configuration
@AutoConfigureOrder(1)
public class Config2 {
    public Config2(){
        System.out.println("Config2構(gòu)建了.........");
    }
}
 
@Configuration
@AutoConfigureOrder(2)
public class Config1 {
    public Config1(){
        System.out.println("Config1構(gòu)建了.........");
    }
}

以上三個(gè)注解在同包和不同包都是不起作用的,和@Order是一樣的也是通過(guò)書(shū)寫(xiě)順序去創(chuàng)建的。

此時(shí)這里使用@Component是不起作用的,但是上面的@Order注解就不會(huì)有影響,無(wú)聊是使用@Configurantion還是@Component都是一個(gè)效果。

解決:在resources下新建META-INF/spring.factories文件

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.juzi.test.config.Config2,\
com.juzi.test.config.Config1

結(jié)果我就不粘出來(lái)了,感興趣的小伙伴可以去嘗試一下。

2.正確的控制方法

2.1使用@DependsOn("Bean B")注解控制(告訴Spring容器Bean B 應(yīng)該被提前初始化)

創(chuàng)建AircraftTask、CarTask、TrainTask

目前創(chuàng)建的順序是 Aircraft -> CarTask -> Train

 理想的創(chuàng)建順序    Train -> Aircraft -> TrainCar

@Configuration
@DependsOn("trainTask")
public class AircraftTask {
    @PostConstruct
    public void init(){
        System.out.println("Aircraft獲取Train存入redis的數(shù)據(jù)..........");
    }
}
 
@Configuration
@DependsOn("aircraftTask")
public class CarTask {
    @PostConstruct
    public void init(){
        System.out.println("CarTask獲取到Aircraft的數(shù)據(jù)..........");
    }
}
 
@Configuration
public class TrainTask {
    @PostConstruct
    public void init(){
        System.out.println("Train初查詢(xún)數(shù)據(jù)存入redis..........");
    }
}

結(jié)果:和理想的結(jié)果一致

但是如果像以上這種依賴(lài)的類(lèi)數(shù)量過(guò)多的話(huà)這樣寫(xiě)注解容易寫(xiě)錯(cuò),我們可以使用以下方法 :

2.2使用BeanDefinitionRegistryPostProcessor和ApplicationContextInitializer去控制

對(duì)這兩個(gè)類(lèi)不是很熟悉的同學(xué)可以去下載Spring源碼簡(jiǎn)單的閱讀一下。

public class CarTask {
    @PostConstruct
    public void init(){
        System.out.println("CarTask獲取到Aircraft的數(shù)據(jù)..........");
    }
}
 
public class AircraftTask {
    @PostConstruct
    public void init(){
        System.out.println("Aircraft獲取Train存入redis的數(shù)據(jù)..........");
    }
}
 
public class TrainTask {
    @PostConstruct
    public void init(){
        System.out.println("Train初查詢(xún)數(shù)據(jù)存入redis..........");
    }
}

這里不需要使用@Configuration或@Component注解,下面會(huì)對(duì)它們進(jìn)行手動(dòng)的添加到容器中。

public class MyBeanFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor {
 
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        AbstractBeanDefinition beanDefinition2 = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
        beanDefinition2.setBeanClass(TrainTask.class);
        registry.registerBeanDefinition("trainTask",beanDefinition2);
 
        AbstractBeanDefinition beanDefinition1 = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
        beanDefinition1.setBeanClass(AircraftTask.class);
        registry.registerBeanDefinition("aircraftTask",beanDefinition1);
 
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
        beanDefinition.setBeanClass(CarTask.class);
        registry.registerBeanDefinition("carTaskTask",beanDefinition);
        //相當(dāng)于往Spring容器初始化的時(shí)的那個(gè)List里面添加了一個(gè)Bean 只要在掃描之前執(zhí)行了postProcessBeanDefinitionRegistry 方法 那么就會(huì)安裝List里面存放的順序
        //生成Bean
    }
 
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
 
    }
}
public class MyApplicationContextInitiaLizer implements ApplicationContextInitializer {
 
    @Override
    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
        configurableApplicationContext.addBeanFactoryPostProcessor(new MyBeanFactoryPostProcessor());
    }
}

resources下新建META-INF/spring.factories文件 配置MyApplicationContextInitiaLizer的全限定類(lèi)名即可。

#org.springframework.context.ApplicationContextInitializer=com.example.demo11.config.MyApplicationContextInitiaLizer

結(jié)果:也和預(yù)期的一致

以上就是Spring控制bean加載順序使用詳解的詳細(xì)內(nèi)容,更多關(guān)于Spring控制bean加載順序的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springcloud client指定注冊(cè)到eureka的ip與端口號(hào)方式

    springcloud client指定注冊(cè)到eureka的ip與端口號(hào)方式

    這篇文章主要介紹了springcloud client指定注冊(cè)到eureka的ip與端口號(hào)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 在 Spring Boot 中使用異步線(xiàn)程時(shí)的 HttpServletRequest 復(fù)用問(wèn)題記錄

    在 Spring Boot 中使用異步線(xiàn)程時(shí)的 HttpServletReque

    文章討論了在SpringBoot中使用異步線(xiàn)程時(shí),由于HttpServletRequest復(fù)用導(dǎo)致的Cookie解析失敗問(wèn)題,為了解決這個(gè)問(wèn)題,文章推薦了使用HttpServletRequestWrapper創(chuàng)建請(qǐng)求副本、手動(dòng)傳遞請(qǐng)求上下文和延遲請(qǐng)求清理等方法,感興趣的朋友一起看看吧
    2025-03-03
  • HashMap工作原理_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    HashMap工作原理_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了HashMap工作原理_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下
    2017-04-04
  • Java實(shí)現(xiàn)一鍵生成表controller,service,mapper文件

    Java實(shí)現(xiàn)一鍵生成表controller,service,mapper文件

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)一鍵生成表controller,service,mapper文件,文中的示例代碼講解詳細(xì),需要的可以收藏一下
    2023-05-05
  • Spring Batch實(shí)戰(zhàn)示例

    Spring Batch實(shí)戰(zhàn)示例

    批量數(shù)據(jù)處理是一個(gè)非常常見(jiàn)的需求,比如月底的工資代發(fā)、銀行對(duì)賬、數(shù)據(jù)報(bào)表生成等,當(dāng)數(shù)據(jù)量達(dá)到幾十萬(wàn)甚至上百萬(wàn)時(shí),可以高效的完成,感興趣的可以了解一下
    2026-02-02
  • SpringBoot實(shí)現(xiàn)IP限流的示例代碼

    SpringBoot實(shí)現(xiàn)IP限流的示例代碼

    在高并發(fā)的互聯(lián)網(wǎng)應(yīng)用中,系統(tǒng)穩(wěn)定性面臨嚴(yán)峻挑戰(zhàn),爬蟲(chóng)、以及不合理的接口調(diào)用都可能導(dǎo)致系統(tǒng)資源耗盡,影響正常用戶(hù)體驗(yàn),為了保障系統(tǒng)的穩(wěn)定性和可用性,本文將深入探討如何在 Spring Boot 中實(shí)現(xiàn) IP 限流,需要的朋友可以參考下
    2025-06-06
  • Spring之關(guān)于PropertyDescriptor的擴(kuò)展剖析

    Spring之關(guān)于PropertyDescriptor的擴(kuò)展剖析

    這篇文章主要介紹了Spring之關(guān)于PropertyDescriptor的擴(kuò)展剖析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Spring?AOP注解配置與XML配置雙實(shí)戰(zhàn)教程

    Spring?AOP注解配置與XML配置雙實(shí)戰(zhàn)教程

    本文詳細(xì)介紹了面向切面編程(AOP)的概念、快速入門(mén)、核心概念、切點(diǎn)確定、通知分類(lèi)、獲取被增強(qiáng)方法相關(guān)信息、應(yīng)用案例、XML配置、多切面順序問(wèn)題以及AOP原理中的動(dòng)態(tài)代理,通過(guò)實(shí)例展示了如何在Spring框架中使用AOP進(jìn)行方法增強(qiáng),感興趣的朋跟隨小編一起看看吧
    2025-11-11
  • Java經(jīng)典面試題最全匯總208道(三)

    Java經(jīng)典面試題最全匯總208道(三)

    這篇文章主要介紹了Java經(jīng)典面試題最全匯總208道(三),本文章內(nèi)容詳細(xì),該模塊分為了六個(gè)部分,本次為第三部分,需要的朋友可以參考下
    2023-01-01
  • SpringBoot項(xiàng)目啟動(dòng)時(shí)如何將需要數(shù)據(jù)添加到redis緩存

    SpringBoot項(xiàng)目啟動(dòng)時(shí)如何將需要數(shù)據(jù)添加到redis緩存

    文章介紹了使用Java注解@PostConstruct進(jìn)行項(xiàng)目啟動(dòng)時(shí)加載,并使用Spring和Redis進(jìn)行數(shù)據(jù)緩存的操作,通過(guò)`setCacheObject`方法將數(shù)據(jù)存儲(chǔ)到Redis中,并提供了清空緩存的方法
    2026-04-04

最新評(píng)論

磐石市| 项城市| 淄博市| 平遥县| 丽水市| 彭州市| 古蔺县| 乌恰县| 两当县| 裕民县| 富民县| 麻阳| 金塔县| 城市| 什邡市| 江都市| 满城县| 河池市| 庆安县| 布拖县| 孙吴县| 丰都县| 顺昌县| 汉阴县| 丰城市| 墨脱县| 大悟县| 庆阳市| 交口县| 石门县| 景洪市| 嘉兴市| 会宁县| 林州市| 新竹县| 沁水县| 甘南县| 宣城市| 民县| 镇原县| 沙田区|