From b66abbf02749cc31b1bcf67e9d70cf2f8c2c3868 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Tue, 11 Aug 2020 12:11:57 +0100 Subject: [PATCH] Prefer non-reflective access to ConfigurationClassPostProcessor If the ConfigurationClassPostProcessor has been provided via an instance supplier then we can use that to set the MetadataReaderFactory non-reflectively, instead of using a PropertyValue (and the BeanWrapper eventually). The old behaviour is left as a fallback - probably without a change in Spring Framework it will continue to be the default. --- ...tadataReaderFactoryContextInitializer.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/SharedMetadataReaderFactoryContextInitializer.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/SharedMetadataReaderFactoryContextInitializer.java index 017a4a34460e..fe3cbea77079 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/SharedMetadataReaderFactoryContextInitializer.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/SharedMetadataReaderFactoryContextInitializer.java @@ -16,6 +16,8 @@ package org.springframework.boot.autoconfigure; +import java.util.function.Supplier; + import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.beans.factory.FactoryBean; @@ -23,6 +25,7 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.RuntimeBeanReference; +import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; @@ -53,7 +56,7 @@ class SharedMetadataReaderFactoryContextInitializer @Override public void initialize(ConfigurableApplicationContext applicationContext) { - applicationContext.addBeanFactoryPostProcessor(new CachingMetadataReaderFactoryPostProcessor()); + applicationContext.addBeanFactoryPostProcessor(new CachingMetadataReaderFactoryPostProcessor(applicationContext)); } @Override @@ -69,6 +72,12 @@ public int getOrder() { private static class CachingMetadataReaderFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered { + private ConfigurableApplicationContext context; + + CachingMetadataReaderFactoryPostProcessor(ConfigurableApplicationContext context) { + this.context = context; + } + @Override public int getOrder() { // Must happen before the ConfigurationClassPostProcessor is created @@ -96,12 +105,28 @@ private void configureConfigurationClassPostProcessor(BeanDefinitionRegistry reg try { BeanDefinition definition = registry .getBeanDefinition(AnnotationConfigUtils.CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME); + if (definition instanceof AbstractBeanDefinition) { + AbstractBeanDefinition bean = (AbstractBeanDefinition) definition; + if (bean.getInstanceSupplier() != null) { + Supplier supplier = bean.getInstanceSupplier(); + bean.setInstanceSupplier(() -> modify(supplier)); + return; + } + } definition.getPropertyValues().add("metadataReaderFactory", new RuntimeBeanReference(BEAN_NAME)); } catch (NoSuchBeanDefinitionException ex) { } } + private Object modify(Supplier supplier) { + Object object = supplier.get(); + if (object instanceof ConfigurationClassPostProcessor) { + ((ConfigurationClassPostProcessor) object).setMetadataReaderFactory(this.context.getBean(BEAN_NAME, MetadataReaderFactory.class)); + } + return object; + } + } /**