Fix singleton handling of ConfigurationProperties hints
Closes gh-31248
This commit is contained in:
parent
cf19c176f6
commit
c996e4335a
|
|
@ -39,7 +39,6 @@ import org.springframework.beans.ExtendedBeanInfoFactory;
|
|||
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotContribution;
|
||||
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor;
|
||||
import org.springframework.beans.factory.aot.BeanFactoryInitializationCode;
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
|
||||
import org.springframework.boot.context.properties.bind.Bindable;
|
||||
import org.springframework.core.ResolvableType;
|
||||
|
|
@ -64,8 +63,10 @@ class ConfigurationPropertiesBeanFactoryInitializationAotProcessor implements Be
|
|||
String[] beanNames = beanFactory.getBeanNamesForAnnotation(ConfigurationProperties.class);
|
||||
List<Class<?>> types = new ArrayList<>();
|
||||
for (String beanName : beanNames) {
|
||||
BeanDefinition beanDefinition = beanFactory.getMergedBeanDefinition(beanName);
|
||||
types.add(ClassUtils.getUserClass(beanDefinition.getResolvableType().toClass()));
|
||||
Class<?> beanType = beanFactory.getType(beanName, false);
|
||||
if (beanType != null) {
|
||||
types.add(ClassUtils.getUserClass(beanType));
|
||||
}
|
||||
}
|
||||
if (!CollectionUtils.isEmpty(types)) {
|
||||
return new ConfigurationPropertiesReflectionHintsContribution(types);
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ import org.springframework.beans.factory.aot.AotFactoriesLoader;
|
|||
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotContribution;
|
||||
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor;
|
||||
import org.springframework.beans.factory.aot.BeanFactoryInitializationCode;
|
||||
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
|
||||
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
|
||||
import org.springframework.beans.factory.support.RootBeanDefinition;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
|
|
@ -61,7 +62,6 @@ class ConfigurationPropertiesBeanFactoryInitializationAotProcessorTests {
|
|||
assertThat(new AotFactoriesLoader(new DefaultListableBeanFactory())
|
||||
.load(BeanFactoryInitializationAotProcessor.class))
|
||||
.anyMatch(ConfigurationPropertiesBeanFactoryInitializationAotProcessor.class::isInstance);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -71,6 +71,15 @@ class ConfigurationPropertiesBeanFactoryInitializationAotProcessorTests {
|
|||
assertThat(this.processor.processAheadOfTime(beanFactory)).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
void processManuallyRegisteredSingleton() {
|
||||
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
|
||||
beanFactory.registerSingleton("test", new SampleProperties());
|
||||
RuntimeHints runtimeHints = process(beanFactory);
|
||||
assertThat(runtimeHints.reflection().typeHints()).singleElement()
|
||||
.satisfies(javaBeanBinding(SampleProperties.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
void processJavaBeanConfigurationProperties() {
|
||||
RuntimeHints runtimeHints = process(SampleProperties.class);
|
||||
|
|
@ -245,6 +254,10 @@ class ConfigurationPropertiesBeanFactoryInitializationAotProcessorTests {
|
|||
for (Class<?> type : types) {
|
||||
beanFactory.registerBeanDefinition(type.getName(), new RootBeanDefinition(type));
|
||||
}
|
||||
return process(beanFactory);
|
||||
}
|
||||
|
||||
private RuntimeHints process(ConfigurableListableBeanFactory beanFactory) {
|
||||
BeanFactoryInitializationAotContribution contribution = this.processor.processAheadOfTime(beanFactory);
|
||||
assertThat(contribution).isNotNull();
|
||||
GenerationContext generationContext = new DefaultGenerationContext(new InMemoryGeneratedFiles());
|
||||
|
|
|
|||
Loading…
Reference in New Issue