|
23 | 23 | import java.util.function.Function;
|
24 | 24 | import java.util.function.Supplier;
|
25 | 25 |
|
26 |
| -import org.springframework.beans.BeansException; |
27 | 26 | import org.springframework.beans.factory.config.BeanDefinition;
|
28 | 27 | import org.springframework.beans.factory.config.BeanDefinitionCustomizer;
|
29 | 28 | import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
|
30 | 29 | import org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory;
|
31 | 30 | import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
32 |
| -import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; |
33 | 31 | import org.springframework.beans.factory.support.BeanNameGenerator;
|
34 | 32 | import org.springframework.beans.factory.support.DefaultListableBeanFactory;
|
35 |
| -import org.springframework.beans.factory.support.RootBeanDefinition; |
36 | 33 | import org.springframework.boot.context.annotation.Configurations;
|
37 | 34 | import org.springframework.boot.context.annotation.UserConfigurations;
|
38 | 35 | import org.springframework.boot.test.context.FilteredClassLoader;
|
|
42 | 39 | import org.springframework.context.ApplicationContext;
|
43 | 40 | import org.springframework.context.ApplicationContextInitializer;
|
44 | 41 | import org.springframework.context.ConfigurableApplicationContext;
|
| 42 | +import org.springframework.context.annotation.AnnotatedBeanDefinitionReader; |
| 43 | +import org.springframework.context.support.AbstractApplicationContext; |
45 | 44 | import org.springframework.context.support.GenericApplicationContext;
|
46 |
| -import org.springframework.core.Ordered; |
47 |
| -import org.springframework.core.PriorityOrdered; |
48 | 45 | import org.springframework.core.ResolvableType;
|
| 46 | +import org.springframework.core.env.ConfigurableEnvironment; |
49 | 47 | import org.springframework.core.env.Environment;
|
50 | 48 | import org.springframework.core.io.DefaultResourceLoader;
|
51 | 49 | import org.springframework.util.Assert;
|
@@ -446,17 +444,28 @@ private void configureContext(C context, boolean refresh) {
|
446 | 444 | this.runnerConfiguration.initializers.forEach((initializer) -> initializer.initialize(context));
|
447 | 445 | Class<?>[] classes = Configurations.getClasses(this.runnerConfiguration.configurations);
|
448 | 446 | if (classes.length > 0) {
|
449 |
| - context.addBeanFactoryPostProcessor(new ConfigurationClassesRegistrar(classes)); |
450 |
| - // GenericApplicationContext gac = (GenericApplicationContext) context; |
451 |
| - // for (Class<?> aClass : classes) { |
452 |
| - // gac.registerBean(aClass.getName(), aClass); |
453 |
| - // } |
| 447 | + BeanDefinitionRegistry registry = getBeanDefinitionRegistry(context); |
| 448 | + ConfigurableEnvironment environment = context.getEnvironment(); |
| 449 | + AnnotatedBeanDefinitionReader reader = new AnnotatedBeanDefinitionReader(registry, environment); |
| 450 | + for (Class<?> configurationClass : classes) { |
| 451 | + reader.registerBean(configurationClass, configurationClass.getName()); |
| 452 | + } |
454 | 453 | }
|
455 | 454 | if (refresh) {
|
456 | 455 | context.refresh();
|
457 | 456 | }
|
458 | 457 | }
|
459 | 458 |
|
| 459 | + private BeanDefinitionRegistry getBeanDefinitionRegistry(ApplicationContext context) { |
| 460 | + if (context instanceof BeanDefinitionRegistry registry) { |
| 461 | + return registry; |
| 462 | + } |
| 463 | + if (context instanceof AbstractApplicationContext abstractContext) { |
| 464 | + return (BeanDefinitionRegistry) abstractContext.getBeanFactory(); |
| 465 | + } |
| 466 | + throw new IllegalStateException("Could not locate BeanDefinitionRegistry from context: " + context); |
| 467 | + } |
| 468 | + |
460 | 469 | private void accept(ContextConsumer<? super A> consumer, A context) {
|
461 | 470 | try {
|
462 | 471 | consumer.accept(context);
|
@@ -612,39 +621,4 @@ private static <T> List<T> add(List<T> list, T element) {
|
612 | 621 |
|
613 | 622 | }
|
614 | 623 |
|
615 |
| - /** |
616 |
| - * A {@link BeanDefinitionRegistryPostProcessor} that mimics what an |
617 |
| - * {@code ImportSelector} does. In particular, it makes sure registered configuration |
618 |
| - * classes use their FQN as bean name. |
619 |
| - */ |
620 |
| - private static final class ConfigurationClassesRegistrar |
621 |
| - implements BeanDefinitionRegistryPostProcessor, PriorityOrdered { |
622 |
| - |
623 |
| - private final Class<?>[] configurationClasses; |
624 |
| - |
625 |
| - private ConfigurationClassesRegistrar(Class<?>[] configurationClasses) { |
626 |
| - this.configurationClasses = configurationClasses; |
627 |
| - } |
628 |
| - |
629 |
| - @Override |
630 |
| - public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) |
631 |
| - throws BeansException { |
632 |
| - for (Class<?> configurationClass : this.configurationClasses) { |
633 |
| - beanDefinitionRegistry.registerBeanDefinition(configurationClass.getName(), |
634 |
| - new RootBeanDefinition(configurationClass)); |
635 |
| - } |
636 |
| - } |
637 |
| - |
638 |
| - @Override |
639 |
| - public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) |
640 |
| - throws BeansException { |
641 |
| - } |
642 |
| - |
643 |
| - @Override |
644 |
| - public int getOrder() { |
645 |
| - return Ordered.LOWEST_PRECEDENCE; |
646 |
| - } |
647 |
| - |
648 |
| - } |
649 |
| - |
650 | 624 | }
|
0 commit comments