private void processMemberClasses(ConfigurationClass configClass, SourceClass sourceClass) throws IOException {
// 得到该类的中所有的内部类
Collection<SourceClass> memberClasses = sourceClass.getMemberClasses();
if (!memberClasses.isEmpty()) {
List<SourceClass> candidates = new ArrayList<>(memberClasses.size());
// 遍历内部类集合
for (SourceClass memberClass : memberClasses) {
//Component,ComponentScan,Import,ImportResource
// 或者内部类中有方法使用了@bean
// 这些都是符合的。
if (ConfigurationClassUtils.isConfigurationCandidate(memberClass.getMetadata()) &&
!memberClass.getMetadata().getClassName().equals(configClass.getMetadata().getClassName())) {
candidates.add(memberClass);
}
}
OrderComparator.sort(candidates);
for (SourceClass candidate : candidates) {
if (this.importStack.contains(configClass)) {
this.problemReporter.error(new CircularImportProblem(configClass, this.importStack));
}
else {
this.importStack.push(configClass);
try {
// 先解析内部类的。内部类新建一个一个ConfigurationClass
processConfigurationClass(candidate.asConfigClass(configClass));
}
finally {
this.importStack.pop();
}
}
}
}
}
如果有内部类,并且是有几个注解标注,Component,ComponentScan,Import,ImportResource或者内部f类方法中有@bean标注,先解析内部类中的。内部新建一个ConfigurationClass对象。