Skip to content

Commit

Permalink
GH-8611: Extract IntegrationConfigurationReport (#8660)
Browse files Browse the repository at this point in the history
Fixes #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`
  • Loading branch information
artembilan committed Jun 27, 2023
1 parent 65c7e5d commit 13980af
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 21 deletions.
Expand Up @@ -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;
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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)
Expand Down
@@ -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<ContextRefreshedEvent> {

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);
}
}

}

0 comments on commit 13980af

Please sign in to comment.