Heim  >  Artikel  >  Java  >  Wie entscheidet sich SpringBoot dafür, zuerst seine eigenen Beans zu laden?

Wie entscheidet sich SpringBoot dafür, zuerst seine eigenen Beans zu laden?

WBOY
WBOYnach vorne
2023-05-12 11:01:141428Durchsuche

    Implementierungsmethode

    DependsOn-Annotation

    Es gibt viele Online-Implementierungsmethoden für dieses @DependsOn Je nachdem, ob die Anzahl der Bohnen gering ist, ist dies einfacher, aber wenn die Anzahl zunimmt, wird es schwieriger. Jede Klasse muss erneut geschrieben werden, daher wird die zweite Methode empfohlen.

    ApplicationContextInitializer

    Nach der Registrierung von ApplicationContextInitializer können Sie BeanDefinitionRegistryPostProcessor im Frühjahr registrieren. Implementieren Sie schließlich BeanDefinitionRegistryPostProcessor, um die Ziel-Bean zu registrieren.

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

    BeanDefinitionRegistryPostProcessor implementieren:

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

    Es ist zu beachten, dass @Componet oder andere Annotationen nicht zum Registrieren von BeanDefinitionRegistryPostProcessor verwendet werden können.

    Da die Annotationsmethode @Componet nur registriert werden kann, wenn sie von ConfigurationClassPostProcessor gescannt wird. Jetzt müssen wir unsere Bean-Registrierung vor diesen Beans berücksichtigen, sodass sie nicht von „it-ConfigurationClassPostProcessor“ verwaltet werden darf. . Aus einem anderen Blickwinkel betrachtet, dürfen die von der Verwaltungsklasse „it“ registrierten Beans nicht vor ConfigurationClassPostProcessor eingestuft werden.

    Hinweis: @Order kann nur die Reihenfolge der Spring-eigenen Beans steuern. Die Annotationen @Service @Component und @Repository können nicht gesteuert werden.

    Einfache Demo

    Anforderung: Der Autor möchte, dass TestService im Voraus registriert wird und erst nach der Ausführung andere Beans registriert werden können.

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

    Implementierung: (Der Einfachheit halber implementieren Sie die oben genannten 3 Schnittstellen direkt)

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

    Das obige ist der detaillierte Inhalt vonWie entscheidet sich SpringBoot dafür, zuerst seine eigenen Beans zu laden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen