24
24
import java .util .List ;
25
25
import java .util .Map ;
26
26
import java .util .Set ;
27
+ import java .util .concurrent .TimeUnit ;
28
+
29
+ import org .apache .commons .logging .Log ;
30
+ import org .apache .commons .logging .LogFactory ;
27
31
28
32
import org .springframework .beans .BeansException ;
29
33
import org .springframework .beans .factory .Aware ;
@@ -67,6 +71,9 @@ public class AutoConfigurationImportSelector
67
71
68
72
private static final String [] NO_IMPORTS = {};
69
73
74
+ private static final Log logger = LogFactory
75
+ .getLog (AutoConfigurationImportSelector .class );
76
+
70
77
private ConfigurableListableBeanFactory beanFactory ;
71
78
72
79
private Environment environment ;
@@ -91,6 +98,7 @@ public String[] selectImports(AnnotationMetadata annotationMetadata) {
91
98
Set <String > exclusions = getExclusions (annotationMetadata , attributes );
92
99
checkExcludedClasses (configurations , exclusions );
93
100
configurations .removeAll (exclusions );
101
+ configurations = filter (configurations , autoConfigurationMetadata );
94
102
fireAutoConfigurationImportListeners (configurations , exclusions );
95
103
return configurations .toArray (new String [configurations .size ()]);
96
104
}
@@ -233,6 +241,45 @@ private List<String> sort(List<String> configurations,
233
241
return configurations ;
234
242
}
235
243
244
+ private List <String > filter (List <String > configurations ,
245
+ AutoConfigurationMetadata autoConfigurationMetadata ) {
246
+ long startTime = System .nanoTime ();
247
+ String [] candidates = configurations .toArray (new String [configurations .size ()]);
248
+ boolean [] skip = new boolean [candidates .length ];
249
+ boolean skipped = false ;
250
+ for (AutoConfigurationImportFilter filter : getAutoConfigurationImportFilters ()) {
251
+ invokeAwareMethods (filter );
252
+ boolean [] match = filter .match (candidates , autoConfigurationMetadata );
253
+ for (int i = 0 ; i < match .length ; i ++) {
254
+ if (!match [i ]) {
255
+ skip [i ] = true ;
256
+ skipped = true ;
257
+ }
258
+ }
259
+ }
260
+ if (!skipped ) {
261
+ return configurations ;
262
+ }
263
+ List <String > result = new ArrayList <String >(candidates .length );
264
+ for (int i = 0 ; i < candidates .length ; i ++) {
265
+ if (!skip [i ]) {
266
+ result .add (candidates [i ]);
267
+ }
268
+ }
269
+ if (logger .isTraceEnabled ()) {
270
+ int numberFiltered = configurations .size () - result .size ();
271
+ logger .trace ("Filtered " + numberFiltered + " auto configuration class in "
272
+ + TimeUnit .NANOSECONDS .toMillis (System .nanoTime () - startTime )
273
+ + " ms" );
274
+ }
275
+ return new ArrayList <String >(result );
276
+ }
277
+
278
+ protected List <AutoConfigurationImportFilter > getAutoConfigurationImportFilters () {
279
+ return SpringFactoriesLoader .loadFactories (AutoConfigurationImportFilter .class ,
280
+ this .beanClassLoader );
281
+ }
282
+
236
283
private MetadataReaderFactory getMetadataReaderFactory () {
237
284
try {
238
285
return getBeanFactory ().getBean (
@@ -271,20 +318,20 @@ protected List<AutoConfigurationImportListener> getAutoConfigurationImportListen
271
318
this .beanClassLoader );
272
319
}
273
320
274
- private void invokeAwareMethods (AutoConfigurationImportListener listener ) {
275
- if (listener instanceof Aware ) {
276
- if (listener instanceof BeanClassLoaderAware ) {
277
- ((BeanClassLoaderAware ) listener )
321
+ private void invokeAwareMethods (Object instance ) {
322
+ if (instance instanceof Aware ) {
323
+ if (instance instanceof BeanClassLoaderAware ) {
324
+ ((BeanClassLoaderAware ) instance )
278
325
.setBeanClassLoader (this .beanClassLoader );
279
326
}
280
- if (listener instanceof BeanFactoryAware ) {
281
- ((BeanFactoryAware ) listener ).setBeanFactory (this .beanFactory );
327
+ if (instance instanceof BeanFactoryAware ) {
328
+ ((BeanFactoryAware ) instance ).setBeanFactory (this .beanFactory );
282
329
}
283
- if (listener instanceof EnvironmentAware ) {
284
- ((EnvironmentAware ) listener ).setEnvironment (this .environment );
330
+ if (instance instanceof EnvironmentAware ) {
331
+ ((EnvironmentAware ) instance ).setEnvironment (this .environment );
285
332
}
286
- if (listener instanceof ResourceLoaderAware ) {
287
- ((ResourceLoaderAware ) listener ).setResourceLoader (this .resourceLoader );
333
+ if (instance instanceof ResourceLoaderAware ) {
334
+ ((ResourceLoaderAware ) instance ).setResourceLoader (this .resourceLoader );
288
335
}
289
336
}
290
337
}
0 commit comments