springboot中@SpringBootApplication注解如何获取它的注解及注解的注解

springboot中@SpringBootApplication注解如何获取它的注解及注解的注解

  • @SpringBootApplication

    • @SpringBootConfiguration
      • @Configuration
        • @Component
          • @Indexed
    • @EnableAutoConfiguration
      • @AutoConfigurationPackage
        • @Import(AutoConfigurationPackages.Registrar.class)
      • @Import(AutoConfigurationImportSelector.class)
    • @ComponentScan

注解结构

具体类和方法: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);
      }
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值