>  기사  >  Java  >  SpringBoot는 자체 빈을 먼저 로드하기 위해 어떻게 선택합니까?

SpringBoot는 자체 빈을 먼저 로드하기 위해 어떻게 선택합니까?

WBOY
WBOY앞으로
2023-05-12 11:01:141384검색

    구현 방법

    DependsOn 주석

    @DependsOn을 온라인으로 구현하는 방법은 여러 가지가 있지만 종속 Bean 수가 적으면 더 쉽지만 수가 늘어나면 번거로워집니다. 클래스를 다시 작성해야 하므로 두 번째 방법을 권장합니다.

    ApplicationContextInitializer

    ApplicationContextInitializer를 등록한 후 Spring에서 BeanDefinitionRegistryPostProcessor를 등록할 수 있습니다. 마지막으로 BeanDefinitionRegistryPostProcessor를 구현하여 대상 Bean을 등록합니다.

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

    Implement 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;
      }
    }

    BeanDefinitionRegistryPostProcessor를 등록하기 위해 @Componet이나 다른 주석을 사용할 수 없다는 점에 유의해야 합니다.

    @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는 자체 빈을 먼저 로드하기 위해 어떻게 선택합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제