23
23
import java .util .Collections ;
24
24
import java .util .Comparator ;
25
25
import java .util .HashMap ;
26
- import java .util .HashSet ;
27
26
import java .util .Iterator ;
28
- import java .util .LinkedHashMap ;
29
27
import java .util .LinkedHashSet ;
30
28
import java .util .Map ;
31
- import java .util .Map .Entry ;
32
29
import java .util .Set ;
33
30
import java .util .Stack ;
34
31
79
76
*
80
77
* @author Chris Beams
81
78
* @author Juergen Hoeller
82
- * @author Rob Winch
83
79
* @since 3.0
84
80
* @see ConfigurationClassBeanDefinitionReader
85
81
*/
@@ -91,14 +87,6 @@ class ConfigurationClassParser {
91
87
92
88
private final ImportStack importStack = new ImportStack ();
93
89
94
- private final Set <String > knownSuperclasses = new LinkedHashSet <String >();
95
-
96
- private final Map <ConfigurationClass ,ConfigurationClass > configurationClasses =
97
- new LinkedHashMap <ConfigurationClass ,ConfigurationClass >();
98
-
99
- private final Stack <PropertySource <?>> propertySources =
100
- new Stack <PropertySource <?>>();
101
-
102
90
private final Environment environment ;
103
91
104
92
private final ResourceLoader resourceLoader ;
@@ -107,6 +95,12 @@ class ConfigurationClassParser {
107
95
108
96
private final ComponentScanAnnotationParser componentScanParser ;
109
97
98
+ private final Set <ConfigurationClass > configurationClasses = new LinkedHashSet <ConfigurationClass >();
99
+
100
+ private final Map <String , ConfigurationClass > knownSuperclasses = new HashMap <String , ConfigurationClass >();
101
+
102
+ private final Stack <PropertySource <?>> propertySources = new Stack <PropertySource <?>>();
103
+
110
104
111
105
/**
112
106
* Create a new {@link ConfigurationClassParser} instance that will be used
@@ -155,70 +149,28 @@ protected void processConfigurationClass(ConfigurationClass configClass) throws
155
149
}
156
150
}
157
151
158
- // recursively process the configuration class and its superclass hierarchy
159
- do {
160
- metadata = doProcessConfigurationClass (configClass , metadata );
161
- }
162
- while (metadata != null );
163
-
164
- if (getConfigurationClasses ().contains (configClass ) && configClass .getBeanName () != null ) {
152
+ if (this .configurationClasses .contains (configClass ) && configClass .getBeanName () != null ) {
165
153
// Explicit bean definition found, probably replacing an import.
166
154
// Let's remove the old one and go with the new one.
167
- ConfigurationClass originalConfigClass = removeConfigurationClass (configClass );
168
-
169
- mergeFromOriginalConfig (originalConfigClass ,configClass );
170
- }
171
-
172
- addConfigurationClass (configClass );
173
- }
174
-
175
-
176
- /**
177
- * Merges from the original {@link ConfigurationClass} to the new
178
- * {@link ConfigurationClass}. This is necessary if parent classes have already been
179
- * processed.
180
- *
181
- * @param originalConfigClass the original {@link ConfigurationClass} that may have
182
- * additional metadata
183
- * @param configClass the new {@link ConfigurationClass} that will have metadata added
184
- * to it if necessary
185
- */
186
- private void mergeFromOriginalConfig (ConfigurationClass originalConfigClass ,
187
- ConfigurationClass configClass ) {
188
-
189
- Set <String > beanMethodNames = new HashSet <String >();
190
- for (BeanMethod beanMethod : configClass .getBeanMethods ()) {
191
- beanMethodNames .add (createBeanMethodName (beanMethod ));
192
- }
193
-
194
- for (BeanMethod originalBeanMethod : originalConfigClass .getBeanMethods ()) {
195
- String originalBeanMethodName = createBeanMethodName (originalBeanMethod );
196
- if (!beanMethodNames .contains (originalBeanMethodName )) {
197
- configClass .addBeanMethod (new BeanMethod (originalBeanMethod .getMetadata (), configClass ));
155
+ this .configurationClasses .remove (configClass );
156
+ for (Iterator <ConfigurationClass > it = this .knownSuperclasses .values ().iterator (); it .hasNext ();) {
157
+ if (configClass .equals (it .next ())) {
158
+ it .remove ();
159
+ }
198
160
}
199
161
}
200
- for ( Entry < String , Class <? extends BeanDefinitionReader >> originalImportedEntry : originalConfigClass . getImportedResources (). entrySet ()) {
201
- if (! configClass . getImportedResources (). containsKey ( originalImportedEntry . getKey ())) {
202
- configClass . addImportedResource ( originalImportedEntry . getKey (), originalImportedEntry . getValue ());
203
- }
162
+
163
+ // Recursively process the configuration class and its superclass hierarchy.
164
+ do {
165
+ metadata = doProcessConfigurationClass ( configClass , metadata );
204
166
}
205
- }
167
+ while ( metadata != null );
206
168
207
- /**
208
- * Converts a {@link BeanMethod} into the fully qualified name of the Method
209
- *
210
- * @param beanMethod
211
- * @return fully qualified name of the {@link BeanMethod}
212
- */
213
- private String createBeanMethodName (BeanMethod beanMethod ) {
214
- String hashDelim = "#" ;
215
- String dClassName = beanMethod .getMetadata ().getDeclaringClassName ();
216
- String methodName = beanMethod .getMetadata ().getMethodName ();
217
- return dClassName + hashDelim + methodName ;
169
+ this .configurationClasses .add (configClass );
218
170
}
219
171
220
172
/**
221
- * @return annotation metadata of superclass, null if none found or previously processed
173
+ * @return annotation metadata of superclass, {@code null} if none found or previously processed
222
174
*/
223
175
protected AnnotationMetadata doProcessConfigurationClass (
224
176
ConfigurationClass configClass , AnnotationMetadata metadata ) throws IOException {
@@ -232,7 +184,7 @@ protected AnnotationMetadata doProcessConfigurationClass(
232
184
processPropertySource (propertySource );
233
185
}
234
186
235
- // process any @ComponentScan annotions
187
+ // process any @ComponentScan annotations
236
188
AnnotationAttributes componentScan = attributesFor (metadata , ComponentScan .class );
237
189
if (componentScan != null ) {
238
190
// the config class is annotated with @ComponentScan -> perform the scan immediately
@@ -248,7 +200,6 @@ protected AnnotationMetadata doProcessConfigurationClass(
248
200
}
249
201
250
202
// process any @Import annotations
251
-
252
203
Set <Object > imports = new LinkedHashSet <Object >();
253
204
Set <Object > visited = new LinkedHashSet <Object >();
254
205
collectImports (metadata , imports , visited );
@@ -275,7 +226,8 @@ protected AnnotationMetadata doProcessConfigurationClass(
275
226
// process superclass, if any
276
227
if (metadata .hasSuperClass ()) {
277
228
String superclass = metadata .getSuperClassName ();
278
- if (this .knownSuperclasses .add (superclass )) {
229
+ if (!this .knownSuperclasses .containsKey (superclass )) {
230
+ this .knownSuperclasses .put (superclass , configClass );
279
231
// superclass found, return its annotation metadata and recurse
280
232
if (metadata instanceof StandardAnnotationMetadata ) {
281
233
Class <?> clazz = ((StandardAnnotationMetadata ) metadata ).getIntrospectedClass ();
@@ -302,14 +254,6 @@ else if (superclass.startsWith("java")) {
302
254
return null ;
303
255
}
304
256
305
- private void addConfigurationClass (ConfigurationClass configClass ) {
306
- this .configurationClasses .put (configClass ,configClass );
307
- }
308
-
309
- private ConfigurationClass removeConfigurationClass (ConfigurationClass configClass ) {
310
- return this .configurationClasses .remove (configClass );
311
- }
312
-
313
257
/**
314
258
* Register member (nested) classes that happen to be configuration classes themselves.
315
259
* @param metadata the metadata representation of the containing class
@@ -500,13 +444,13 @@ private void invokeAwareMethods(ImportBeanDefinitionRegistrar registrar) {
500
444
* @see ConfigurationClass#validate
501
445
*/
502
446
public void validate () {
503
- for (ConfigurationClass configClass : getConfigurationClasses () ) {
447
+ for (ConfigurationClass configClass : this . configurationClasses ) {
504
448
configClass .validate (this .problemReporter );
505
449
}
506
450
}
507
451
508
452
public Set <ConfigurationClass > getConfigurationClasses () {
509
- return this .configurationClasses . keySet () ;
453
+ return this .configurationClasses ;
510
454
}
511
455
512
456
public Stack <PropertySource <?>> getPropertySources () {
0 commit comments