@@ -77,7 +77,9 @@ public class ComponentScanBeanDefinitionParser implements BeanDefinitionParser {
77
77
78
78
@ Override
79
79
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 ,
81
83
ConfigurableApplicationContext .CONFIG_LOCATION_DELIMITERS );
82
84
83
85
// Actually scan for bean definitions and register them.
@@ -89,17 +91,15 @@ public BeanDefinition parse(Element element, ParserContext parserContext) {
89
91
}
90
92
91
93
protected ClassPathBeanDefinitionScanner configureScanner (ParserContext parserContext , Element element ) {
92
- XmlReaderContext readerContext = parserContext .getReaderContext ();
93
-
94
94
boolean useDefaultFilters = true ;
95
95
if (element .hasAttribute (USE_DEFAULT_FILTERS_ATTRIBUTE )) {
96
96
useDefaultFilters = Boolean .valueOf (element .getAttribute (USE_DEFAULT_FILTERS_ATTRIBUTE ));
97
97
}
98
98
99
99
// 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 ());
103
103
scanner .setBeanDefinitionDefaults (parserContext .getDelegate ().getBeanDefinitionDefaults ());
104
104
scanner .setAutowireCandidatePatterns (parserContext .getDelegate ().getAutowireCandidatePatterns ());
105
105
@@ -111,17 +111,17 @@ protected ClassPathBeanDefinitionScanner configureScanner(ParserContext parserCo
111
111
parseBeanNameGenerator (element , scanner );
112
112
}
113
113
catch (Exception ex ) {
114
- readerContext . error (ex .getMessage (), readerContext .extractSource (element ), ex .getCause ());
114
+ parserContext . getReaderContext (). error (ex .getMessage (), parserContext .extractSource (element ), ex .getCause ());
115
115
}
116
116
117
117
try {
118
118
parseScope (element , scanner );
119
119
}
120
120
catch (Exception ex ) {
121
- readerContext . error (ex .getMessage (), readerContext .extractSource (element ), ex .getCause ());
121
+ parserContext . getReaderContext (). error (ex .getMessage (), parserContext .extractSource (element ), ex .getCause ());
122
122
}
123
123
124
- parseTypeFilters (element , scanner , readerContext , parserContext );
124
+ parseTypeFilters (element , scanner , parserContext );
125
125
126
126
return scanner ;
127
127
}
@@ -195,9 +195,7 @@ else if ("no".equals(mode)) {
195
195
}
196
196
}
197
197
198
- protected void parseTypeFilters (
199
- Element element , ClassPathBeanDefinitionScanner scanner , XmlReaderContext readerContext , ParserContext parserContext ) {
200
-
198
+ protected void parseTypeFilters (Element element , ClassPathBeanDefinitionScanner scanner , ParserContext parserContext ) {
201
199
// Parse exclude and include filter elements.
202
200
ClassLoader classLoader = scanner .getResourceLoader ().getClassLoader ();
203
201
NodeList nodeList = element .getChildNodes ();
@@ -207,25 +205,27 @@ protected void parseTypeFilters(
207
205
String localName = parserContext .getDelegate ().getLocalName (node );
208
206
try {
209
207
if (INCLUDE_FILTER_ELEMENT .equals (localName )) {
210
- TypeFilter typeFilter = createTypeFilter ((Element ) node , classLoader );
208
+ TypeFilter typeFilter = createTypeFilter ((Element ) node , classLoader , parserContext );
211
209
scanner .addIncludeFilter (typeFilter );
212
210
}
213
211
else if (EXCLUDE_FILTER_ELEMENT .equals (localName )) {
214
- TypeFilter typeFilter = createTypeFilter ((Element ) node , classLoader );
212
+ TypeFilter typeFilter = createTypeFilter ((Element ) node , classLoader , parserContext );
215
213
scanner .addExcludeFilter (typeFilter );
216
214
}
217
215
}
218
216
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 ());
220
219
}
221
220
}
222
221
}
223
222
}
224
223
225
224
@ SuppressWarnings ("unchecked" )
226
- protected TypeFilter createTypeFilter (Element element , ClassLoader classLoader ) {
225
+ protected TypeFilter createTypeFilter (Element element , ClassLoader classLoader , ParserContext parserContext ) {
227
226
String filterType = element .getAttribute (FILTER_TYPE_ATTRIBUTE );
228
227
String expression = element .getAttribute (FILTER_EXPRESSION_ATTRIBUTE );
228
+ expression = parserContext .getReaderContext ().getEnvironment ().resolvePlaceholders (expression );
229
229
try {
230
230
if ("annotation" .equals (filterType )) {
231
231
return new AnnotationTypeFilter ((Class <Annotation >) classLoader .loadClass (expression ));
0 commit comments