From d30df45e26b9aa1739992a6eb28f434e48619c07 Mon Sep 17 00:00:00 2001 From: abilan Date: Tue, 27 Jun 2023 11:59:30 -0400 Subject: [PATCH] GH-8611: Extract `IntegrationConfigurationReport` Fixes https://github.com/spring-projects/spring-integration/issues/8611 According to the latest Spring Framework requirements related to AOT the `BeanDefinitionRegistryPostProcessor` must not do anything but only bean registrations * Extract an `IntegrationConfigurationReport` component and move `IntegrationProperties` printing over here out from the `DefaultConfiguringBeanFactoryPostProcessor` * Remove a `SmartInitializingSingleton` impl from the `DefaultConfiguringBeanFactoryPostProcessor` --- ...ltConfiguringBeanFactoryPostProcessor.java | 31 +++----- .../IntegrationConfigurationReport.java | 77 +++++++++++++++++++ 2 files changed, 87 insertions(+), 21 deletions(-) create mode 100644 spring-integration-core/src/main/java/org/springframework/integration/config/IntegrationConfigurationReport.java diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/DefaultConfiguringBeanFactoryPostProcessor.java b/spring-integration-core/src/main/java/org/springframework/integration/config/DefaultConfiguringBeanFactoryPostProcessor.java index 6b8037427a1..e5782bb7e7b 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/DefaultConfiguringBeanFactoryPostProcessor.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/DefaultConfiguringBeanFactoryPostProcessor.java @@ -16,17 +16,14 @@ package org.springframework.integration.config; -import java.io.PrintWriter; -import java.io.StringWriter; +import java.beans.Introspector; import java.util.HashSet; -import java.util.Properties; import java.util.Set; import java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.HierarchicalBeanFactory; -import org.springframework.beans.factory.SmartInitializingSingleton; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.PropertiesFactoryBean; @@ -74,8 +71,7 @@ * * @see IntegrationContextUtils */ -public class DefaultConfiguringBeanFactoryPostProcessor - implements BeanDefinitionRegistryPostProcessor, SmartInitializingSingleton { +public class DefaultConfiguringBeanFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor { private static final LogAccessor LOGGER = new LogAccessor(DefaultConfiguringBeanFactoryPostProcessor.class); @@ -130,27 +126,13 @@ public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) t registerArgumentResolverMessageConverter(); registerMessageHandlerMethodFactory(); registerListMessageHandlerMethodFactory(); + registerIntegrationConfigurationReport(); } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { } - @Override - public void afterSingletonsInstantiated() { - if (LOGGER.isDebugEnabled()) { - Properties integrationProperties = - IntegrationContextUtils.getIntegrationProperties(this.beanFactory) - .toProperties(); - - StringWriter writer = new StringWriter(); - integrationProperties.list(new PrintWriter(writer)); - StringBuffer propertiesBuffer = writer.getBuffer() - .delete(0, "-- listing properties --".length()); - LOGGER.debug("\nSpring Integration global properties:\n" + propertiesBuffer); - } - } - private void registerBeanFactoryChannelResolver() { if (!this.beanFactory.containsBeanDefinition(ChannelResolverUtils.CHANNEL_RESOLVER_BEAN_NAME)) { this.registry.registerBeanDefinition(ChannelResolverUtils.CHANNEL_RESOLVER_BEAN_NAME, @@ -450,6 +432,13 @@ private void registerListMessageHandlerMethodFactory() { } } + private void registerIntegrationConfigurationReport() { + this.registry.registerBeanDefinition(Introspector.decapitalize(IntegrationConfigurationReport.class.getName()), + BeanDefinitionBuilder.genericBeanDefinition(IntegrationConfigurationReport.class) + .setRole(BeanDefinition.ROLE_INFRASTRUCTURE) + .getBeanDefinition()); + } + private static BeanDefinitionBuilder createMessageHandlerMethodFactoryBeanDefinition(boolean listCapable) { return BeanDefinitionBuilder.genericBeanDefinition(IntegrationMessageHandlerMethodFactory.class) .addConstructorArgValue(listCapable) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/IntegrationConfigurationReport.java b/spring-integration-core/src/main/java/org/springframework/integration/config/IntegrationConfigurationReport.java new file mode 100644 index 00000000000..95f7ed8d8b8 --- /dev/null +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/IntegrationConfigurationReport.java @@ -0,0 +1,77 @@ +/* + * Copyright 2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.config; + + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.Properties; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.ApplicationListener; +import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.core.log.LogAccessor; +import org.springframework.integration.context.IntegrationContextUtils; + +/** + * An {@link org.springframework.beans.factory.config.BeanDefinition#ROLE_INFRASTRUCTURE} + * component to report Spring Integration relevant configuration state after application context is refreshed. + * + * @author Artem Bilan + * + * @since 6.2 + */ +class IntegrationConfigurationReport + implements ApplicationContextAware, ApplicationListener { + + private static final LogAccessor LOGGER = new LogAccessor(IntegrationConfigurationReport.class); + + private ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext; + } + + @Override + public void onApplicationEvent(ContextRefreshedEvent event) { + if (event.getApplicationContext().equals(this.applicationContext)) { + report(); + } + } + + private void report() { + printIntegrationProperties(); + } + + private void printIntegrationProperties() { + if (LOGGER.isDebugEnabled()) { + Properties integrationProperties = + IntegrationContextUtils.getIntegrationProperties(this.applicationContext) + .toProperties(); + + StringWriter writer = new StringWriter(); + integrationProperties.list(new PrintWriter(writer)); + StringBuffer propertiesBuffer = writer.getBuffer() + .delete(0, "-- listing properties --".length()); + LOGGER.debug("\nSpring Integration global properties:\n" + propertiesBuffer); + } + } + +}