@@ -86,6 +86,8 @@ public class AutoConfigurationImportSelector implements DeferredImportSelector,
86
86
87
87
private static final String PROPERTY_NAME_AUTOCONFIGURE_EXCLUDE = "spring.autoconfigure.exclude" ;
88
88
89
+ private final Class <?> autoConfigurationAnnotation ;
90
+
89
91
private ConfigurableListableBeanFactory beanFactory ;
90
92
91
93
private Environment environment ;
@@ -96,6 +98,17 @@ public class AutoConfigurationImportSelector implements DeferredImportSelector,
96
98
97
99
private volatile ConfigurationClassFilter configurationClassFilter ;
98
100
101
+ private volatile AutoConfigurationReplacements autoConfigurationReplacements ;
102
+
103
+ public AutoConfigurationImportSelector () {
104
+ this (null );
105
+ }
106
+
107
+ AutoConfigurationImportSelector (Class <?> autoConfigurationAnnotation ) {
108
+ this .autoConfigurationAnnotation = (autoConfigurationAnnotation != null ) ? autoConfigurationAnnotation
109
+ : AutoConfiguration .class ;
110
+ }
111
+
99
112
@ Override
100
113
public String [] selectImports (AnnotationMetadata annotationMetadata ) {
101
114
if (!isEnabled (annotationMetadata )) {
@@ -179,11 +192,12 @@ protected Class<?> getAnnotationClass() {
179
192
* @return a list of candidate configurations
180
193
*/
181
194
protected List <String > getCandidateConfigurations (AnnotationMetadata metadata , AnnotationAttributes attributes ) {
182
- ImportCandidates importCandidates = ImportCandidates .load (AutoConfiguration .class , getBeanClassLoader ());
195
+ ImportCandidates importCandidates = ImportCandidates .load (this .autoConfigurationAnnotation ,
196
+ getBeanClassLoader ());
183
197
List <String > configurations = importCandidates .getCandidates ();
184
198
Assert .notEmpty (configurations ,
185
- "No auto configuration classes found in "
186
- + "META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration .imports. If you "
199
+ "No auto configuration classes found in " + "META-INF/spring/"
200
+ + this . autoConfigurationAnnotation . getName () + " .imports. If you "
187
201
+ "are using a custom packaging, make sure that file is correct." );
188
202
return configurations ;
189
203
}
@@ -227,7 +241,7 @@ protected Set<String> getExclusions(AnnotationMetadata metadata, AnnotationAttri
227
241
excluded .addAll (asList (attributes , "exclude" ));
228
242
excluded .addAll (asList (attributes , "excludeName" ));
229
243
excluded .addAll (getExcludeAutoConfigurationsProperty ());
230
- return excluded ;
244
+ return getAutoConfigurationReplacements (). replaceAll ( excluded ) ;
231
245
}
232
246
233
247
/**
@@ -268,6 +282,16 @@ private ConfigurationClassFilter getConfigurationClassFilter() {
268
282
return configurationClassFilter ;
269
283
}
270
284
285
+ private AutoConfigurationReplacements getAutoConfigurationReplacements () {
286
+ AutoConfigurationReplacements autoConfigurationReplacements = this .autoConfigurationReplacements ;
287
+ if (autoConfigurationReplacements == null ) {
288
+ autoConfigurationReplacements = AutoConfigurationReplacements .load (this .autoConfigurationAnnotation ,
289
+ this .beanClassLoader );
290
+ this .autoConfigurationReplacements = autoConfigurationReplacements ;
291
+ }
292
+ return autoConfigurationReplacements ;
293
+ }
294
+
271
295
protected final <T > List <T > removeDuplicates (List <T > list ) {
272
296
return new ArrayList <>(new LinkedHashSet <>(list ));
273
297
}
@@ -409,6 +433,8 @@ private static final class AutoConfigurationGroup
409
433
410
434
private AutoConfigurationMetadata autoConfigurationMetadata ;
411
435
436
+ private AutoConfigurationReplacements autoConfigurationReplacements ;
437
+
412
438
@ Override
413
439
public void setBeanClassLoader (ClassLoader classLoader ) {
414
440
this .beanClassLoader = classLoader ;
@@ -430,7 +456,15 @@ public void process(AnnotationMetadata annotationMetadata, DeferredImportSelecto
430
456
() -> String .format ("Only %s implementations are supported, got %s" ,
431
457
AutoConfigurationImportSelector .class .getSimpleName (),
432
458
deferredImportSelector .getClass ().getName ()));
433
- AutoConfigurationEntry autoConfigurationEntry = ((AutoConfigurationImportSelector ) deferredImportSelector )
459
+ AutoConfigurationImportSelector autoConfigurationImportSelector = (AutoConfigurationImportSelector ) deferredImportSelector ;
460
+ AutoConfigurationReplacements autoConfigurationReplacements = autoConfigurationImportSelector
461
+ .getAutoConfigurationReplacements ();
462
+ Assert .state (
463
+ this .autoConfigurationReplacements == null
464
+ || this .autoConfigurationReplacements .equals (autoConfigurationReplacements ),
465
+ "Auto-configuration replacements must be the same for each call to process" );
466
+ this .autoConfigurationReplacements = autoConfigurationReplacements ;
467
+ AutoConfigurationEntry autoConfigurationEntry = autoConfigurationImportSelector
434
468
.getAutoConfigurationEntry (annotationMetadata );
435
469
this .autoConfigurationEntries .add (autoConfigurationEntry );
436
470
for (String importClassName : autoConfigurationEntry .getConfigurations ()) {
@@ -452,7 +486,6 @@ public Iterable<Entry> selectImports() {
452
486
.flatMap (Collection ::stream )
453
487
.collect (Collectors .toCollection (LinkedHashSet ::new ));
454
488
processedConfigurations .removeAll (allExclusions );
455
-
456
489
return sortAutoConfigurations (processedConfigurations , getAutoConfigurationMetadata ()).stream ()
457
490
.map ((importClassName ) -> new Entry (this .entries .get (importClassName ), importClassName ))
458
491
.toList ();
@@ -467,7 +500,8 @@ private AutoConfigurationMetadata getAutoConfigurationMetadata() {
467
500
468
501
private List <String > sortAutoConfigurations (Set <String > configurations ,
469
502
AutoConfigurationMetadata autoConfigurationMetadata ) {
470
- return new AutoConfigurationSorter (getMetadataReaderFactory (), autoConfigurationMetadata )
503
+ return new AutoConfigurationSorter (getMetadataReaderFactory (), autoConfigurationMetadata ,
504
+ this .autoConfigurationReplacements ::replace )
471
505
.getInPriorityOrder (configurations );
472
506
}
473
507
0 commit comments