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
This commit is contained in:
Dave Syer
2015-09-09 09:46:39 +01:00
parent 139d6a5c6a
commit 9b2b6d0df1

View File

@@ -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<String, Object> 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<Class<?>> collectClasses(List<Object> list) {
private List<Class<?>> collectClasses(Object object) {
ArrayList<Class<?>> result = new ArrayList<Class<?>>();
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;