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.
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.
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!