SpringBoot注解生效原理全解析

 更新时间:2025年09月11日 11:29:27   作者:许苑向上  
Spring Boot注解自动生效依赖于Spring容器和处理机制,通过扫描、解析配置类生成BeanDefinition,再由容器实例化,实现@Autowired等注解的自动注入与组件注册,本文给大家介绍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. 通过postProcessBeanDefinitionRegistry()触发配置类的扫描和解析
  3. 交给 ConfigurationClassParser 解析成配置模型。
  4. 交给 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 实例化对象,完成依赖注入并放入单例池

到此这篇关于SpringBoot注解生效原理全解析的文章就介绍到这了,更多相关SpringBoot注解生效原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java信号量全解析

    Java信号量全解析

    这篇文章主要介绍了Java信号量的相关资料,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2021-01-01
  • Spring Cloud重试机制与各组件的重试总结

    Spring Cloud重试机制与各组件的重试总结

    这篇文章主要给大家介绍了关于Spring Cloud中重试机制与各组件的重试的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • java项目jar包与jdk的版本不兼容的问题解决

    java项目jar包与jdk的版本不兼容的问题解决

    这篇文章主要介绍了java项目jar包与jdk的版本不兼容的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • springboot多开端口操作方式

    springboot多开端口操作方式

    本文介绍了在IDEA中修改端口名和启动类路径的方法,提供了两种方式添加端口配置,并且建议只选择一种方式进行修改,最后点击Apply和OK保存更改
    2026-05-05
  • Struts2实现对action请求对象的拦截操作方法

    Struts2实现对action请求对象的拦截操作方法

    这篇文章主要介绍了Struts2实现对action请求对象的拦截操作方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-11-11
  • Struts2学习笔记(8)-Result常用类型

    Struts2学习笔记(8)-Result常用类型

    这篇文章主要介绍Struts2中Result四种常用的类型的用法,希望能给大家做一个参考。
    2016-06-06
  • 布隆过滤器详解以及其在Java中的实际应用

    布隆过滤器详解以及其在Java中的实际应用

    布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,这篇文章主要给大家介绍了关于布隆过滤器详解以及其在Java中的实际应用,需要的朋友可以参考下
    2023-12-12
  • java中 利用正则表达式提取( )内内容

    java中 利用正则表达式提取( )内内容

    本篇文章,小编为大家介绍关于java中 利用正则表达式提取( )内内容,有需要的朋友可以参考一下
    2013-04-04
  • 在SpringMVC框架下实现文件的上传和下载示例

    在SpringMVC框架下实现文件的上传和下载示例

    本篇文章主要介绍了在SpringMVC框架下实现文件的上传和下载示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-02-02
  • Java实现导入csv的示例代码

    Java实现导入csv的示例代码

    这篇文章主要为大家详细介绍了Java实现导入csv的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以跟随小编一起学习一下
    2024-03-03

最新评论