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

SpringBoot選擇自有bean優(yōu)先加載實現(xiàn)方法

 更新時間:2023年03月14日 08:29:46   作者:amcomputer  
在一些需求中,可能存在某些場景,比如先加載自己的bean,然后自己的bean做一些DB操作,初始化配置問題,然后后面的bean基于這個配置文件,繼續(xù)做其他的業(yè)務邏輯。因此有了本文的這個題目

背景介紹

在一些需求中,可能存在某些場景,比如先加載自己的bean,然后自己的bean做一些DB操作,初始化配置問題,然后后面的bean基于這個配置文件,繼續(xù)做其他的業(yè)務邏輯。因此有了本文的這個題目。

實現(xiàn)方法

DependsOn注解

這個@DependsOn網(wǎng)上實現(xiàn)方法很多,依賴的bean數(shù)目較少的話,比較好弄,但數(shù)目變多后,就比較麻煩了,每個類都需要重新寫一遍,因此推薦第二種方法。

ApplicationContextInitializer

通過注冊 ApplicationContextInitializer 后,就可以注冊 BeanDefinitionRegistryPostProcessor 到 Spring里面。最后實現(xiàn) BeanDefinitionRegistryPostProcessor ,注冊目標 bean。

 class DemoApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
  @Override
  public void initialize(ConfigurableApplicationContext applicationContext) {
      applicationContext.addBeanFactoryPostProcessor(new DemoBeanDefinitionRegistryPostProcessor());
  }
}

實現(xiàn) BeanDefinitionRegistryPostProcessor:

public class DemoBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered {
  // from BeanDefinitionRegistryPostProcessor interface
  @Override
  public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
// 重點在這里,這里可以把自己的 想要提起 實現(xiàn)的 或者初始化的 bean  加到這里
beanDefinitionRegistry.registerBeanDefinition("DemoService",new RootBeanDefinition(DemoService.class));
  }
  // from BeanDefinitionRegistryPostProcessor interface
  @Override
  public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
  }
// from PriorityOrdered  interface
  @Override
  public int getOrder() {
  // 排在 ConfigurationClassPostProcessor 之前即可
      return Ordered.LOWEST_PRECEDENCE - 1;
  }
}

這里需要注意的是,不能使用 @Componet 或者其他的注解進行注冊 BeanDefinitionRegistryPostProcessor。

因為@Componet 注解方式能注冊的前提是 被 ConfigurationClassPostProcessor 掃描到,而現(xiàn)在,我們需要考慮我們的bean注冊,要在這些bean之前,所以一定不能被“它-ConfigurationClassPostProcessor”管理 。 換一個角度思考,如果被 “它” 管理類 注冊出來的bean 一定不可能排在 ConfigurationClassPostProcessor 的前面。

注意:@Order 這個只能控制 spring 自身 bean的順序,對于 @Service @Component 、@Repository這些注解是不能控制的。

簡單Demo

需求:筆者想讓TestService 提前被注冊,并且執(zhí)行后,其他bean 才能被注冊。

public class TestService {
    // 存放系統(tǒng)配置
    private static Map<String, String> GLOBAL_CONF = new HashMap<>();
    @PostConstruct
    public void init() {
        // 先做初始化 GLOBAL_CONF 或者其他 IO操作
        // GLOBAL_CONF.put(key, value);
    }
    //其他 bean 通過這個方法獲得系統(tǒng)配置
    public static String getGlobalConfig(String key) {
        return GLOBAL_CONF.get(key);
    }
}

實現(xiàn):(為了簡單,直接實現(xiàn)上述的3個接口)

public class DemoBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, 
PriorityOrdered, 
ApplicationContextInitializer<ConfigurableApplicationContext> {
    /**
     *  第二步: 注冊 自己的 bean
     *
     * @param beanDefinitionRegistry
     */
    // from BeanDefinitionRegistryPostProcessor interface
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
        beanDefinitionRegistry.registerBeanDefinition("TestService",new RootBeanDefinition(TestService.class));
    }
    // from BeanDefinitionRegistryPostProcessor interface
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
    }
// from PriorityOrdered  interface
    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE - 1;
    }
    /**
     *  第一步 先注冊 到 configurableApplicationContext 中
     *
     * @param configurableApplicationContext
     */
    // from ApplicationContextInitializer  interface
    @Override
    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
        configurableApplicationContext.addBeanFactoryPostProcessor(new DemoBeanDefinitionRegistryPostProcessor());
    }
}

思考: 那如何得到 或者 看到 spring bean 加載的順序呢?

下一篇。

到此這篇關于SpringBoot選擇自有bean優(yōu)先加載實現(xiàn)方法的文章就介紹到這了,更多相關SpringBoot bean優(yōu)先加載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot+Vue中的Token續(xù)簽機制

    SpringBoot+Vue中的Token續(xù)簽機制

    本文主要介紹了SpringBoot+Vue中的Token續(xù)簽機制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-06-06
  • java?數(shù)組越界判斷和獲取數(shù)組長度的實現(xiàn)方式

    java?數(shù)組越界判斷和獲取數(shù)組長度的實現(xiàn)方式

    這篇文章主要介紹了java?數(shù)組越界判斷和獲取數(shù)組長度的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 簡單了解java中靜態(tài)初始化塊的執(zhí)行順序

    簡單了解java中靜態(tài)初始化塊的執(zhí)行順序

    這篇文章主要介紹了簡單了解java中靜態(tài)初始化塊的執(zhí)行順序,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Flutter實現(xiàn)容器組件、圖片組件 的代碼

    Flutter實現(xiàn)容器組件、圖片組件 的代碼

    容器組件(Container)可以理解為在Android中的RelativeLayout或LinearLayout等,在其中你可以放置你想布局的元素控件,從而形成最終你想要的頁面布局。這篇文章主要介紹了Flutter實現(xiàn)容器組件、圖片組件 的代碼,需要的朋友可以參考下
    2019-07-07
  • java校驗json的格式是否符合要求的操作方法

    java校驗json的格式是否符合要求的操作方法

    在日常開發(fā)過程中,會有這樣的需求,校驗某個json是否是我們想要的數(shù)據(jù)格式,這篇文章主要介紹了java校驗json的格式是否符合要求,需要的朋友可以參考下
    2023-04-04
  • Spring MVC整合FreeMarker的示例

    Spring MVC整合FreeMarker的示例

    這篇文章主要介紹了Spring MVC整合FreeMarker的示例,幫助大家更好的理解和使用Spring MVC,感興趣的朋友可以了解下
    2020-12-12
  • 工廠方法模式_動力節(jié)點Java學院整理

    工廠方法模式_動力節(jié)點Java學院整理

    這篇文章主要介紹了工廠方法模式_動力節(jié)點Java學院整理的相關資料,需要的朋友可以參考下
    2017-08-08
  • Maven Spring jar包啟動報錯問題解決方案

    Maven Spring jar包啟動報錯問題解決方案

    maven 編譯jar包,放在linux服務器啟動不起來,提示:xxxx-0.0.1-SNAPSHOT.jar中沒有主清單屬性,接下來通過本文給大家分享問題原因及解決方案,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • SpringBoot?Profile多環(huán)境配置方式

    SpringBoot?Profile多環(huán)境配置方式

    這篇文章主要介紹了SpringBoot?Profile多環(huán)境配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 解決@Test注解在Maven工程的Test.class類中無法使用的問題

    解決@Test注解在Maven工程的Test.class類中無法使用的問題

    這篇文章主要介紹了解決@Test注解在Maven工程的Test.class類中無法使用的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評論

伊宁市| 六枝特区| 灯塔市| 雷波县| 杭锦旗| 鄂托克前旗| 滦平县| 牙克石市| 太谷县| 车致| 印江| 仲巴县| 眉山市| 江西省| 莱西市| 乌拉特中旗| 阜南县| 彰武县| 天峻县| 柳州市| 贵阳市| 嘉兴市| 襄汾县| 绥德县| 开封市| 星子县| 西和县| 福建省| 陇南市| 鱼台县| 苍南县| 晋宁县| 闻喜县| 石狮市| 理塘县| 扎兰屯市| 兴文县| 阳城县| 弋阳县| 九龙坡区| 顺平县|