溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SpringBoot怎么選擇自有bean優(yōu)先加載

發(fā)布時(shí)間:2023-03-14 10:13:02 來(lái)源:億速云 閱讀:128 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容主要講解“SpringBoot怎么選擇自有bean優(yōu)先加載”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“SpringBoot怎么選擇自有bean優(yōu)先加載”吧!

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

    DependsOn注解

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

    ApplicationContextInitializer

    通過(guò)注冊(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è)角度思考,如果被 “它” 管理類(lèi) 注冊(cè)出來(lái)的bean 一定不可能排在 ConfigurationClassPostProcessor 的前面。

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

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

    實(shí)現(xiàn):(為了簡(jiǎ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());
        }
    }

    到此,相信大家對(duì)“SpringBoot怎么選擇自有bean優(yōu)先加載”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

    向AI問(wèn)一下細(xì)節(jié)
    AI