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 截取视频资料中的某一帧作为缩略图,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Java使用selenium实现滑块验证的处理方法

    Java使用selenium实现滑块验证的处理方法

    本文介绍如何用Java的Selenium实现滑块验证码的处理,以及如何通过分析背景图片找到需要移动的距离,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-09-09
  • MyBatis-Plus自动填充字段的详细教程

    MyBatis-Plus自动填充字段的详细教程

    今天编写一个详细的教程来介绍如何在 Spring Boot 项目中使用 MyBatis-Plus 实现自动填充时间字段(如创建时间 createTime 和更新时间 updateTime),可以分为以下几个部分,这个教程将涵盖从项目配置到自动填充的完整过程,需要的朋友可以参考下
    2024-08-08
  • 解决JavaWeb-file.isDirectory()遇到的坑问题

    解决JavaWeb-file.isDirectory()遇到的坑问题

    JavaWeb开发中,使用`file.isDirectory()`判断路径是否为文件夹时,需要特别注意:该方法只能判断已存在的文件夹,若路径不存在,无论其实际是否应为文件夹,均会返回`false`,为了解决这个问题,可以采用正则表达式进行判断,但要求路径字符串的结尾必须添加反斜杠(\)
    2025-02-02
  • 详解Java设计模式——迭代器模式

    详解Java设计模式——迭代器模式

    这篇文章主要介绍了Java设计模式——迭代器模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • SpringBoot读取properties文件配置项过程解析

    SpringBoot读取properties文件配置项过程解析

    这篇文章主要介绍了SpringBoot读取properties文件配置项过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Java对zip,rar,7z文件带密码解压实例详解

    Java对zip,rar,7z文件带密码解压实例详解

    在日常业务中,会遇到一些琐碎文件需要打包到一个压缩包中上传,业务方在后台接收到压缩包后自行解压,然后解析相应文件。而且可能涉及安全保密,因此会在压缩时带上密码,要求后台业务可以指定密码进行解压。本文将用Java解决这一问题,需要的可以参考一下
    2022-07-07
  • Spring Cloud Gateway 默认的filter功能和执行顺序介绍

    Spring Cloud Gateway 默认的filter功能和执行顺序介绍

    这篇文章主要介绍了Spring Cloud Gateway 默认的filter功能和执行顺序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • springboot调用HTML文件注意事项及说明

    springboot调用HTML文件注意事项及说明

    这篇文章主要介绍了springboot调用HTML文件注意事项及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java微信二次开发(二) Java微信文本消息接口请求与发送

    Java微信二次开发(二) Java微信文本消息接口请求与发送

    这篇文章主要为大家详细介绍了Java微信二次开发第二篇,Java微信文本消息接口请求与发送功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04

最新评论