forked from spring-cloud/spring-cloud-stream
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
spring-cloudGH-1083: Disallow reuse bean name for bindings
Resolves spring-cloud#1083 By default Spring Framework allows beans overriding via the same name. The binding target definitions (`@Input` and `@Output`) populate beans as well and when we use the same name for target we end up with unexpected behavior but without errors. Since it isn't so obvious via Spring Framework bean definition DSLs (XML or Java & Annotations) how to override beans with the same name, that is absolutely easy to use the same value for `@Input` and `@Output` definitions even in different binding interfaces. That's hard to analyze fro the target application since mostly `@Input` and `@Output` produce `MessageChannel` beans. * Fail fast with the `BeanDefinitionStoreException` when we meet existing bean definition for the same name * Add JavaDocs to the `@Input` and `@Output` to explain that their `value` is a bean name, as well as destination by default Since `@EnableBinding` is `@Inherited`, the inheritor picks up it from the super class during configuration class parsing. The parsing process logic is such that after the root class we go to parse its super classes, and therefore come back to the `@EnableBinding` again. In this case we process all the `@Import`s one more time and collect them to the root `configurationClass`. Essentially we get a duplication for the `ImportBeanDefinitionRegistrar`s such as `BindingBeansRegistrar`. The last one parsed `@EnableBinding` and registers appropriate beans for the `@Input` and `@Output`, as well as for the binding interface - `BindableProxyFactory`. But since we have it twice in the `configurationClass` we end up with `BeanDefinitionStoreException` mentioned before. That's how Spring Framework works with inheritance for configuration classes and that's may be why it allows to override beans by default * Skip parsing `@EnableBinding` one more time if the bean definition for binding interface is already present in the `registry` * Fix `AggregateWithMainTest` do not process `@ComponentScan` what causes picking up the configuration classes for children contexts in the aggregation * Fix `testBindableProxyFactoryCaching()` do not register `Source` and `Processor` in the same application context because both of them cause registration for the `Source.OUTPUT` bean
- Loading branch information
1 parent
3701615
commit efe64d9
Showing
7 changed files
with
167 additions
and
29 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.