java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring Boot 注解生效

Spring Boot 的注解生效详细步骤解析

作者:许苑向上

Spring通过扫描、解析、注册分层处理配置类注解(如@Configuration、@ComponentScan等),利用递归、延迟加载和缓存机制,实现BeanDefinition的动态注册与灵活扩展,解决依赖和性能问题,本文给大家介绍Spring Boot的注解生效详细步骤解析,感兴趣的朋友跟随小编一起看看吧

在 Spring 中,@Configuration@ComponentScan@Bean@Import 等注解的扫描、解析和 BeanDefinition 注册是一个分层处理的过程。下面我们以 @Configuration为例,结合代码流程详细说明其从扫描到注册的完整逻辑。

1. 整体流程概览

以下是核心步骤的流程图:

1. 扫描候选配置类 → 2. 解析注解元数据 → 3. 注册 BeanDefinition

具体分为以下阶段:

  1. 扫描阶段:通过 BeanDefinitionRegistry 获取所有候选配置类。
  2. 解析阶段:使用 ConfigurationClassParser 解析注解(如 @ComponentScan@Bean@Import)。
  3. 注册阶段:通过 ConfigurationClassBeanDefinitionReader 将解析结果注册为 BeanDefinition

2. 详细步骤解析

2.1 扫描阶段:识别候选配置类

触发入口
ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry()
逻辑

  1. BeanDefinitionRegistry 获取所有已注册的 BeanDefinition 名称:
    String[] beanNames = registry.getBeanDefinitionNames();
  2. 遍历这些名称,检查对应的 BeanDefinition 是否是候选配置类:
    • 条件:类上有 @Configuration@Component@ComponentScan@Import@ImportResource,或类中有 @Bean 方法。
    • 判断逻辑
      if (isFullConfigurationCandidate(beanDef) || isLiteConfigurationCandidate(beanDef)) {
          configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));
      }
      
    • isFullConfigurationCandidate(beanDef):检查是否有 @Configuration 注解。
    • isLiteConfigurationCandidate(beanDef):检查是否有其他相关注解(如 @Component@Bean 方法)。

关键点

2.2 解析阶段:处理注解元数据

核心类ConfigurationClassParser
入口方法parse()
逻辑:递归解析每个候选配置类的注解。

(1) 解析@ComponentScan

(2) 解析@Bean方法

(3) 解析@Import

(4) 处理父类与接口

2.3 注册阶段:加载BeanDefinition

核心类ConfigurationClassBeanDefinitionReader
入口方法loadBeanDefinitions()
逻辑:将解析结果(ConfigurationClass 对象)转换为 BeanDefinition 并注册到容器。

(1) 注册@Import的类

(2) 注册@Bean方法

(3) 处理嵌套配置类

3. 关键设计点

(1) 延迟加载与递归处理

(2) 元数据存储

(3) 性能优化

4. 示例全流程

场景

@Configuration
@ComponentScan("com.example.service")
@Import(OtherConfig.class)
public class AppConfig {
    @Bean
    public DataSource dataSource() {
        return new HikariDataSource();
    }
}

步骤

  1. 扫描阶段
    • 发现 AppConfig 是候选配置类(有 @Configuration)。
  2. 解析阶段
    • 解析 @ComponentScan:扫描 com.example.service 包,注册 @Service 类。
    • 解析 @Import(OtherConfig.class):递归处理 OtherConfig
    • 解析 @Bean dataSource():生成工厂方法 BeanDefinition
  3. 注册阶段
    • 注册 OtherConfig 及其 @Bean 方法。
    • 注册 dataSourceBeanDefinition

5. 总结

Spring 对配置类注解的处理是一个分层递归的过程:

  1. 扫描:通过 BeanDefinitionRegistry 筛选候选类。
  2. 解析ConfigurationClassParser 解析注解并生成中间结果(ConfigurationClass)。
  3. 注册ConfigurationClassBeanDefinitionReader 将解析结果转换为 BeanDefinition

这种设计将注解元数据解析与 BeanDefinition 注册分离,确保了灵活性和扩展性(如支持动态 ImportSelector)。同时,递归处理和缓存机制解决了复杂依赖和性能问题。

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

您可能感兴趣的文章:
阅读全文