Apply same order than original BPP
This commit updates ImportAwareAotBeanPostProcessor to be priority ordered, with the same order as its original BeanPostProcessor. This makes sure that infrastructure beans can be post-processed if necessary See gh-28915
This commit is contained in:
@@ -31,6 +31,7 @@ import org.springframework.aot.hint.ResourcePatternHint;
|
||||
import org.springframework.aot.test.generator.compile.Compiled;
|
||||
import org.springframework.aot.test.generator.compile.TestCompiler;
|
||||
import org.springframework.beans.BeansException;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotContribution;
|
||||
import org.springframework.beans.factory.config.BeanPostProcessor;
|
||||
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
|
||||
@@ -42,12 +43,14 @@ import org.springframework.context.ApplicationContextAware;
|
||||
import org.springframework.context.support.GenericApplicationContext;
|
||||
import org.springframework.context.testfixture.context.generator.annotation.ImportAwareConfiguration;
|
||||
import org.springframework.context.testfixture.context.generator.annotation.ImportConfiguration;
|
||||
import org.springframework.core.Ordered;
|
||||
import org.springframework.core.testfixture.aot.generate.TestGenerationContext;
|
||||
import org.springframework.core.type.AnnotationMetadata;
|
||||
import org.springframework.javapoet.CodeBlock;
|
||||
import org.springframework.javapoet.MethodSpec;
|
||||
import org.springframework.javapoet.ParameterizedTypeName;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.entry;
|
||||
@@ -110,6 +113,27 @@ class ConfigurationClassPostProcessorAotContributionTests {
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void applyToWhenHasImportAwareConfigurationRegistersBeanPostProcessorBeforeRegularBeanPostProcessor() {
|
||||
BeanFactoryInitializationAotContribution contribution = getContribution(
|
||||
TestImportAwareBeanPostProcessorConfiguration.class);
|
||||
contribution.applyTo(this.generationContext, this.beanFactoryInitializationCode);
|
||||
compile((initializer, compiled) -> {
|
||||
GenericApplicationContext freshContext = new GenericApplicationContext();
|
||||
DefaultListableBeanFactory freshBeanFactory = freshContext.getDefaultListableBeanFactory();
|
||||
initializer.accept(freshBeanFactory);
|
||||
freshBeanFactory.registerBeanDefinition(TestImportAwareBeanPostProcessor.class.getName(),
|
||||
new RootBeanDefinition(TestImportAwareBeanPostProcessor.class));
|
||||
RootBeanDefinition bd = new RootBeanDefinition(String.class);
|
||||
bd.setInstanceSupplier(() -> "test");
|
||||
freshBeanFactory.registerBeanDefinition("testProcessing", bd);
|
||||
freshContext.refresh();
|
||||
assertThat(freshContext.getBean("testProcessing")).isInstanceOfSatisfying(AnnotationMetadata.class, metadata ->
|
||||
assertThat(metadata.getClassName()).isEqualTo(TestImportAwareBeanPostProcessorConfiguration.class.getName())
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void applyToWhenHasImportAwareConfigurationRegistersHints() {
|
||||
BeanFactoryInitializationAotContribution contribution = getContribution(
|
||||
@@ -178,4 +202,41 @@ class ConfigurationClassPostProcessorAotContributionTests {
|
||||
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@Import(TestImportAwareBeanPostProcessor.class)
|
||||
static class TestImportAwareBeanPostProcessorConfiguration {
|
||||
|
||||
}
|
||||
|
||||
static class TestImportAwareBeanPostProcessor implements BeanPostProcessor, ImportAware,
|
||||
Ordered, InitializingBean {
|
||||
|
||||
private AnnotationMetadata metadata;
|
||||
|
||||
@Override
|
||||
public void setImportMetadata(AnnotationMetadata importMetadata) {
|
||||
this.metadata = importMetadata;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
|
||||
if (beanName.equals("testProcessing")) {
|
||||
return this.metadata;
|
||||
}
|
||||
return bean;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOrder() {
|
||||
return Ordered.HIGHEST_PRECEDENCE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
Assert.notNull(this.metadata, "Metadata was not injected");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user