diff --git a/core/spring-cloud-stream-test-binder/src/main/resources/META-INF/spring.binders b/core/spring-cloud-stream-test-binder/src/main/resources/META-INF/spring.binders new file mode 100644 index 000000000..9fd72cf81 --- /dev/null +++ b/core/spring-cloud-stream-test-binder/src/main/resources/META-INF/spring.binders @@ -0,0 +1,2 @@ +integration:\ +org.springframework.cloud.stream.binder.test.TestChannelBinderConfiguration diff --git a/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/DefaultBinderFactory.java b/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/DefaultBinderFactory.java index ac0326dfe..b6be30c65 100644 --- a/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/DefaultBinderFactory.java +++ b/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/DefaultBinderFactory.java @@ -341,7 +341,6 @@ public class DefaultBinderFactory implements BinderFactory, DisposableBean, Appl * @param configurationName binder configuration name * @return binder child application context that has not been refreshed */ - @SuppressWarnings("rawtypes") ConfigurableApplicationContext createBinderContextForAOT(String configurationName) { logger.info("Pre-creating binder child context (AOT) for " + configurationName); BinderConfiguration binderConfiguration = this.binderConfigurations.get(configurationName); @@ -411,7 +410,7 @@ public class DefaultBinderFactory implements BinderFactory, DisposableBean, Appl binderProducingContext.setParent(this.context); } else if (this.context != null) { - this.propagateSharedBeans(binderProducingContext); + this.propagateSharedBeans((GenericApplicationContext) this.context, binderProducingContext); binderProducingContext.addApplicationListener(new ApplicationListener() { @Override public void onApplicationEvent(ApplicationEvent event) { @@ -444,12 +443,14 @@ public class DefaultBinderFactory implements BinderFactory, DisposableBean, Appl if (refresh) { binderProducingContext.refresh(); } - + if ("integration".equals(binderType.getDefaultName())) { + this.propagateSharedBeans((GenericApplicationContext) this.context, binderProducingContext); + } return binderProducingContext; } - private void propagateSharedBeans(GenericApplicationContext binderProducingContext) { - GenericConversionService binderProducingConversionService = (GenericConversionService) binderProducingContext.getBeanFactory().getConversionService(); + private void propagateSharedBeans(GenericApplicationContext toContext, GenericApplicationContext fromContext) { + GenericConversionService binderProducingConversionService = (GenericConversionService) toContext.getBeanFactory().getConversionService(); try { Enumeration resources = ClassUtils.getDefaultClassLoader().getResources("META-INF/shared.beans"); while (resources.hasMoreElements()) { @@ -460,14 +461,14 @@ public class DefaultBinderFactory implements BinderFactory, DisposableBean, Appl for (Object className : classNames) { Class beanType = this.loadClass(((String) className).trim()); if (beanType != null) { - Map beansOfType = this.context.getBeansOfType(beanType); + Map beansOfType = fromContext.getBeansOfType(beanType); beansOfType.entrySet().stream().forEach(entry -> { Object bean = entry.getValue(); if (bean instanceof Converter) { binderProducingConversionService.addConverter((Converter) bean); } else { - binderProducingContext.registerBean(entry.getKey() + "_child", beanType, () -> entry.getValue()); + toContext.registerBean(entry.getKey() + "_child", beanType, () -> entry.getValue()); } }); } diff --git a/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BinderFactoryAutoConfiguration.java b/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BinderFactoryAutoConfiguration.java index 602e76dd1..34417e16c 100644 --- a/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BinderFactoryAutoConfiguration.java +++ b/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BinderFactoryAutoConfiguration.java @@ -173,16 +173,6 @@ public class BinderFactoryAutoConfiguration { try { Enumeration resources = classLoader.getResources("META-INF/spring.binders"); - // see if test binder is available on the classpath and if so add it to the binderTypes - try { - BinderType bt = new BinderType("integration", new Class[] { - classLoader.loadClass("org.springframework.cloud.stream.binder.test.TestChannelBinderConfiguration")}); - binderTypes.put("integration", bt); - } - catch (Exception e) { - // ignore. means test binder is not available - } - if (binderTypes.isEmpty() && !Boolean.valueOf(this.selfContained) && (resources == null || !resources.hasMoreElements())) { this.logger.debug( @@ -198,7 +188,6 @@ public class BinderFactoryAutoConfiguration { } } } - } catch (IOException | ClassNotFoundException e) { throw new BeanCreationException("Cannot create binder factory:", e); diff --git a/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BindingServiceConfiguration.java b/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BindingServiceConfiguration.java index 68a5ce16b..31a28128b 100644 --- a/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BindingServiceConfiguration.java +++ b/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BindingServiceConfiguration.java @@ -141,7 +141,7 @@ public class BindingServiceConfiguration { if (!existingBinderConfigurations.contains(binderEntry.getKey())) { binderConfigurations.put(binderEntry.getKey(), new BinderConfiguration(binderEntry.getKey(), new HashMap<>(), - true, !"integration".equals(binderEntry.getKey()))); + true, true)); // true, !"integration".equals(binderEntry.getKey()))); } } } diff --git a/core/spring-cloud-stream/src/main/resources/META-INF/shared.beans b/core/spring-cloud-stream/src/main/resources/META-INF/shared.beans index 93310e0ad..2ed13f098 100644 --- a/core/spring-cloud-stream/src/main/resources/META-INF/shared.beans +++ b/core/spring-cloud-stream/src/main/resources/META-INF/shared.beans @@ -10,3 +10,5 @@ org.springframework.kafka.config.KafkaStreamsCustomizer org.springframework.rabbit.stream.listener.ConsumerCustomizer org.springframework.amqp.core.DeclarableCustomizer org.springframework.cloud.stream.config.ProducerMessageHandlerCustomizer +org.springframework.cloud.stream.binder.test.InputDestination +org.springframework.cloud.stream.binder.test.OutputDestination