Skip to content

Commit f7880c0

Browse files
committed
Hacking #3 :)
1 parent 018000a commit f7880c0

File tree

3 files changed

+30
-58
lines changed

3 files changed

+30
-58
lines changed

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/sql/init/SqlInitializationAutoConfigurationTests.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,7 @@ void whenBeanIsAnnotatedAsDependingOnDatabaseInitializationThenItDependsOnR2dbcS
113113
.withUserConfiguration(DependsOnInitializedDatabaseConfiguration.class)
114114
.run((context) -> {
115115
BeanDefinition beanDefinition = context.getBeanFactory()
116-
.getBeanDefinition(
117-
"sqlInitializationAutoConfigurationTests.DependsOnInitializedDatabaseConfiguration");
116+
.getBeanDefinition(DependsOnInitializedDatabaseConfiguration.class.getName());
118117
assertThat(beanDefinition.getDependsOn()).containsExactlyInAnyOrder("r2dbcScriptDatabaseInitializer");
119118
});
120119
}
@@ -125,8 +124,7 @@ void whenBeanIsAnnotatedAsDependingOnDatabaseInitializationThenItDependsOnDataSo
125124
.withUserConfiguration(DependsOnInitializedDatabaseConfiguration.class)
126125
.run((context) -> {
127126
BeanDefinition beanDefinition = context.getBeanFactory()
128-
.getBeanDefinition(
129-
"sqlInitializationAutoConfigurationTests.DependsOnInitializedDatabaseConfiguration");
127+
.getBeanDefinition(DependsOnInitializedDatabaseConfiguration.class.getName());
130128
assertThat(beanDefinition.getDependsOn())
131129
.containsExactlyInAnyOrder("dataSourceScriptDatabaseInitializer");
132130
});

spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/runner/AbstractApplicationContextRunner.java

Lines changed: 19 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,13 @@
2323
import java.util.function.Function;
2424
import java.util.function.Supplier;
2525

26-
import org.springframework.beans.BeansException;
2726
import org.springframework.beans.factory.config.BeanDefinition;
2827
import org.springframework.beans.factory.config.BeanDefinitionCustomizer;
2928
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
3029
import org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory;
3130
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
32-
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
3331
import org.springframework.beans.factory.support.BeanNameGenerator;
3432
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
35-
import org.springframework.beans.factory.support.RootBeanDefinition;
3633
import org.springframework.boot.context.annotation.Configurations;
3734
import org.springframework.boot.context.annotation.UserConfigurations;
3835
import org.springframework.boot.test.context.FilteredClassLoader;
@@ -42,10 +39,11 @@
4239
import org.springframework.context.ApplicationContext;
4340
import org.springframework.context.ApplicationContextInitializer;
4441
import org.springframework.context.ConfigurableApplicationContext;
42+
import org.springframework.context.annotation.AnnotatedBeanDefinitionReader;
43+
import org.springframework.context.support.AbstractApplicationContext;
4544
import org.springframework.context.support.GenericApplicationContext;
46-
import org.springframework.core.Ordered;
47-
import org.springframework.core.PriorityOrdered;
4845
import org.springframework.core.ResolvableType;
46+
import org.springframework.core.env.ConfigurableEnvironment;
4947
import org.springframework.core.env.Environment;
5048
import org.springframework.core.io.DefaultResourceLoader;
5149
import org.springframework.util.Assert;
@@ -446,17 +444,28 @@ private void configureContext(C context, boolean refresh) {
446444
this.runnerConfiguration.initializers.forEach((initializer) -> initializer.initialize(context));
447445
Class<?>[] classes = Configurations.getClasses(this.runnerConfiguration.configurations);
448446
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+
}
454453
}
455454
if (refresh) {
456455
context.refresh();
457456
}
458457
}
459458

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+
460469
private void accept(ContextConsumer<? super A> consumer, A context) {
461470
try {
462471
consumer.accept(context);
@@ -612,39 +621,4 @@ private static <T> List<T> add(List<T> list, T element) {
612621

613622
}
614623

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

spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/runner/AbstractApplicationContextRunnerTests.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -140,19 +140,19 @@ void runWithConfigurationsShouldRegisterConfigurations() {
140140
}
141141

142142
@Test
143-
public void runWithConfigurationsShouldUseFullyQualifiedClassBeanNames() {
143+
void runWithConfigurationsShouldUseFullyQualifiedClassBeanNames() {
144144
get().withUserConfiguration(FooConfig.class)
145-
.run((context) -> assertThat(context).hasBean(FooConfig.class.getName()));
145+
.run((context) -> assertThat(context).hasBean(FooConfig.class.getName()));
146146
}
147147

148148
@Test
149-
public void runWithConfigurationsWithTheSameNameShouldRegisterBoth() {
150-
get().withUserConfiguration(org.springframework.boot.test.context.example.duplicate.first.EmptyConfig.class,
151-
org.springframework.boot.test.context.example.duplicate.second.EmptyConfig.class)
152-
.run((context) -> assertThat(context)
153-
.hasSingleBean(org.springframework.boot.test.context.example.duplicate.first.EmptyConfig.class)
154-
.hasSingleBean(
155-
org.springframework.boot.test.context.example.duplicate.second.EmptyConfig.class));
149+
void runWithConfigurationsWithTheSameNameShouldRegisterBoth() {
150+
get()
151+
.withUserConfiguration(org.springframework.boot.test.context.example.duplicate.first.EmptyConfig.class,
152+
org.springframework.boot.test.context.example.duplicate.second.EmptyConfig.class)
153+
.run((context) -> assertThat(context)
154+
.hasSingleBean(org.springframework.boot.test.context.example.duplicate.first.EmptyConfig.class)
155+
.hasSingleBean(org.springframework.boot.test.context.example.duplicate.second.EmptyConfig.class));
156156
}
157157

158158
@Test

0 commit comments

Comments
 (0)