From 9b2b6d0df1ecb5febc7e4b6f6f6e150f80493f6a Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Wed, 9 Sep 2015 09:46:39 +0100 Subject: [PATCH] Use AnnotatedElementUtils to extend the reach of BindingBeansRegistrar The annotation metadata coming into an ImportBeanDefinitionRegistrar does not include overrides or inherrited/merged attributes from meta-annotated custom annotations. This change makes it possible to extend @EnableBinding if users want to do that. Per https://jira.spring.io/browse/SPR-13448 --- .../stream/config/BindingBeansRegistrar.java | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) 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 900896e65..eb5046de6 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 @@ -23,9 +23,10 @@ import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.cloud.stream.annotation.EnableBinding; import org.springframework.cloud.stream.binding.BindingBeanDefinitionRegistryUtils; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; +import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.type.AnnotationMetadata; import org.springframework.util.ClassUtils; -import org.springframework.util.MultiValueMap; /** * @author Marius Bogoevici @@ -37,23 +38,23 @@ public class BindingBeansRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { - MultiValueMap attributes = metadata.getAllAnnotationAttributes(EnableBinding.class.getName(), - false); - for (Class type : collectClasses(attributes.get("value"))) { - BindingBeanDefinitionRegistryUtils.registerChannelBeanDefinitions(type, type.getName(), registry); + AnnotationAttributes attrs = AnnotatedElementUtils.getMergedAnnotationAttributes( + ClassUtils.resolveClassName(metadata.getClassName(), null), + EnableBinding.class); + for (Class type : collectClasses(attrs.get("value"))) { + BindingBeanDefinitionRegistryUtils.registerChannelBeanDefinitions(type, + type.getName(), registry); BindingBeanDefinitionRegistryUtils.registerChannelsQualifiedBeanDefinitions( ClassUtils.resolveClassName(metadata.getClassName(), null), type, registry); } } - private List> collectClasses(List list) { + private List> collectClasses(Object object) { ArrayList> result = new ArrayList>(); - for (Object object : list) { - for (Object value : (Object[]) object) { - if (value instanceof Class && void.class != value) { - result.add((Class) value); - } + for (Object value : (Object[]) object) { + if (value instanceof Class && void.class != value) { + result.add((Class) value); } } return result;