diff --git a/README.adoc b/README.adoc index 46e99f272..c3867a526 100644 --- a/README.adoc +++ b/README.adoc @@ -2,7 +2,7 @@ image::https://travis-ci.org/spring-cloud/spring-cloud-stream.svg?branch=master[Build Status, link=https://travis-ci.org/spring-cloud/spring-cloud-stream] -This project allows a user to develop and run messaging microservices using Spring Integration and run them locally, or in the cloud, or even on Spring XD. Just add `@EnableModule` and run your app as a Spring Boot app (single application context). You just need to connect to the physical broker for the bus, which is automatic if the relevant bus implementation is available on the classpath. The sample uses Redis. +This project allows a user to develop and run messaging microservices using Spring Integration and run them locally, or in the cloud, or even on Spring XD. Just add `@EnableBinding` and run your app as a Spring Boot app (single application context). You just need to connect to the physical broker for the bindings, which is automatic if the relevant binder implementation is available on the classpath. The sample uses Redis. Here's a sample source module (output channel only): @@ -19,7 +19,7 @@ public class ModuleApplication { } @Configuration -@EnableModule(Source.class) +@EnableBinding(Source.class) public class TimerSource { @Value("${format}") @@ -34,7 +34,7 @@ public class TimerSource { } ---- -`@EnableModule` is parameterized by an interface (in this case `Source`) which declares input and output channels. `Source`, `Sink` and `Processor` are provided off the shelf, but you can define others. Here's the definition of `Source` +`@EnableBinding` is parameterized by an interface (in this case `Source`) which declares input and output channels. `Source`, `Sink` and `Processor` are provided off the shelf, but you can define others. Here's the definition of `Source`: [source,java] ---- @@ -65,7 +65,7 @@ public class ModuleApplicationTests { } ---- -NOTE: In this case there is only one `Source` in the application context so there is no need to qualify it when it is autowired. If there is ambiguity, e.g. if you are composing one module from some others, you can use `@ModuleChannels` qualifier to inject a specific channel set. The `@ModuleChannels` qualifier takes a parameter which is the class that carries the `@EnableModule` annotation (in this case the `TimerSource`). +NOTE: In this case there is only one `Source` in the application context so there is no need to qualify it when it is autowired. If there is ambiguity, e.g. if you are composing one module from some others, you can use `@Bindings` qualifier to inject a specific channel set. The `@Bindings` qualifier takes a parameter which is the class that carries the `@EnableBinding` annotation (in this case the `TimerSource`). == Multiple Input or Output Channels diff --git a/docs/src/main/asciidoc/intro.adoc b/docs/src/main/asciidoc/intro.adoc index 90ef7a53d..8c88bce0a 100644 --- a/docs/src/main/asciidoc/intro.adoc +++ b/docs/src/main/asciidoc/intro.adoc @@ -1,4 +1,4 @@ -This project allows a user to develop and run messaging microservices using Spring Integration and run them locally, or in the cloud, or even on Spring XD. Just add `@EnableModule` and run your app as a Spring Boot app (single application context). You just need to connect to the physical broker for the bus, which is automatic if the relevant bus implementation is available on the classpath. The sample uses Redis. +This project allows a user to develop and run messaging microservices using Spring Integration and run them locally, or in the cloud, or even on Spring XD. Just add `@EnableBinding` and run your app as a Spring Boot app (single application context). You just need to connect to the physical broker for the bindings, which is automatic if the relevant binder implementation is available on the classpath. The sample uses Redis. Here's a sample source module (output channel only): @@ -15,7 +15,7 @@ public class ModuleApplication { } @Configuration -@EnableModule(Source.class) +@EnableBinding(Source.class) public class TimerSource { @Value("${format}") @@ -30,7 +30,7 @@ public class TimerSource { } ---- -`@EnableModule` is parameterized by an interface (in this case `Source`) which declares input and output channels. `Source`, `Sink` and `Processor` are provided off the shelf, but you can define others. Here's the definition of `Source` +`@EnableBinding` is parameterized by an interface (in this case `Source`) which declares input and output channels. `Source`, `Sink` and `Processor` are provided off the shelf, but you can define others. Here's the definition of `Source`: [source,java] ---- @@ -61,7 +61,7 @@ public class ModuleApplicationTests { } ---- -NOTE: In this case there is only one `Source` in the application context so there is no need to qualify it when it is autowired. If there is ambiguity, e.g. if you are composing one module from some others, you can use `@ModuleChannels` qualifier to inject a specific channel set. The `@ModuleChannels` qualifier takes a parameter which is the class that carries the `@EnableModule` annotation (in this case the `TimerSource`). +NOTE: In this case there is only one `Source` in the application context so there is no need to qualify it when it is autowired. If there is ambiguity, e.g. if you are composing one module from some others, you can use `@Bindings` qualifier to inject a specific channel set. The `@Bindings` qualifier takes a parameter which is the class that carries the `@EnableBinding` annotation (in this case the `TimerSource`). == Multiple Input or Output Channels diff --git a/spring-cloud-stream-samples/double/src/main/java/config/sink/SinkModuleDefinition.java b/spring-cloud-stream-samples/double/src/main/java/config/sink/SinkModuleDefinition.java index 6f6d4002a..995ff6293 100644 --- a/spring-cloud-stream-samples/double/src/main/java/config/sink/SinkModuleDefinition.java +++ b/spring-cloud-stream-samples/double/src/main/java/config/sink/SinkModuleDefinition.java @@ -18,15 +18,15 @@ package config.sink; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.cloud.stream.annotation.EnableModule; -import org.springframework.cloud.stream.annotation.Sink; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.messaging.Sink; import org.springframework.integration.annotation.ServiceActivator; /** * @author Dave Syer * @author Marius Bogoevici */ -@EnableModule(Sink.class) +@EnableBinding(Sink.class) public class SinkModuleDefinition { private static Logger logger = LoggerFactory.getLogger(SinkModuleDefinition.class); diff --git a/spring-cloud-stream-samples/double/src/main/java/config/source/SourceModuleDefinition.java b/spring-cloud-stream-samples/double/src/main/java/config/source/SourceModuleDefinition.java index 8d04e6a4f..215688750 100644 --- a/spring-cloud-stream-samples/double/src/main/java/config/source/SourceModuleDefinition.java +++ b/spring-cloud-stream-samples/double/src/main/java/config/source/SourceModuleDefinition.java @@ -19,9 +19,8 @@ package config.source; import java.text.SimpleDateFormat; import java.util.Date; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.cloud.stream.annotation.EnableModule; -import org.springframework.cloud.stream.annotation.Source; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.messaging.Source; import org.springframework.context.annotation.Bean; import org.springframework.integration.annotation.InboundChannelAdapter; import org.springframework.integration.annotation.Poller; @@ -32,7 +31,7 @@ import org.springframework.messaging.support.GenericMessage; * @author Dave Syer * @author Marius Bogoevici */ -@EnableModule(Source.class) +@EnableBinding(Source.class) public class SourceModuleDefinition { private String format = "yyyy-MM-dd HH:mm:ss"; diff --git a/spring-cloud-stream-samples/sink/src/main/java/demo/LogSink.java b/spring-cloud-stream-samples/sink/src/main/java/demo/LogSink.java index bd605ac72..8caaaf13e 100644 --- a/spring-cloud-stream-samples/sink/src/main/java/demo/LogSink.java +++ b/spring-cloud-stream-samples/sink/src/main/java/demo/LogSink.java @@ -18,15 +18,15 @@ package demo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.cloud.stream.annotation.EnableModule; -import org.springframework.cloud.stream.annotation.Sink; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.messaging.Sink; import org.springframework.integration.annotation.ServiceActivator; /** * @author Dave Syer * */ -@EnableModule(Sink.class) +@EnableBinding(Sink.class) public class LogSink { private static Logger logger = LoggerFactory.getLogger(LogSink.class); diff --git a/spring-cloud-stream-samples/sink/src/test/java/demo/ModuleApplicationTests.java b/spring-cloud-stream-samples/sink/src/test/java/demo/ModuleApplicationTests.java index 472e8bf62..f2a02f225 100644 --- a/spring-cloud-stream-samples/sink/src/test/java/demo/ModuleApplicationTests.java +++ b/spring-cloud-stream-samples/sink/src/test/java/demo/ModuleApplicationTests.java @@ -22,10 +22,10 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.cloud.stream.annotation.ModuleChannels; +import org.springframework.cloud.stream.annotation.Bindings; import org.springframework.cloud.stream.annotation.Output; -import org.springframework.cloud.stream.annotation.Sink; -import org.springframework.cloud.stream.annotation.Source; +import org.springframework.cloud.stream.messaging.Sink; +import org.springframework.cloud.stream.messaging.Source; import org.springframework.messaging.MessageChannel; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -38,7 +38,7 @@ import org.springframework.test.context.web.WebAppConfiguration; public class ModuleApplicationTests { @Autowired - @ModuleChannels(LogSink.class) + @Bindings(LogSink.class) private Sink sink; @Autowired diff --git a/spring-cloud-stream-samples/source/src/main/java/demo/TimeSource.java b/spring-cloud-stream-samples/source/src/main/java/demo/TimeSource.java index 30da08a90..77d909aeb 100644 --- a/spring-cloud-stream-samples/source/src/main/java/demo/TimeSource.java +++ b/spring-cloud-stream-samples/source/src/main/java/demo/TimeSource.java @@ -21,8 +21,8 @@ import java.util.Date; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.cloud.stream.annotation.EnableModule; -import org.springframework.cloud.stream.annotation.Source; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.messaging.Source; import org.springframework.context.annotation.Bean; import org.springframework.integration.annotation.InboundChannelAdapter; import org.springframework.integration.annotation.Poller; @@ -34,7 +34,7 @@ import org.springframework.messaging.support.GenericMessage; * @author Glenn Renfro * */ -@EnableModule(Source.class) +@EnableBinding(Source.class) @EnableConfigurationProperties(TimeSourceOptionsMetadata.class) public class TimeSource { diff --git a/spring-cloud-stream-samples/tap/src/main/java/demo/TappingLoggingSink.java b/spring-cloud-stream-samples/tap/src/main/java/demo/TappingLoggingSink.java index acb3d208a..aeeaa0fbc 100644 --- a/spring-cloud-stream-samples/tap/src/main/java/demo/TappingLoggingSink.java +++ b/spring-cloud-stream-samples/tap/src/main/java/demo/TappingLoggingSink.java @@ -18,15 +18,15 @@ package demo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.cloud.stream.annotation.EnableModule; -import org.springframework.cloud.stream.annotation.Sink; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.messaging.Sink; import org.springframework.integration.annotation.ServiceActivator; /** * @author Dave Syer * @author Marius Bogoevici */ -@EnableModule(Sink.class) +@EnableBinding(Sink.class) public class TappingLoggingSink { private static Logger logger = LoggerFactory.getLogger(TappingLoggingSink.class); diff --git a/spring-cloud-stream-samples/transform/src/main/java/demo/LoggingTransformer.java b/spring-cloud-stream-samples/transform/src/main/java/demo/LoggingTransformer.java index d6557734d..9bcfdc587 100644 --- a/spring-cloud-stream-samples/transform/src/main/java/demo/LoggingTransformer.java +++ b/spring-cloud-stream-samples/transform/src/main/java/demo/LoggingTransformer.java @@ -19,15 +19,15 @@ package demo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.cloud.stream.annotation.EnableModule; -import org.springframework.cloud.stream.annotation.Processor; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.messaging.Processor; import org.springframework.integration.annotation.ServiceActivator; /** * @author Dave Syer * */ -@EnableModule(Processor.class) +@EnableBinding(Processor.class) @ConfigurationProperties("module.logging") public class LoggingTransformer { diff --git a/spring-cloud-stream-test-support/src/main/java/org/springframework/cloud/stream/test/matcher/MessageQueueMatcher.java b/spring-cloud-stream-test-support/src/main/java/org/springframework/cloud/stream/test/matcher/MessageQueueMatcher.java index b8b627ed3..3069a1b1e 100644 --- a/spring-cloud-stream-test-support/src/main/java/org/springframework/cloud/stream/test/matcher/MessageQueueMatcher.java +++ b/spring-cloud-stream-test-support/src/main/java/org/springframework/cloud/stream/test/matcher/MessageQueueMatcher.java @@ -38,7 +38,7 @@ import org.springframework.messaging.Message; * public class TransformProcessorApplicationTests { * * {@literal @}Autowired - * {@literal @}ModuleChannels(TransformProcessor.class) + * {@literal @}Bindings(TransformProcessor.class) * private Processor processor; * * {@literal @}Autowired diff --git a/spring-cloud-stream-test-support/src/test/java/org/springframework/cloud/stream/test/ExampleTest.java b/spring-cloud-stream-test-support/src/test/java/org/springframework/cloud/stream/test/ExampleTest.java index 83a2e5302..4e4124208 100644 --- a/spring-cloud-stream-test-support/src/test/java/org/springframework/cloud/stream/test/ExampleTest.java +++ b/spring-cloud-stream-test-support/src/test/java/org/springframework/cloud/stream/test/ExampleTest.java @@ -26,11 +26,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.test.IntegrationTest; import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.cloud.stream.annotation.EnableModule; -import org.springframework.cloud.stream.annotation.ModuleChannels; -import org.springframework.cloud.stream.annotation.Processor; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.annotation.Bindings; +import org.springframework.cloud.stream.messaging.Processor; import org.springframework.cloud.stream.test.binder.MessageCollector; -import org.springframework.cloud.stream.test.binder.TestSupportBinder; import org.springframework.integration.annotation.Transformer; import org.springframework.messaging.Message; import org.springframework.messaging.support.GenericMessage; @@ -48,7 +47,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; public class ExampleTest { @Autowired - @ModuleChannels(MyProcessor.class) + @Bindings(MyProcessor.class) private Processor processor; @Autowired @@ -65,7 +64,7 @@ public class ExampleTest { @SpringBootApplication - @EnableModule(Processor.class) + @EnableBinding(Processor.class) public static class MyProcessor { @Autowired diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/aggregate/AggregateApplication.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/aggregate/AggregateApplication.java index 3c6505ac0..60d0c322b 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/aggregate/AggregateApplication.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/aggregate/AggregateApplication.java @@ -19,10 +19,10 @@ package org.springframework.cloud.stream.aggregate; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.cloud.stream.annotation.EnableModule; -import org.springframework.cloud.stream.annotation.Processor; -import org.springframework.cloud.stream.annotation.Sink; -import org.springframework.cloud.stream.annotation.Source; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.messaging.Processor; +import org.springframework.cloud.stream.messaging.Sink; +import org.springframework.cloud.stream.messaging.Source; import org.springframework.cloud.stream.binding.BindableProxyFactory; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; @@ -129,7 +129,7 @@ public class AggregateApplication { * Basic configuration for a parent */ @EnableAutoConfiguration - @EnableModule + @EnableBinding public static class AggregatorParentConfiguration { @Bean diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/ModuleChannels.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/Bindings.java similarity index 88% rename from spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/ModuleChannels.java rename to spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/Bindings.java index 754f7730b..ac68d78e7 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/ModuleChannels.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/Bindings.java @@ -26,10 +26,11 @@ import java.lang.annotation.Target; import org.springframework.beans.factory.annotation.Qualifier; /** - * Indicates an instance of a channels interface containing methods returning named - * message channels. + * Indicates an instance of an interface containing methods returning bound + * inputs and outputs. * * @author Dave Syer + * @author Marius Bogoevici */ @Qualifier @@ -37,7 +38,7 @@ import org.springframework.beans.factory.annotation.Qualifier; @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented -public @interface ModuleChannels { +public @interface Bindings { Class value(); diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/EnableModule.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/EnableBinding.java similarity index 84% rename from spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/EnableModule.java rename to spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/EnableBinding.java index 22cf438e6..4f423414a 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/EnableModule.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/EnableBinding.java @@ -31,7 +31,8 @@ import org.springframework.context.annotation.Import; import org.springframework.integration.config.EnableIntegration; /** - * Annotation that identifies a class as a module. + * Enables the binding of inputs and outputs to a broker, according to the list + * of interfaces passed as value to the annotation. * * @author Dave Syer * @author Marius Bogoevici @@ -44,8 +45,12 @@ import org.springframework.integration.config.EnableIntegration; @Configuration @Import({ChannelBindingServiceConfiguration.class, AggregateBuilderConfiguration.class, BindingBeansRegistrar.class}) @EnableIntegration -public @interface EnableModule { +public @interface EnableBinding { + /** + * A list of interfaces having methods annotated with {@link Input} and/or + * {@link Output} to indicate bindable components. + */ Class[] value() default {}; } diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binding/BindableProxyFactory.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binding/BindableProxyFactory.java index 05f09c313..2c42ce4e2 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binding/BindableProxyFactory.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binding/BindableProxyFactory.java @@ -35,6 +35,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.cloud.stream.aggregate.SharedChannelRegistry; +import org.springframework.cloud.stream.annotation.EnableBinding; import org.springframework.cloud.stream.annotation.Input; import org.springframework.cloud.stream.annotation.Output; import org.springframework.cloud.stream.binder.MessageChannelBinderSupport; @@ -52,12 +53,12 @@ import org.springframework.util.ReflectionUtils; /** * {@link FactoryBean} for instantiating the interfaces specified via - * {@link org.springframework.cloud.stream.annotation.EnableModule} + * {@link EnableBinding} * * @author Marius Bogoevici * @author David Syer * - * @see org.springframework.cloud.stream.annotation.EnableModule + * @see EnableBinding */ public class BindableProxyFactory implements MethodInterceptor, FactoryBean, BeanFactoryAware, Bindable, InitializingBean { diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binding/BindingBeanDefinitionRegistryUtils.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binding/BindingBeanDefinitionRegistryUtils.java index 615cc5fbb..7b2ded5a3 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binding/BindingBeanDefinitionRegistryUtils.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binding/BindingBeanDefinitionRegistryUtils.java @@ -25,8 +25,8 @@ import java.util.Map; import org.springframework.beans.factory.support.AutowireCandidateQualifier; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.RootBeanDefinition; +import org.springframework.cloud.stream.annotation.Bindings; import org.springframework.cloud.stream.annotation.Input; -import org.springframework.cloud.stream.annotation.ModuleChannels; import org.springframework.cloud.stream.annotation.Output; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.util.ReflectionUtils; @@ -70,7 +70,6 @@ public abstract class BindingBeanDefinitionRegistryUtils { public static void registerChannelBeanDefinitions(Class type, final String channelInterfaceBeanName, final BeanDefinitionRegistry registry) { - final List channelNames = new ArrayList<>(); ReflectionUtils.doWithMethods(type, new MethodCallback() { @Override public void doWith(Method method) throws IllegalArgumentException, @@ -99,7 +98,7 @@ public abstract class BindingBeanDefinitionRegistryUtils { RootBeanDefinition rootBeanDefinition = new RootBeanDefinition( BindableProxyFactory.class); rootBeanDefinition.addQualifier(new AutowireCandidateQualifier( - ModuleChannels.class, parent)); + Bindings.class, parent)); rootBeanDefinition.getConstructorArgumentValues().addGenericArgumentValue( type); registry.registerBeanDefinition(type.getName(), rootBeanDefinition); @@ -107,7 +106,7 @@ public abstract class BindingBeanDefinitionRegistryUtils { else { RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(type); rootBeanDefinition.addQualifier(new AutowireCandidateQualifier( - ModuleChannels.class, parent)); + Bindings.class, parent)); registry.registerBeanDefinition(type.getName(), rootBeanDefinition); } } diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BindingBeansRegistrar.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BindingBeansRegistrar.java index 5eb619a47..900896e65 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BindingBeansRegistrar.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BindingBeansRegistrar.java @@ -20,7 +20,7 @@ import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.cloud.stream.annotation.EnableModule; +import org.springframework.cloud.stream.annotation.EnableBinding; import org.springframework.cloud.stream.binding.BindingBeanDefinitionRegistryUtils; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.core.type.AnnotationMetadata; @@ -37,9 +37,8 @@ public class BindingBeansRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { - MultiValueMap attributes = metadata.getAllAnnotationAttributes( - EnableModule.class.getName(), false); - List registeredChannelNames = new ArrayList<>(); + MultiValueMap attributes = metadata.getAllAnnotationAttributes(EnableBinding.class.getName(), + false); for (Class type : collectClasses(attributes.get("value"))) { BindingBeanDefinitionRegistryUtils.registerChannelBeanDefinitions(type, type.getName(), registry); BindingBeanDefinitionRegistryUtils.registerChannelsQualifiedBeanDefinitions( diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/Processor.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/messaging/Processor.java similarity index 73% rename from spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/Processor.java rename to spring-cloud-stream/src/main/java/org/springframework/cloud/stream/messaging/Processor.java index 5a911ccbe..88bb661f4 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/Processor.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/messaging/Processor.java @@ -14,8 +14,15 @@ * limitations under the License. */ -package org.springframework.cloud.stream.annotation; +package org.springframework.cloud.stream.messaging; +/** + * Bindable interface with one input and one output channel. + * + * @see org.springframework.cloud.stream.annotation.EnableBinding + * @author Dave Syer + * @author Marius Bogoevici + */ public interface Processor extends Source, Sink { } diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/Sink.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/messaging/Sink.java similarity index 71% rename from spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/Sink.java rename to spring-cloud-stream/src/main/java/org/springframework/cloud/stream/messaging/Sink.java index 4c2d3491e..6b1490bb5 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/Sink.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/messaging/Sink.java @@ -14,13 +14,21 @@ * limitations under the License. */ -package org.springframework.cloud.stream.annotation; +package org.springframework.cloud.stream.messaging; +import org.springframework.cloud.stream.annotation.Input; import org.springframework.messaging.SubscribableChannel; +/** + * Bindable interface with one input channel. + * + * @see org.springframework.cloud.stream.annotation.EnableBinding + * @author Dave Syer + * @author Marius Bogoevici + */ public interface Sink { - public static String INPUT = "input"; + String INPUT = "input"; @Input(Sink.INPUT) SubscribableChannel input(); diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/Source.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/messaging/Source.java similarity index 70% rename from spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/Source.java rename to spring-cloud-stream/src/main/java/org/springframework/cloud/stream/messaging/Source.java index 9a572a0d0..9a2d819b8 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/annotation/Source.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/messaging/Source.java @@ -14,13 +14,21 @@ * limitations under the License. */ -package org.springframework.cloud.stream.annotation; +package org.springframework.cloud.stream.messaging; +import org.springframework.cloud.stream.annotation.Output; import org.springframework.messaging.MessageChannel; +/** + * Bindable interface with one output channel. + * + * @see org.springframework.cloud.stream.annotation.EnableBinding + * @author Dave Syer + * @author Marius Bogoevici + */ public interface Source { - public static String OUTPUT = "output"; + String OUTPUT = "output"; @Output(Source.OUTPUT) MessageChannel output(); diff --git a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/aggregation/ModuleAggregationTest.java b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/aggregation/ModuleAggregationTest.java index 2d5b952db..cd1161ec5 100644 --- a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/aggregation/ModuleAggregationTest.java +++ b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/aggregation/ModuleAggregationTest.java @@ -25,9 +25,9 @@ import org.junit.Test; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.cloud.stream.aggregate.AggregateApplication; import org.springframework.cloud.stream.aggregate.SharedChannelRegistry; -import org.springframework.cloud.stream.annotation.EnableModule; -import org.springframework.cloud.stream.annotation.Processor; -import org.springframework.cloud.stream.annotation.Source; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.messaging.Processor; +import org.springframework.cloud.stream.messaging.Source; import org.springframework.context.ConfigurableApplicationContext; /** @@ -46,13 +46,13 @@ public class ModuleAggregationTest { } - @EnableModule(Source.class) + @EnableBinding(Source.class) @EnableAutoConfiguration public static class TestSource { } - @EnableModule(Processor.class) + @EnableBinding(Processor.class) @EnableAutoConfiguration public static class TestProcessor { diff --git a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/ArbitraryInterfaceBindingTestsWithBindingTargets.java b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/ArbitraryInterfaceBindingTestsWithBindingTargets.java index 158e4a28a..d86a2c813 100644 --- a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/ArbitraryInterfaceBindingTestsWithBindingTargets.java +++ b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/ArbitraryInterfaceBindingTestsWithBindingTargets.java @@ -29,8 +29,8 @@ import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.cloud.stream.annotation.EnableModule; -import org.springframework.cloud.stream.annotation.ModuleChannels; +import org.springframework.cloud.stream.annotation.Bindings; +import org.springframework.cloud.stream.annotation.EnableBinding; import org.springframework.cloud.stream.utils.MockBinderConfiguration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.PropertySource; @@ -44,7 +44,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; public class ArbitraryInterfaceBindingTestsWithBindingTargets { @Autowired - @ModuleChannels(ArbitraryInterfaceBindingTestsWithBindingTargets.TestFooChannels.class) + @Bindings(ArbitraryInterfaceBindingTestsWithBindingTargets.TestFooChannels.class) public FooChannels fooChannels; @SuppressWarnings("rawtypes") @@ -61,7 +61,7 @@ public class ArbitraryInterfaceBindingTestsWithBindingTargets { verifyNoMoreInteractions(binder); } - @EnableModule(FooChannels.class) + @EnableBinding(FooChannels.class) @EnableAutoConfiguration @Import(MockBinderConfiguration.class) @PropertySource("classpath:/org/springframework/cloud/stream/binder/arbitrary-binding-test.properties") diff --git a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/ArbitraryInterfaceBindingTestsWithDefaults.java b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/ArbitraryInterfaceBindingTestsWithDefaults.java index b02b97950..5b04bece4 100644 --- a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/ArbitraryInterfaceBindingTestsWithDefaults.java +++ b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/ArbitraryInterfaceBindingTestsWithDefaults.java @@ -29,8 +29,8 @@ import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.cloud.stream.annotation.EnableModule; -import org.springframework.cloud.stream.annotation.ModuleChannels; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.annotation.Bindings; import org.springframework.cloud.stream.utils.MockBinderConfiguration; import org.springframework.context.annotation.Import; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -43,7 +43,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; public class ArbitraryInterfaceBindingTestsWithDefaults { @Autowired - @ModuleChannels(ArbitraryInterfaceBindingTestsWithDefaults.TestFooChannels.class) + @Bindings(ArbitraryInterfaceBindingTestsWithDefaults.TestFooChannels.class) public FooChannels fooChannels; @SuppressWarnings("rawtypes") @@ -60,7 +60,7 @@ public class ArbitraryInterfaceBindingTestsWithDefaults { verifyNoMoreInteractions(binder); } - @EnableModule(FooChannels.class) + @EnableBinding(FooChannels.class) @EnableAutoConfiguration @Import(MockBinderConfiguration.class) public static class TestFooChannels { diff --git a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/ProcessorBindingTestsWithBindingTargets.java b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/ProcessorBindingTestsWithBindingTargets.java index b4dd811f5..9527a9310 100644 --- a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/ProcessorBindingTestsWithBindingTargets.java +++ b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/ProcessorBindingTestsWithBindingTargets.java @@ -28,9 +28,9 @@ import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.cloud.stream.annotation.EnableModule; -import org.springframework.cloud.stream.annotation.ModuleChannels; -import org.springframework.cloud.stream.annotation.Processor; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.annotation.Bindings; +import org.springframework.cloud.stream.messaging.Processor; import org.springframework.cloud.stream.utils.MockBinderConfiguration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.PropertySource; @@ -47,7 +47,7 @@ public class ProcessorBindingTestsWithBindingTargets { @Autowired private Binder binder; - @Autowired @ModuleChannels(TestProcessor.class) + @Autowired @Bindings(TestProcessor.class) private Processor testProcessor; @SuppressWarnings("unchecked") @@ -57,7 +57,7 @@ public class ProcessorBindingTestsWithBindingTargets { verify(binder).bindProducer(eq("testtock.1"), eq(testProcessor.output()), Mockito.any()); } - @EnableModule(Processor.class) + @EnableBinding(Processor.class) @EnableAutoConfiguration @Import(MockBinderConfiguration.class) @PropertySource("classpath:/org/springframework/cloud/stream/binder/processor-binding-test.properties") diff --git a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/ProcessorBindingTestsWithDefaults.java b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/ProcessorBindingTestsWithDefaults.java index 62aa951bb..3a2db5733 100644 --- a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/ProcessorBindingTestsWithDefaults.java +++ b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/ProcessorBindingTestsWithDefaults.java @@ -28,9 +28,9 @@ import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.cloud.stream.annotation.EnableModule; -import org.springframework.cloud.stream.annotation.ModuleChannels; -import org.springframework.cloud.stream.annotation.Processor; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.annotation.Bindings; +import org.springframework.cloud.stream.messaging.Processor; import org.springframework.cloud.stream.utils.MockBinderConfiguration; import org.springframework.context.annotation.Import; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -46,7 +46,7 @@ public class ProcessorBindingTestsWithDefaults { @Autowired private Binder binder; - @Autowired @ModuleChannels(TestProcessor.class) + @Autowired @Bindings(TestProcessor.class) private Processor processor; @SuppressWarnings("unchecked") @@ -57,7 +57,7 @@ public class ProcessorBindingTestsWithDefaults { verifyNoMoreInteractions(binder); } - @EnableModule(Processor.class) + @EnableBinding(Processor.class) @EnableAutoConfiguration @Import(MockBinderConfiguration.class) public static class TestProcessor { diff --git a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/SinkBindingTestsWithBindingTargets.java b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/SinkBindingTestsWithBindingTargets.java index c25f279de..ee660c89b 100644 --- a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/SinkBindingTestsWithBindingTargets.java +++ b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/SinkBindingTestsWithBindingTargets.java @@ -29,9 +29,9 @@ import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.cloud.stream.annotation.EnableModule; -import org.springframework.cloud.stream.annotation.ModuleChannels; -import org.springframework.cloud.stream.annotation.Sink; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.annotation.Bindings; +import org.springframework.cloud.stream.messaging.Sink; import org.springframework.cloud.stream.utils.MockBinderConfiguration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.PropertySource; @@ -48,7 +48,7 @@ public class SinkBindingTestsWithBindingTargets { @Autowired private Binder binder; - @Autowired @ModuleChannels(TestSink.class) + @Autowired @Bindings(TestSink.class) private Sink testSink; @SuppressWarnings("unchecked") @@ -58,7 +58,7 @@ public class SinkBindingTestsWithBindingTargets { verifyNoMoreInteractions(binder); } - @EnableModule(Sink.class) + @EnableBinding(Sink.class) @EnableAutoConfiguration @Import(MockBinderConfiguration.class) @PropertySource("classpath:/org/springframework/cloud/stream/binder/sink-binding-test.properties") diff --git a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/SinkBindingTestsWithDefaults.java b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/SinkBindingTestsWithDefaults.java index 0c9ec505a..e3a4c0392 100644 --- a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/SinkBindingTestsWithDefaults.java +++ b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/SinkBindingTestsWithDefaults.java @@ -29,9 +29,9 @@ import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.cloud.stream.annotation.EnableModule; -import org.springframework.cloud.stream.annotation.ModuleChannels; -import org.springframework.cloud.stream.annotation.Sink; +import org.springframework.cloud.stream.annotation.Bindings; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.messaging.Sink; import org.springframework.cloud.stream.utils.MockBinderConfiguration; import org.springframework.context.annotation.Import; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -47,7 +47,7 @@ public class SinkBindingTestsWithDefaults { @Autowired private Binder binder; - @Autowired @ModuleChannels(TestSink.class) + @Autowired @Bindings(TestSink.class) private Sink testSink; @SuppressWarnings("unchecked") @@ -57,7 +57,7 @@ public class SinkBindingTestsWithDefaults { verifyNoMoreInteractions(binder); } - @EnableModule(Sink.class) + @EnableBinding(Sink.class) @EnableAutoConfiguration @Import(MockBinderConfiguration.class) public static class TestSink { diff --git a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/SourceBindingTestsWithBindingTargets.java b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/SourceBindingTestsWithBindingTargets.java index d6eb70581..0fd304ac0 100644 --- a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/SourceBindingTestsWithBindingTargets.java +++ b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/SourceBindingTestsWithBindingTargets.java @@ -29,9 +29,9 @@ import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.cloud.stream.annotation.EnableModule; -import org.springframework.cloud.stream.annotation.ModuleChannels; -import org.springframework.cloud.stream.annotation.Source; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.annotation.Bindings; +import org.springframework.cloud.stream.messaging.Source; import org.springframework.cloud.stream.utils.MockBinderConfiguration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.PropertySource; @@ -48,7 +48,7 @@ public class SourceBindingTestsWithBindingTargets { @Autowired private Binder binder; - @Autowired @ModuleChannels(TestSource.class) + @Autowired @Bindings(TestSource.class) private Source testSource; @SuppressWarnings("unchecked") @@ -58,7 +58,7 @@ public class SourceBindingTestsWithBindingTargets { verifyNoMoreInteractions(binder); } - @EnableModule(Source.class) + @EnableBinding(Source.class) @EnableAutoConfiguration @Import(MockBinderConfiguration.class) @PropertySource("classpath:/org/springframework/cloud/stream/binder/source-binding-test.properties") diff --git a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/SourceBindingTestsWithDefaults.java b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/SourceBindingTestsWithDefaults.java index 1171ca2a2..5a4567d44 100644 --- a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/SourceBindingTestsWithDefaults.java +++ b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/SourceBindingTestsWithDefaults.java @@ -29,9 +29,9 @@ import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.cloud.stream.annotation.EnableModule; -import org.springframework.cloud.stream.annotation.ModuleChannels; -import org.springframework.cloud.stream.annotation.Source; +import org.springframework.cloud.stream.annotation.Bindings; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.messaging.Source; import org.springframework.cloud.stream.utils.MockBinderConfiguration; import org.springframework.context.annotation.Import; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -47,7 +47,7 @@ public class SourceBindingTestsWithDefaults { @Autowired private Binder binder; - @Autowired @ModuleChannels(TestSource.class) + @Autowired @Bindings(TestSource.class) private Source testSource; @SuppressWarnings("unchecked") @@ -57,7 +57,7 @@ public class SourceBindingTestsWithDefaults { verifyNoMoreInteractions(binder); } - @EnableModule(Source.class) + @EnableBinding(Source.class) @EnableAutoConfiguration @Import(MockBinderConfiguration.class) public static class TestSource { diff --git a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/interceptor/BoundChannelsInterceptedTest.java b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/interceptor/BoundChannelsInterceptedTest.java index 959dbdc22..ca3d47971 100644 --- a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/interceptor/BoundChannelsInterceptedTest.java +++ b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/interceptor/BoundChannelsInterceptedTest.java @@ -25,9 +25,9 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.cloud.stream.annotation.EnableModule; -import org.springframework.cloud.stream.annotation.ModuleChannels; -import org.springframework.cloud.stream.annotation.Sink; +import org.springframework.cloud.stream.annotation.Bindings; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.messaging.Sink; import org.springframework.cloud.stream.utils.MockBinderConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; @@ -53,7 +53,7 @@ public class BoundChannelsInterceptedTest { ChannelInterceptor channelInterceptor; @Autowired - @ModuleChannels(BoundChannelsInterceptedTest.Foo.class) + @Bindings(BoundChannelsInterceptedTest.Foo.class) public Sink fooSink; @Test @@ -65,7 +65,7 @@ public class BoundChannelsInterceptedTest { @SpringBootApplication - @EnableModule(Sink.class) + @EnableBinding(Sink.class) @Import(MockBinderConfiguration.class) public static class Foo {