Browse Source

Freeze configuration before invoking MBDPP instances

This commit updates refresh for AOT processing so that the configuration
is frozen before invoking MergedBeanDefinitionPostProcessor instances.
This makes sure that post-processed MergedBeanDefinitions are kept in
cache and not lost if a component attempts to clear the metadata cache.

Closes gh-28941
pull/28944/head
Stephane Nicoll 4 years ago
parent
commit
005713066c
  1. 1
      spring-context/src/main/java/org/springframework/context/support/GenericApplicationContext.java
  2. 13
      spring-context/src/test/java/org/springframework/context/support/GenericApplicationContextTests.java

1
spring-context/src/main/java/org/springframework/context/support/GenericApplicationContext.java

@ -406,6 +406,7 @@ public class GenericApplicationContext extends AbstractApplicationContext implem @@ -406,6 +406,7 @@ public class GenericApplicationContext extends AbstractApplicationContext implem
prepareBeanFactory(this.beanFactory);
postProcessBeanFactory(this.beanFactory);
invokeBeanFactoryPostProcessors(this.beanFactory);
this.beanFactory.freezeConfiguration();
PostProcessorRegistrationDelegate.invokeMergedBeanDefinitionPostProcessors(this.beanFactory);
}

13
spring-context/src/test/java/org/springframework/context/support/GenericApplicationContextTests.java

@ -409,6 +409,19 @@ class GenericApplicationContextTests { @@ -409,6 +409,19 @@ class GenericApplicationContextTests {
context.close();
}
@Test
void refreshForAotFreezeConfiguration() {
GenericApplicationContext context = new GenericApplicationContext();
context.registerBeanDefinition("test", new RootBeanDefinition(String.class));
MergedBeanDefinitionPostProcessor bpp = registerMockMergedBeanDefinitionPostProcessor(context);
context.refreshForAotProcessing();
RootBeanDefinition mergedBeanDefinition = getBeanDefinition(context, "test");
verify(bpp).postProcessMergedBeanDefinition(mergedBeanDefinition, String.class, "test");
context.getBeanFactory().clearMetadataCache();
assertThat(context.getBeanFactory().getMergedBeanDefinition("test")).isSameAs(mergedBeanDefinition);
context.close();
}
@Test
void refreshForAotInvokesBeanPostProcessorContractOnMergedBeanDefinitionPostProcessors() {
MergedBeanDefinitionPostProcessor bpp = new MergedBeanDefinitionPostProcessor() {

Loading…
Cancel
Save