From 22c0085ba0393d9cf2a1661e742405bea9764299 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 25 Sep 2014 17:51:53 +0200 Subject: [PATCH] ComponentScanAnnotationParser supports multiple base packages within a single placeholder as well Issue: SPR-10425 --- .../ComponentScanAnnotationParser.java | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ComponentScanAnnotationParser.java b/spring-context/src/main/java/org/springframework/context/annotation/ComponentScanAnnotationParser.java index 0f6f9d1a37..afbb271639 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ComponentScanAnnotationParser.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ComponentScanAnnotationParser.java @@ -18,6 +18,8 @@ package org.springframework.context.annotation; import java.lang.annotation.Annotation; import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.regex.Pattern; @@ -26,6 +28,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanNameGenerator; +import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.env.Environment; import org.springframework.core.io.ResourceLoader; @@ -111,21 +114,19 @@ class ComponentScanAnnotationParser { scanner.getBeanDefinitionDefaults().setLazyInit(true); } - List basePackages = new ArrayList(); - for (String pkg : componentScan.getStringArray("value")) { - if (StringUtils.hasText(pkg)) { - basePackages.add(pkg); - } - } - for (String pkg : componentScan.getStringArray("basePackages")) { - if (StringUtils.hasText(pkg)) { - basePackages.add(pkg); - } + Set basePackages = new LinkedHashSet(); + Set specifiedPackages = new LinkedHashSet(); + specifiedPackages.addAll(Arrays.asList(componentScan.getStringArray("value"))); + specifiedPackages.addAll(Arrays.asList(componentScan.getStringArray("basePackages"))); + + for (String pkg : specifiedPackages) { + String[] tokenized = StringUtils.tokenizeToStringArray(this.environment.resolvePlaceholders(pkg), + ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS); + basePackages.addAll(Arrays.asList(tokenized)); } for (Class clazz : componentScan.getClassArray("basePackageClasses")) { basePackages.add(ClassUtils.getPackageName(clazz)); } - if (basePackages.isEmpty()) { basePackages.add(ClassUtils.getPackageName(declaringClass)); }