Bean背后的魔法:揭秘Spring配置Bean的实现原理

简介: Bean背后的魔法:揭秘Spring配置Bean的实现原理


Spring 的 @Configuration 注解是用于标记一个类为配置类的注解。它告诉 Spring 容器这个类是用来定义 bean 的配置类,Spring 在启动时会扫描带有 @Configuration 注解的类,并根据其中的配置信息创建和管理相应的 bean。

@Configuration 注解的底层实现原理主要涉及两个关键的组件:ConfigurationClassPostProcessorConfigurationClassParser

  1. ConfigurationClassPostProcessor:这是一个 Bean 后置处理器,负责处理带有 @Configuration 注解的类。在 Spring 容器启动时,ConfigurationClassPostProcessor 会扫描并解析带有 @Configuration 注解的类,将其中的配置信息转换为 BeanDefinition 对象,然后注册到 Spring 容器中。
  2. ConfigurationClassParser:这是一个配置类解析器,负责解析带有 @Configuration 注解的类。它会分析配置类中的方法和字段,识别出其中的 bean 定义、依赖关系、切面等信息,并将其转换为对应的 BeanDefinition 对象。ConfigurationClassParser 还支持处理 @Import@ImportResource@ComponentScan 等注解,以支持更复杂的配置场景。

通过以上的底层组件协同工作,Spring 能够正确解析和处理带有 @Configuration 注解的类,将其中的配置信息转换为可管理的 bean,并将其注册到 Spring 容器中。这样,我们就可以使用 @Configuration 注解来定义和组织应用程序的配置,实现依赖注入、AOP、事务管理等功能。

在 Spring 中,@Configuration 注解标记的配置类在创建 Bean 时使用的是 CGLIB(Code Generation Library)动态代理技术。

CGLIB 是一个基于字节码生成的开源库,它通过生成目标类的子类来实现动态代理。当 Spring 容器扫描到带有 @Configuration 注解的类时,会使用 CGLIB 动态代理来创建该配置类的代理对象。这个代理对象会拦截对配置类中的方法的调用,并根据方法上的注解信息来决定是否需要创建相应的 Bean。

具体而言,当使用 @Configuration 注解标记的类被 Spring 容器扫描到后,Spring 会使用 Enhancer 类创建一个目标类的子类。这个子类继承了目标类的所有方法,并重写了其中带有 @Bean 注解的方法。在重写的方法中,Spring 会通过调用父类的方法来获取 Bean 实例,并根据方法上的注解信息进行相应的处理,例如单例、原型等。然后,Spring 将这些生成的子类作为真正的 Bean 定义注册到容器中。

使用 CGLIB 动态代理的好处是,它能够在运行时动态地生成代理类,并且不需要目标类实现任何接口。这使得 @Configuration 注解的配置类可以更加灵活地定义和管理 Bean,而不受接口限制。

需要注意的是,当一个配置类中的方法被其他方法调用时,CGLIB 动态代理会保证被调用的方法的代理逻辑也能正常执行。这样,Spring 能够正确地处理配置类中的依赖关系,并按照正确的顺序创建和初始化 Bean。



相关文章
|
6天前
|
安全 Java Spring
Spring框架中的单例Bean是线程安全的吗?
Spring框架中的单例Bean是线程安全的吗?
10 1
|
6天前
|
安全 Java 开发者
深入理解Spring Boot配置绑定及其实战应用
【4月更文挑战第10天】本文详细探讨了Spring Boot中配置绑定的核心概念,并结合实战示例,展示了如何在项目中有效地使用这些技术来管理和绑定配置属性。
16 1
|
6天前
|
XML 前端开发 Java
【JavaEE】深入了解Spring中Bean的可见范围(作用域)以及前世今生(生命周期)
【JavaEE】深入了解Spring中Bean的可见范围(作用域)以及前世今生(生命周期)
10 0
|
6天前
|
存储 缓存 Java
【JavaEE】Spring中注解的方式去获取Bean对象
【JavaEE】Spring中注解的方式去获取Bean对象
3 0
|
6天前
|
存储 Java 对象存储
【JavaEE】Spring中注解的方式去存储Bean对象
【JavaEE】Spring中注解的方式去存储Bean对象
9 0
|
6天前
|
存储 Java 对象存储
【JavaEE】DI与DL的介绍-Spring项目的创建-Bean对象的存储与获取
【JavaEE】DI与DL的介绍-Spring项目的创建-Bean对象的存储与获取
9 0
|
6天前
|
XML Java 数据格式
Spring高手之路18——从XML配置角度理解Spring AOP
本文是全面解析面向切面编程的实践指南。通过深入讲解切面、连接点、通知等关键概念,以及通过XML配置实现Spring AOP的步骤。
23 6
Spring高手之路18——从XML配置角度理解Spring AOP
|
6天前
|
消息中间件 开发框架 Java
什么是Spring Boot 自动配置?
Spring Boot 是一个流行的 Java 开发框架,它提供了许多便利的功能和工具,帮助开发者快速构建应用程序。其中一个最引人注目的特性是其强大的自动配置功能。
11 0
|
6天前
|
设计模式 Java 测试技术
Spring状态机的实现原理和业务场景
**Spring State Machine**是Spring框架的一部分,它提供了一种实现状态机的方式,允许开发者定义状态机的状态、事件、行为和转换。状态机是一种计算模型,根据一系列规则从一个状态转移到另一个状态。【5月更文挑战第4天】
|
6天前
|
Java Spring
Spring文件配置以及获取
Spring文件配置以及获取
14 0