Maison  >  Article  >  Java  >  Comment SpringBoot choisit-il de charger ses propres beans en premier ?

Comment SpringBoot choisit-il de charger ses propres beans en premier ?

WBOY
WBOYavant
2023-05-12 11:01:141432parcourir

    Méthode d'implémentation

    Annotation DependsOn

    Il existe de nombreuses méthodes d'implémentation en ligne pour cela @DependsOn , selon Si le nombre de beans est petit, c'est plus facile à faire, mais lorsque le nombre augmente, cela devient plus gênant. Chaque classe doit être réécrite, donc la deuxième méthode est recommandée.

    ApplicationContextInitializer

    Après avoir enregistré ApplicationContextInitializer, vous pouvez enregistrer BeanDefinitionRegistryPostProcessor au printemps. Enfin, implémentez BeanDefinitionRegistryPostProcessor pour enregistrer le bean cible.

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

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

    Il convient de noter que @Componet ou d'autres annotations ne peuvent pas être utilisées pour enregistrer BeanDefinitionRegistryPostProcessor.

    Parce que la méthode d'annotation @Componet ne peut être enregistrée que si elle est analysée par ConfigurationClassPostProcessor. Maintenant, nous devons considérer l'enregistrement de notre bean avant ces beans, il ne doit donc pas être géré par "it-ConfigurationClassPostProcessor". . En y réfléchissant sous un autre angle, si les beans enregistrés par la classe de gestion "it" ne doivent pas être classés devant ConfigurationClassPostProcessor.

    Remarque : @Order ne peut contrôler que l'ordre des propres beans de Spring. Il ne peut pas contrôler les annotations @Service @Component et @Repository.

    Simple Demo

    Exigence : L'auteur souhaite que TestService soit enregistré à l'avance, et ce n'est qu'après l'exécution que d'autres beans peuvent être enregistrés.

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

    Implémentation : (Pour plus de simplicité, implémentez directement les 3 interfaces ci-dessus)

    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());
        }
    }

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer