当前位置: 首页 > java >正文

SpringBoot注解生效原理分析

Spring Boot 注解生效原理分析

Spring Boot 的注解**(如 @RestController、@Service、@Autowired、@Configuration 等)在开发中使用非常广泛,但它们为什么能“自动生效”?**本文将深入解析其背后的原理。

Spring 注解的生效依赖于 Spring 容器(ApplicationContext) 和 注解处理器(BeanPostProcessor / ConfigurationClassPostProcessor 等)。

前置:Bean 的声明与注册

@Component、@Service、@Controller、@Repository 等注解,都是用于标记一个类为 Spring 管理的 Bean。

生效机制

1、 @Configuration@Component@ComponentScan 生效原因如下:
Spring 在启动时,进行上下文刷新refreshContex()然后触发ConfigurationClassPostProcessor扫描所有 @Configuration@Component等类注册成BeanDefination, @ComponentScan 触发包扫描,找到其他 @Component/@Service/@Controller将其也注册成 BeanDefination。

2、自动注入 @Autowired 实现机制:
@Autowired 的生效依赖:依赖注入(DI)机制 和 后置处理器(BeanPostProcessor)。
关键类:
AutowiredAnnotationBeanPostProcessor 处理 @Autowired 注解。
处理流程:

  1. AutowiredAnnotationBeanPostProcessor负责扫描所有 Bean 中的 @Autowired 注解,决定注入哪一个 Bean。
  2. DependencyDescriptor描述依赖关系,包括类型、是否必需、泛型等。
  3. BeanFactory提供 Bean 实例,用于实际注入。

1. 启动入口

  • SpringApplication.run(App.class, args)
    → 创建 ApplicationContext(通常是 AnnotationConfigServletWebServerApplicationContext
    → 调用 refresh()(IOC 容器的核心刷新过程)。

2. refresh() 关键步骤

AbstractApplicationContext#refresh() 中有一行核心逻辑:

invokeBeanFactoryPostProcessors(beanFactory);

这里会执行所有 BeanFactoryPostProcessor,其中最重要的是:
👉 ConfigurationClassPostProcessor


3. ConfigurationClassPostProcessor 的作用

源码示例图:
在这里插入图片描述

它是专门为配置类服务的后处理器,主要任务:

  1. 扫描所有 @Configuration 类。
  2. 交给 ConfigurationClassParser 解析成配置模型。
  3. 交给 ConfigurationClassBeanDefinitionReader 转换成 BeanDefinition 并注册到容器。

4. ConfigurationClassParser 的职责

ConfigurationClassPostProcessor 检测到配置类时,就会调用 ConfigurationClassParser 解析。

注意:它不是直接生成 BeanDefinition
它的作用是:

  • 读取配置类上的元注解信息(通过 AnnotationMetadata)。

  • 根据不同注解做不同解析:

    • @Configuration → 标记为配置类,继续处理内部的 @Bean 方法。
    • @Component → 标记为普通组件,后续注册。
    • @ComponentScan → 触发包扫描,找到其他 @Component/@Service/@Controller
    • @Import → 导入配置类或交给 ImportSelector / ImportBeanDefinitionRegistrar
    • @ImportResource → 加载 XML 配置。
  • 递归解析,构建出一棵配置类的内部描述模型:ConfigurationClass

👉 它相当于 语法分析器,把配置类源信息转成中间表示。


5. ConfigurationClassBeanDefinitionReader 的职责

  • 接收 ConfigurationClassParser 解析出来的 ConfigurationClass 模型。

  • 生成并注册 BeanDefinition

    • @Bean 方法 → 生成工厂方法对应的 BeanDefinition。
    • @Import 导入的类 → 注册。
    • 包扫描结果的组件 → 注册。
  • 将这些 BeanDefinition 放入 BeanDefinitionRegistry,等待容器实例化。

👉 它相当于 代码生成器,把中间表示落地成可用的 Bean 定义。


6. 整体链路总结

  1. SpringApplication.run() → 创建 ApplicationContext
  2. refresh() → 执行 invokeBeanFactoryPostProcessors()
  3. ConfigurationClassPostProcessor 介入。
  4. ConfigurationClassParser 解析配置类 → 生成 ConfigurationClass 模型。
  5. ConfigurationClassBeanDefinitionReader 将模型转化为 BeanDefinition
  6. BeanDefinitionRegistry 注册所有 生成的BeanDefinition。
  7. 容器实例化 → Bean 生效。

📌 核心记忆

  • ConfigurationClassParser:负责解析配置类 → 生成 ConfigurationClass 模型。
  • ConfigurationClassBeanDefinitionReader:负责将模型转为 BeanDefinition 并注册。
  • 最终 @Configuration/@Component/@Bean 等注解能生效,是因为这套机制在容器刷新时自动执行。

核心流程图总结

refresh()// 容器核心刷新流程入口
invokeBeanFactoryPostProcessors()// 执行 BeanFactoryPostProcessor,增强 BeanFactory
ConfigurationClassPostProcessor// 识别并处理 @Configuration、@ComponentScan、@Import 等配置类
ConfigurationClassParser// 解析配置类注解,生成 ConfigurationClass 模型(中间表示)
ConfigurationClassBeanDefinitionReader// 将 ConfigurationClass 转换为 BeanDefinition
BeanDefinitionRegistry(注册 BeanDefinition)↓   // 将 BeanDefinition 注册到 IOC 容器
IOC 容器实例化 Bean// 根据 BeanDefinition 实例化对象,完成依赖注入并放入单例池
http://www.xdnf.cn/news/19898.html

相关文章:

  • AI落地新趋势:美林数据揭示大模型与小模型的协同进化论
  • Java中 String、StringBuilder 和 StringBuffer 的区别?
  • 小皮80端口被NT内核系统占用解决办法
  • 期货反向跟单—从小白到高手的进阶历程 七(翻倍跟单问题)
  • 【Java】对于XML文档读取和增删改查操作与JDBC编程的读取和增删改查操作的有感而发
  • 加解密安全-侧信道攻击
  • Python分布式任务队列:万级节点集群的弹性调度实践
  • Unity 枪械红点瞄准器计算
  • linux内核 - 服务进程是内核的主要责任
  • dockerfile文件的用途
  • 机器能否真正语言?人工智能NLP面临的“理解鸿沟与突破
  • 键盘上面有F3,四,R,F,V,按下没有反应,维修记录
  • Echo- Go Web Framework的介绍
  • MCP over SSE 通信过程详解:双通道架构下的高效对话
  • 关于牙科、挂号、医生类小程序或管理系统项目 项目包含微信小程序和pc端两部分
  • 《计算机网络安全》实验报告一 现代网络安全挑战 拒绝服务与分布式拒绝服务攻击的演变与防御策略(1)
  • createrepo生成yum仓库元数据xml文件
  • 【机器学习学习笔记】逻辑回归实现与应用
  • 微信小程序预览和分享文件
  • AI生成内容的版权迷局:GPT-4输出的“创意”版权风险与规避之道
  • 解决服务器 DNS 解析失败,从这几步排查开始
  • MiniCPM-V 4.5 模型解析
  • 代码随想录算法训练营第二天| 209.长度最小的子数组
  • 变频器实习DAY42 VF与IF电机启动方式
  • 开源网络流量分析利器:tproxy
  • 嵌入式 - 硬件:51单片机(2)
  • daily notes[9]
  • 校园外卖点餐系统(代码+数据库+LW)
  • try-catch:异常处理的最佳实践与陷阱规避
  • MMD动画(一)模型、动作、音乐导入