springboot中@SpringBootApplication注解如何获取它的注解及注解的注解
-
@SpringBootApplication
- @SpringBootConfiguration
- @Configuration
- @Component
- @Indexed
- @Component
- @Configuration
- @EnableAutoConfiguration
- @AutoConfigurationPackage
- @Import(AutoConfigurationPackages.Registrar.class)
- @Import(AutoConfigurationImportSelector.class)
- @AutoConfigurationPackage
- @ComponentScan
- @SpringBootConfiguration
具体类和方法:org.springframework.core.annotation.AnnotationTypeMapping#AnnotationTypeMapping
private AnnotationTypeMappings(RepeatableContainers repeatableContainers,
AnnotationFilter filter, Class<? extends Annotation> annotationType) {
//入参annotationType = @SpringBootApplication
this.repeatableContainers = repeatableContainers;
this.filter = filter;
this.mappings = new ArrayList<>();
//方法见下
addAllMappings(annotationType);
this.mappings.forEach(AnnotationTypeMapping::afterAllMappingsSet);
}
private void addAllMappings(Class<? extends Annotation> annotationType) {
Deque<AnnotationTypeMapping> queue = new ArrayDeque<>();
//获取 annotationType当前注解,加入队列尾
addIfPossible(queue, null, annotationType, null);
//下面的代码可以获取全部子注解
while (!queue.isEmpty()) {
//从队列头获取mapping
AnnotationTypeMapping mapping = queue.removeFirst();
//mapping存入类中mappings
this.mappings.add(mapping);
//获取从队列头拿到的mapping中的子注解,方法见下
addMetaAnnotationsToQueue(queue, mapping);
}
}
private void addMetaAnnotationsToQueue(Deque<AnnotationTypeMapping> queue, AnnotationTypeMapping source) {
Annotation[] metaAnnotations = AnnotationsScanner.getDeclaredAnnotations(source.getAnnotationType(), false);
for (Annotation metaAnnotation : metaAnnotations) {
//剔除非目标注解
if (!isMappable(source, metaAnnotation)) {
continue;
}
Annotation[] repeatedAnnotations = this.repeatableContainers.findRepeatedAnnotations(metaAnnotation);
if (repeatedAnnotations != null) {
for (Annotation repeatedAnnotation : repeatedAnnotations) {
if (!isMappable(source, repeatedAnnotation)) {
continue;
}
addIfPossible(queue, source, repeatedAnnotation);
}
}
else {
addIfPossible(queue, source, metaAnnotation);
}
}
}