ホームページ  >  記事  >  Java  >  SpringBoot はどのようにして独自の Bean を最初にロードすることを選択するのでしょうか?

SpringBoot はどのようにして独自の Bean を最初にロードすることを選択するのでしょうか?

WBOY
WBOY転載
2023-05-12 11:01:141428ブラウズ

    実装方法

    DependsOn アノテーション

    @DependsOn をオンラインで実装する方法は多数ありますが、依存する Bean の数が少ない場合は、の方が簡単ですが、数が増えると面倒になり、各クラスを書き換える必要があるため、2番目の方法をお勧めします。

    ApplicationContextInitializer

    ApplicationContextInitializer を登録した後、Spring で BeanDefinitionRegistryPostProcessor を登録できます。最後に、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 の登録を考慮する必要があるため、「it-ConfigurationClassPostProcessor」によって管理されてはなりません。別の角度から考えると、「it」管理クラスによって登録された Bean は、ConfigurationClassPostProcessor より前にランク付けされてはなりません。

    注: @Order は Spring 自身の Bean の順序のみを制御でき、アノテーション @Service @Component および @Repository は制御できません。

    簡単なデモ

    要件: 作成者は、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 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。