配置类需要标注@Configuration却不知原因?那这次就不能给你涨薪喽(中)

简介: 配置类需要标注@Configuration却不知原因?那这次就不能给你涨薪喽(中)
ConfigurationClassParser:
  @Nullable
  protected final SourceClass doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass) throws IOException {
    ... // 先解析nested内部类(内部类会存在@Bean方法嘛~)
    ... // 解析@PropertySource资源,加入到environment环境
    ... // 解析@ComponentScan注解,把组件扫描进来
    scannedBeanDefinitions = ComponentScanAnnotationParser.parse(componentScan, ...);
      // 把扫描到的Bean定义信息依旧需要一个个的判断,是否是配置类 
      // 若是配置类,就继续当作一个@Configuration配置类来解析parse() 递归嘛
      for (BeanDefinitionHolder holder : scannedBeanDefinitions) {
        ...
        if (ConfigurationClassUtils.checkConfigurationClassCandidate(bdCand, this.metadataReaderFactory)) {
          parse(bdCand.getBeanClassName(), holder.getBeanName());
        }
      }
    ... // 解析@Import注解
    ... // 解析@ImportResource注解
    ... // 解析当前配置里配置的@Bean方法
    ... // 解析接口默认方法(因为配置类可能实现接口,然后接口默认方法可能标注有@Bean )
    ... // 处理父类(递归,直到父类为java.打头的为止)
  }


这个方法是Spring对配置类解析的最核心步骤,通过它顺带也能够解答你的疑惑了吧:为何你仅需在类上标注一个@Configuration注解即可让它成为一个配置类?因为被Scan扫描进去了嘛~


通过以上两个使用处的分析和对比,对于@Configuration配置类的理解,你至少应该掌握了如下讯息:


@Configuration配置类肯定是个组件,存在于IoC容器里

@Configuration配置类是有主次之分的,主配置类是驱动整个程序的入口,可以是一个,也可以是多个(若存在多个,支持使用@Order排序)

我们平时一般只书写次配置类(而且一般写多个),它一般是借助主配置类的@ComponentScan能力完成加载进而解析的(当然也可能是@Import、又或是被其它次配置类驱动的)

配置类可以存在嵌套(如内部类),继承,实现接口等特性

聊完了最为重要的checkConfigurationClassCandidate()方法,当然还有必要看看ConfigurationClassUtils的另一个工具方法isConfigurationCandidate()。


isConfigurationCandidate()

它是一个public static工具方法,通过给定的注解元数据信息来判断它是否是一个Configuration。


ConfigurationClassUtils:
  static {
    candidateIndicators.add(Component.class.getName());
    candidateIndicators.add(ComponentScan.class.getName());
    candidateIndicators.add(Import.class.getName());
    candidateIndicators.add(ImportResource.class.getName());
  }
  public static boolean isConfigurationCandidate(AnnotationMetadata metadata) {
    // 不考虑接口 or 注解 说明:注解的话也是一种“特殊”的接口哦
    if (metadata.isInterface()) {
      return false;
    }
    // 只要该类上标注有以上4个注解任意一个,都算配置类
    for (String indicator : candidateIndicators) {
      if (metadata.isAnnotated(indicator)) {
        return true;
      }
    }
    // 若一个注解都没标注,那就看有木有@Bean方法 若有那也算配置类
    return metadata.hasAnnotatedMethods(Bean.class.getName());
  }


步骤总结:


  1. 若是接口类型(含注解类型),直接不予考虑,返回false。否则继续判断
  2. 若此类上标注有@Component、@ComponentScan、@Import、@ImportResource任意一个注解,就判断成功返回true。否则继续判断
  3. 到此步,就说明此类上没有标注任何注解。若存在@Bean方法,返回true,否则返回false。


需要特别特别特别注意的是:此方法它的并不考虑@Configuration注解,是“轻量级”判断,这是它和checkConfigurationClassCandidate()方法的最主要区别。当然,后者依赖于前者,依赖它来根据注解元数据判断是否是Lite模式的配置。

Spring 5.2.0版本变化说明


因为本文的讲解和代码均是基于Spring 5.2.2.RELEASE的,而并不是所有小伙伴都会用到这么新的版本。关于此部分的实现,以Spring 5.2.0版本为分界线实现上有些许差异,所以在此处做出说明。



相关文章
|
1天前
|
人工智能 JavaScript Linux
【Claude Code 全攻略】终端AI编程助手从入门到进阶(2026最新版)
Claude Code是Anthropic推出的终端原生AI编程助手,支持40+语言、200k超长上下文,无需切换IDE即可实现代码生成、调试、项目导航与自动化任务。本文详解其安装配置、四大核心功能及进阶技巧,助你全面提升开发效率,搭配GitHub Copilot使用更佳。
|
3天前
|
存储 人工智能 自然语言处理
OpenSpec技术规范+实例应用
OpenSpec 是面向 AI 智能体的轻量级规范驱动开发框架,通过“提案-审查-实施-归档”工作流,解决 AI 编程中的需求偏移与不可预测性问题。它以机器可读的规范为“单一真相源”,将模糊提示转化为可落地的工程实践,助力开发者高效构建稳定、可审计的生产级系统,实现从“凭感觉聊天”到“按规范开发”的跃迁。
597 11
|
7天前
|
存储 JavaScript 前端开发
JavaScript基础
本节讲解JavaScript基础核心知识:涵盖值类型与引用类型区别、typeof检测类型及局限性、===与==差异及应用场景、内置函数与对象、原型链五规则、属性查找机制、instanceof原理,以及this指向和箭头函数中this的绑定时机。重点突出类型判断、原型继承与this机制,助力深入理解JS面向对象机制。(238字)
|
6天前
|
云安全 人工智能 安全
阿里云2026云上安全健康体检正式开启
新年启程,来为云上环境做一次“深度体检”
1622 6
|
2天前
|
消息中间件 人工智能 Kubernetes
阿里云云原生应用平台岗位急招,加入我们,打造 AI 最强基础设施
云原生应用平台作为中国最大云计算公司的基石,现全面转向 AI,打造 AI 时代最强基础设施。寻找热爱技术、具备工程极致追求的架构师、极客与算法专家,共同重构计算、定义未来。杭州、北京、深圳、上海热招中,让我们一起在云端,重构 AI 的未来。
|
5天前
|
IDE 开发工具 C语言
【2026最新】VS2026下载安装使用保姆级教程(附安装包+图文步骤)
Visual Studio 2026是微软推出的最新Windows专属IDE,启动更快、内存占用更低,支持C++、Python等开发。推荐免费的Community版,安装简便,适合初学者与个人开发者使用。
626 10
|
8天前
|
缓存 算法 关系型数据库
深入浅出分布式 ID 生成方案:从原理到业界主流实现
本文深入探讨分布式ID的生成原理与主流解决方案,解析百度UidGenerator、滴滴TinyID及美团Leaf的核心设计,涵盖Snowflake算法、号段模式与双Buffer优化,助你掌握高并发下全局唯一ID的实现精髓。
372 160
|
7天前
|
人工智能 自然语言处理 API
n8n:流程自动化、智能化利器
流程自动化助你在重复的业务流程中节省时间,可通过自然语言直接创建工作流啦。
458 6
n8n:流程自动化、智能化利器
|
5天前
|
人工智能 Shell 开发工具
Claude Code 2.1.2超详细更新说明,小白也能10分钟上手
Claude Code 2.1.x重磅更新:Shift+Enter换行、Esc+Esc撤销、Ctrl+B后台运行,Skills技能系统全面升级,支持多语言、通配符权限与动态MCP检测,性能提升50%,迭代速度惊人,开发者效率暴涨!
Claude Code 2.1.2超详细更新说明,小白也能10分钟上手