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

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

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

背景介紹

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

實(shí)現(xiàn)方法

DependsOn注解

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

ApplicationContextInitializer

通過注冊(cè) ApplicationContextInitializer 后,就可以注冊(cè) BeanDefinitionRegistryPostProcessor 到 Spring里面。最后實(shí)現(xiàn) BeanDefinitionRegistryPostProcessor ,注冊(cè)目標(biāo) bean。

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

實(shí)現(xiàn) BeanDefinitionRegistryPostProcessor:

public class DemoBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered {
  // from BeanDefinitionRegistryPostProcessor interface
  @Override
  public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
// 重點(diǎn)在這里,這里可以把自己的 想要提起 實(shí)現(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 或者其他的注解進(jìn)行注冊(cè) BeanDefinitionRegistryPostProcessor。

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

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

簡單Demo

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

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 通過這個(gè)方法獲得系統(tǒng)配置
    public static String getGlobalConfig(String key) {
        return GLOBAL_CONF.get(key);
    }
}

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

public class DemoBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, 
PriorityOrdered, 
ApplicationContextInitializer<ConfigurableApplicationContext> {
    /**
     *  第二步: 注冊(cè) 自己的 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;
    }
    /**
     *  第一步 先注冊(cè) 到 configurableApplicationContext 中
     *
     * @param configurableApplicationContext
     */
    // from ApplicationContextInitializer  interface
    @Override
    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
        configurableApplicationContext.addBeanFactoryPostProcessor(new DemoBeanDefinitionRegistryPostProcessor());
    }
}

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

下一篇。

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

相關(guān)文章

  • Java 中 String,StringBuffer 和 StringBuilder 的區(qū)別及用法

    Java 中 String,StringBuffer 和 StringBuilder 的區(qū)別及用法

    這篇文章主要介紹了Java 中 String,StringBuffer 和 StringBuilder 的區(qū)別及用法的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • java Gui實(shí)現(xiàn)肯德基點(diǎn)餐收銀系統(tǒng)

    java Gui實(shí)現(xiàn)肯德基點(diǎn)餐收銀系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java Gui實(shí)現(xiàn)肯德基點(diǎn)餐收銀系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Spring?Retry實(shí)現(xiàn)重試機(jī)制的示例詳解

    Spring?Retry實(shí)現(xiàn)重試機(jī)制的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Spring-Retry的用法以及實(shí)現(xiàn)原理是怎么樣的,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的可以了解一下
    2023-07-07
  • springboot整合mongodb并實(shí)現(xiàn)crud步驟詳解

    springboot整合mongodb并實(shí)現(xiàn)crud步驟詳解

    這篇文章主要介紹了springboot整合mongodb并實(shí)現(xiàn)crud,本文分步驟通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • 詳解Spring Boot使用Maven自定義打包方式

    詳解Spring Boot使用Maven自定義打包方式

    這篇文章主要介紹了Spring Boot使用Maven自定義打包方式,本文通過多種方式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • java密鑰交換算法DH定義與應(yīng)用實(shí)例分析

    java密鑰交換算法DH定義與應(yīng)用實(shí)例分析

    這篇文章主要介紹了java密鑰交換算法DH定義與應(yīng)用,結(jié)合實(shí)例形式分析了Java密鑰交換算法DH的原理、定義、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-09-09
  • mybatis?plus?MetaObjectHandler?不生效的解決

    mybatis?plus?MetaObjectHandler?不生效的解決

    今天使用mybatis-plus自動(dòng)為更新和插入操作插入更新時(shí)間和插入時(shí)間,配置了MetaObjectHandler不生效,本文就來解決一下,具有一定的 參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • Java利用for循環(huán)打印菱形的實(shí)例教程

    Java利用for循環(huán)打印菱形的實(shí)例教程

    這篇文章主要給大家介紹了關(guān)于Java利用for循環(huán)打印菱形的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java利用AQS實(shí)現(xiàn)自定義鎖

    Java利用AQS實(shí)現(xiàn)自定義鎖

    本文主要介紹了Java利用AQS實(shí)現(xiàn)自定義鎖,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Tk.mybatis零sql語句實(shí)現(xiàn)動(dòng)態(tài)sql查詢的方法(4種)

    Tk.mybatis零sql語句實(shí)現(xiàn)動(dòng)態(tài)sql查詢的方法(4種)

    有時(shí)候,查詢數(shù)據(jù)需要根據(jù)條件使用動(dòng)態(tài)查詢,這時(shí)候需要使用動(dòng)態(tài)sql,本文主要介紹了Tk.mybatis零sql語句實(shí)現(xiàn)動(dòng)態(tài)sql查詢的方法,感興趣的可以了解一下
    2021-12-12

最新評(píng)論