@Configuration 什么时候被执行

本文解释了Spring框架中@Configuration注解的作用,它如何在应用启动时扫描并执行带有@Bean的方法,从而创建和配置bean。通过编程方式配置Spring应用,支持依赖注入。

@Configuration 是 Spring Framework 中用于定义配置类的注解。在 Spring 应用中,@Configuration 注解的类通常包含 @Bean 注解的方法,这些方法用于创建和初始化应用中的对象。

@Configuration 类通常在 Spring 应用上下文启动时被执行和处理。以下是具体的步骤:

  • 启动 Spring 应用上下文:当你启动一个 Spring 应用时(例如,通过 SpringApplication.run(MySpringApplication.class, args)),Spring 会开始加载应用上下文。
  • 加载配置类:Spring 会扫描类路径以查找带有 @Configuration 注解的类,并加载它们。这通常通过 @ComponentScan 实现,该注解告诉 Spring 在哪些包中查找组件。
  • 解析 @Bean 方法:对于每个 @Configuration 类,Spring 会解析其中带有 @Bean 注解的方法,并执行这些方法来创建 bean 实例。
  • 注册 Bean:创建的 bean 实例会被注册到 Spring 应用上下文中,以便其他部分的代码可以通过依赖注入来使用它们。
  • 依赖注入:当其他 bean 或组件需要这些已注册的 bean 时,Spring 会通过构造函数注入、属性注入或方法注入等方式将它们注入进去。

简而言之,@Configuration 类在 Spring 应用上下文启动时被执行,以创建和配置应用中的 bean 和其他组件。这使得你可以以编程方式(而非传统的 XML 配置方式)来配置你的 Spring 应用。

### @Configuration 注解在 Spring 框架中创建对象的时机 Spring 框架中,`@Configuration` 注解用于标记一个类作为配置类,其作用类似于传统的 XML 配置文件。当 Spring 应用上下文启动时,`@Configuration` 注解的类会被解析,并通过一系列机制来创建和管理 Bean 实例。 #### 1. 创建对象的时机 Spring 在启动过程中会调用 `ConfigurationClassPostProcessor` 的 `postProcessBeanDefinitionRegistry` 方法[^2]。该方法的主要任务是扫描所有的 Bean 定义,查找带有 `@Configuration` 注解的类,并将这些类注册为配置类。具体流程如下: - **扫描阶段**:Spring 会遍历所有已注册的 Bean 定义名称,检查它们是否被 `@Configuration` 注解标记。如果找到这样的类,则将其视为配置类候选者并加入到 `configCandidates` 集合中[^4]。 - **解析阶段**:一旦确定了配置类候选者,Spring 会进一步解析这些类中的内容。对于每个方法上标注了 `@Bean` 的定义,Spring 会将其视为一个 Bean 定义,并生成相应的元数据[^5]。 - **实例化阶段**:当某个 Bean 被实际请求时(例如通过依赖注入或显式获取),Spring 才会根据 `@Bean` 方法的定义创建对应的对象实例。这意味着对象的创建是延迟的,只有在需要时才会触发实例化过程[^3]。 #### 2. 对象创建的具体过程 以下是 `@Configuration` 注解对象创建的具体过程: - **代理机制**:`@Configuration` 类通常会被 CGLIB 动态代理所包装。这样做的目的是为了支持依赖注入和方法间调用的缓存机制。例如,当一个 `@Configuration` 类中的方法调用了另一个 `@Bean` 方法时,Spring 会确保返回的是同一个 Bean 实例,而不是每次都重新创建[^5]。 - **Bean 定义解析**:Spring 会解析 `@Configuration` 类中的所有 `@Bean` 方法,并将它们转化为 Bean 定义。这些定义会被存储在容器中,等待后续使用[^3]。 - **依赖注入与初始化**:当容器中的某个 Bean 被请求时,Spring 会根据其依赖关系自动完成注入,并执行必要的初始化逻辑。如果该 Bean 是由 `@Bean` 方法定义的,则会调用对应的方法来创建实例[^1]。 #### 3. 示例代码 以下是一个简单的示例,展示了 `@Configuration` 和 `@Bean` 的使用方式以及对象创建的时机: ```java @Configuration public class AppConfig { @Bean public MyService myService() { return new MyServiceImpl(); } } // 当容器启动时,Spring 会解析 AppConfig 类并注册 myService 方法对应的 Bean 定义。 // 只有在实际请求 myService Bean 时,Spring 才会调用 myService 方法创建实例。 ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值