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 注解。
处理流程:
- AutowiredAnnotationBeanPostProcessor负责扫描所有 Bean 中的 @Autowired 注解,决定注入哪一个 Bean。
- DependencyDescriptor描述依赖关系,包括类型、是否必需、泛型等。
- BeanFactory提供 Bean 实例,用于实际注入。
1. 启动入口
SpringApplication.run(App.class, args)
→ 创建ApplicationContext
(通常是AnnotationConfigServletWebServerApplicationContext
)
→ 调用refresh()
(IOC 容器的核心刷新过程)。
2. refresh()
关键步骤
在 AbstractApplicationContext#refresh()
中有一行核心逻辑:
invokeBeanFactoryPostProcessors(beanFactory);
这里会执行所有 BeanFactoryPostProcessor
,其中最重要的是:
👉 ConfigurationClassPostProcessor
3. ConfigurationClassPostProcessor
的作用
源码示例图:
它是专门为配置类服务的后处理器,主要任务:
- 扫描所有
@Configuration
类。 - 交给
ConfigurationClassParser
解析成配置模型。 - 交给
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. 整体链路总结
SpringApplication.run()
→ 创建ApplicationContext
。refresh()
→ 执行invokeBeanFactoryPostProcessors()
。ConfigurationClassPostProcessor
介入。ConfigurationClassParser
解析配置类 → 生成ConfigurationClass
模型。ConfigurationClassBeanDefinitionReader
将模型转化为BeanDefinition
。BeanDefinitionRegistry
注册所有 生成的BeanDefinition。- 容器实例化 → 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 实例化对象,完成依赖注入并放入单例池