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。



相关文章
|
1天前
|
Java Spring
【Spring配置】创建yml文件和properties或yml文件没有绿叶
本文主要针对,一个项目中怎么创建yml和properties两种不同文件,进行配置,和启动类没有绿叶标识进行解决。
|
6天前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
34 6
|
1天前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
|
1天前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
|
1天前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
|
1天前
|
Java Spring
【Spring配置】idea编码格式导致注解汉字无法保存
问题一:对于同一个项目,我们在使用idea的过程中,使用汉字注解完后,再打开该项目,汉字变成乱码问题二:本来a项目中,汉字注解调试好了,没有乱码了,但是创建出来的新的项目,写的注解又成乱码了。
|
1天前
|
Java Spring
【Spring配置相关】启动类为Current File,如何更改
问题场景:当我们切换类的界面的时候,重新启动的按钮是灰色的,不能使用,并且只有一个Current File 项目,下面介绍两种方法来解决这个问题。
|
7月前
|
消息中间件 SpringCloudAlibaba Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
1035 0
|
XML Java 数据库连接
【Spring学习笔记 五】Spring注解及Java类配置开发
【Spring学习笔记 五】Spring注解及Java类配置开发
102 0
|
XML Java 数据格式
Spring学习笔记:02 spring配置
Spring学习笔记:02 spring配置