首頁  >  文章  >  Java  >  SpringBoot怎麼選擇自有bean優先加載

SpringBoot怎麼選擇自有bean優先加載

WBOY
WBOY轉載
2023-05-12 11:01:141382瀏覽

    實作方法

    DependsOn註解

    這個@DependsOn網路上實作方法很多,依賴的bean數目較少的話,比較好弄,但數目變多後,就比較麻煩了,每個類別都需要重新寫一遍,因此推薦第二種方法。

    ApplicationContextInitializer

    透過註冊 ApplicationContextInitializer 後,就可以註冊 BeanDefinitionRegistryPostProcessor 到 Spring裡面。最後實作 BeanDefinitionRegistryPostProcessor ,註冊目標 bean。

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

    實作 BeanDefinitionRegistryPostProcessor:

    public class DemoBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered {
      // from BeanDefinitionRegistryPostProcessor interface
      @Override
      public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
    // 重点在这里,这里可以把自己的 想要提起 实现的 或者初始化的 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 掃描到,而現在,我們需要考慮我們的bean註冊,要在這些bean之前,所以一定不能被「它-ConfigurationClassPostProcessor」管理 。換一個角度思考,如果被 「它」 管理類別 註冊出來的bean 一定不可能排在 ConfigurationClassPostProcessor 的前面。

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

    簡單Demo

    需求:筆者想讓TestService 提前被註冊,並且執行後,其他bean 才能被註冊。

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

    實作:(為了簡單,直接實作上述的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());
        }
    }

    以上是SpringBoot怎麼選擇自有bean優先加載的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除