@@ -77,7 +77,9 @@ public class ComponentScanBeanDefinitionParser implements BeanDefinitionParser {
7777
7878 @ Override
7979 public BeanDefinition parse (Element element , ParserContext parserContext ) {
80- String [] basePackages = StringUtils .tokenizeToStringArray (element .getAttribute (BASE_PACKAGE_ATTRIBUTE ),
80+ String basePackage = element .getAttribute (BASE_PACKAGE_ATTRIBUTE );
81+ basePackage = parserContext .getReaderContext ().getEnvironment ().resolvePlaceholders (basePackage );
82+ String [] basePackages = StringUtils .tokenizeToStringArray (basePackage ,
8183 ConfigurableApplicationContext .CONFIG_LOCATION_DELIMITERS );
8284
8385 // Actually scan for bean definitions and register them.
@@ -89,17 +91,15 @@ public BeanDefinition parse(Element element, ParserContext parserContext) {
8991 }
9092
9193 protected ClassPathBeanDefinitionScanner configureScanner (ParserContext parserContext , Element element ) {
92- XmlReaderContext readerContext = parserContext .getReaderContext ();
93-
9494 boolean useDefaultFilters = true ;
9595 if (element .hasAttribute (USE_DEFAULT_FILTERS_ATTRIBUTE )) {
9696 useDefaultFilters = Boolean .valueOf (element .getAttribute (USE_DEFAULT_FILTERS_ATTRIBUTE ));
9797 }
9898
9999 // Delegate bean definition registration to scanner class.
100- ClassPathBeanDefinitionScanner scanner = createScanner (readerContext , useDefaultFilters );
101- scanner .setResourceLoader (readerContext .getResourceLoader ());
102- scanner .setEnvironment (parserContext .getDelegate ().getEnvironment ());
100+ ClassPathBeanDefinitionScanner scanner = createScanner (parserContext . getReaderContext () , useDefaultFilters );
101+ scanner .setResourceLoader (parserContext . getReaderContext () .getResourceLoader ());
102+ scanner .setEnvironment (parserContext .getReaderContext ().getEnvironment ());
103103 scanner .setBeanDefinitionDefaults (parserContext .getDelegate ().getBeanDefinitionDefaults ());
104104 scanner .setAutowireCandidatePatterns (parserContext .getDelegate ().getAutowireCandidatePatterns ());
105105
@@ -111,17 +111,17 @@ protected ClassPathBeanDefinitionScanner configureScanner(ParserContext parserCo
111111 parseBeanNameGenerator (element , scanner );
112112 }
113113 catch (Exception ex ) {
114- readerContext . error (ex .getMessage (), readerContext .extractSource (element ), ex .getCause ());
114+ parserContext . getReaderContext (). error (ex .getMessage (), parserContext .extractSource (element ), ex .getCause ());
115115 }
116116
117117 try {
118118 parseScope (element , scanner );
119119 }
120120 catch (Exception ex ) {
121- readerContext . error (ex .getMessage (), readerContext .extractSource (element ), ex .getCause ());
121+ parserContext . getReaderContext (). error (ex .getMessage (), parserContext .extractSource (element ), ex .getCause ());
122122 }
123123
124- parseTypeFilters (element , scanner , readerContext , parserContext );
124+ parseTypeFilters (element , scanner , parserContext );
125125
126126 return scanner ;
127127 }
@@ -195,9 +195,7 @@ else if ("no".equals(mode)) {
195195 }
196196 }
197197
198- protected void parseTypeFilters (
199- Element element , ClassPathBeanDefinitionScanner scanner , XmlReaderContext readerContext , ParserContext parserContext ) {
200-
198+ protected void parseTypeFilters (Element element , ClassPathBeanDefinitionScanner scanner , ParserContext parserContext ) {
201199 // Parse exclude and include filter elements.
202200 ClassLoader classLoader = scanner .getResourceLoader ().getClassLoader ();
203201 NodeList nodeList = element .getChildNodes ();
@@ -207,25 +205,27 @@ protected void parseTypeFilters(
207205 String localName = parserContext .getDelegate ().getLocalName (node );
208206 try {
209207 if (INCLUDE_FILTER_ELEMENT .equals (localName )) {
210- TypeFilter typeFilter = createTypeFilter ((Element ) node , classLoader );
208+ TypeFilter typeFilter = createTypeFilter ((Element ) node , classLoader , parserContext );
211209 scanner .addIncludeFilter (typeFilter );
212210 }
213211 else if (EXCLUDE_FILTER_ELEMENT .equals (localName )) {
214- TypeFilter typeFilter = createTypeFilter ((Element ) node , classLoader );
212+ TypeFilter typeFilter = createTypeFilter ((Element ) node , classLoader , parserContext );
215213 scanner .addExcludeFilter (typeFilter );
216214 }
217215 }
218216 catch (Exception ex ) {
219- readerContext .error (ex .getMessage (), readerContext .extractSource (element ), ex .getCause ());
217+ parserContext .getReaderContext ().error (
218+ ex .getMessage (), parserContext .extractSource (element ), ex .getCause ());
220219 }
221220 }
222221 }
223222 }
224223
225224 @ SuppressWarnings ("unchecked" )
226- protected TypeFilter createTypeFilter (Element element , ClassLoader classLoader ) {
225+ protected TypeFilter createTypeFilter (Element element , ClassLoader classLoader , ParserContext parserContext ) {
227226 String filterType = element .getAttribute (FILTER_TYPE_ATTRIBUTE );
228227 String expression = element .getAttribute (FILTER_EXPRESSION_ATTRIBUTE );
228+ expression = parserContext .getReaderContext ().getEnvironment ().resolvePlaceholders (expression );
229229 try {
230230 if ("annotation" .equals (filterType )) {
231231 return new AnnotationTypeFilter ((Class <Annotation >) classLoader .loadClass (expression ));
0 commit comments