From 005713066cd68ecfab9b16955ebcd4954f7b487d Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 9 Aug 2022 13:26:47 +0200 Subject: [PATCH] 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 --- .../context/support/GenericApplicationContext.java | 1 + .../support/GenericApplicationContextTests.java | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/spring-context/src/main/java/org/springframework/context/support/GenericApplicationContext.java b/spring-context/src/main/java/org/springframework/context/support/GenericApplicationContext.java index a9377f57006..0cddc626928 100644 --- a/spring-context/src/main/java/org/springframework/context/support/GenericApplicationContext.java +++ b/spring-context/src/main/java/org/springframework/context/support/GenericApplicationContext.java @@ -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); } diff --git a/spring-context/src/test/java/org/springframework/context/support/GenericApplicationContextTests.java b/spring-context/src/test/java/org/springframework/context/support/GenericApplicationContextTests.java index d44cf7172b6..aa85cefe459 100644 --- a/spring-context/src/test/java/org/springframework/context/support/GenericApplicationContextTests.java +++ b/spring-context/src/test/java/org/springframework/context/support/GenericApplicationContextTests.java @@ -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() {