看技术总监如何带你了解:Spring Bean的定义包含哪些内容?

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 昨天,有几位同学就私信我,说老师能不能发一期关于Spring Bean定义的详细介绍,今天我就来满足大家的要求。关于Spring Bean的定义我一共分为三部分来介绍,首先,介绍Spring Bean声明式配置内容;然后,介绍BeanDefinition与配置文件的关系;最后,介绍Spring如何解析配置文件?

昨天,有几位同学就私信我,说老师能不能发一期关于Spring Bean定义的详细介绍,今天我就来满足大家的要求。关于Spring Bean的定义我一共分为三部分来介绍,首先,介绍Spring Bean声明式配置内容;然后,介绍BeanDefinition与配置文件的关系;最后,介绍Spring如何解析配置文件?


咱们先来看Spring Bean声明式配置内容有哪些?

1、Spring Bean声明式配置内容

关于Spring Bean的配置内容非常多,我主要列举九个关键的配置属性,比如:class、scope、lazy-init、depends-on、name、constructor-arg、properties、init-method、destroy-method等。


这些属性都是要在Spring配置文件中声明的内容。在Spring容器启动后,这些配置内容都会映射到一个叫做BeanDefinition的对象中。然后,所有的BeanDefinition对象都会保存到一个叫做beanDefinitionMap的容器中,这个容器是Map类型,以Bean的唯一标识作为key,以BeanDefinition对象实例作为值。这样Spring容器创建Bean时,就不需要再次读取和解析配置文件,只需要根据Bean的唯一标识,去beanDefinitionMap中取到对应的BeanDefinition对象即可。


那么,接下来我们看一下BeanDefinition是如何定义的。

2、BeanDefinition与配置文件的关系

我们可以对照源码来看,BeanDefinition的基础实现类AbstractBeanDefinition类,这个类下面的所有属性都能够和声明配置文件中的内容一一对应上,来看代码:

public AbstractBeanDefinition implements BeanDefinition {    ...@Nullableprivate volatile Object beanClass;@Nullableprivate String scope = SCOPE_DEFAULT;private boolean lazyInit = false;@Nullableprivate String[] dependsOn;@Nullableprivate String factoryBeanName;@Nullableprivate ConstructorArgumentValues constructorArgumentValues;@Nullableprivate MutablePropertyValues propertyValues;@Nullableprivate String initMethodName;@Nullableprivate String destroyMethodName;    ...}

我们可以看到,BeanDefinition中定义的属性和声明式的配置内容从命名上看比较类似。本期视频中,我重点介绍5个:


1、beanClass对应的配置是class,这个属性为必填项,用于指向一个具体存在的Java类,Spring容器创建的Bean就是这个Java类的实例。


2、lazyInit对应的配置是lazy-init,用于指定Bean实例是否延时加载,我们能清楚地看到默认值是false。也就是说容器启动时就会创建Bean对应的实例,如果设置为true,则只有在首次获取Bean的实例时才创建。


3、dependsOn对应的配置是depends-on,用于定义Bean实例化的依赖关系。在Spring容器对Bean的实例初始化之前,有可能存在其他依赖,这需要需要保证其所以依赖的Bean需要提前实例化,depends-on可以用来定义Bean的依赖顺序。在BeanDefinition中属性定义的数据类型是字符串数组,也就是说可以同时定义多个依赖对象。


4、factoryBeanName对应的配置就是name,这个属性用于定义Bean的唯一标识,且不能以大写字母开头。在XML配置中,使用id或name属性来指定。如果没有设值,Spring默认使用类名首字母小写作为唯一标识。


5、constructorArgumentValues对应的配置是constructor-arg,它其实也是一个数组。如果Java类中定义了有参构造方法,则可以使用此属性给有参构造方法注入参数值。如果没有默认的无参构造方法,那么,这个属性必填。


其他的属性我相信小伙伴根据属性名称也能够自己一一对应上。我呢,也给大家整理成了一个表格,有需要完整表格的小伙伴可以在评论区留言,可以发给大家。


Spring Bean声明式配置和BeanDefinition属性定义对照表

bd6a382d2258e969a26eca16c49b19b1.png

对照源码看完之后,大家应该非常清楚Spring Bean定义的关键内容包含哪些属性了。那么,Spring又是如何解析这些配置文件变成BeanDefinition对象的呢?

3、Spring如何解析配置文件?

Spring容器启动之后,会调用BeanDefinitionReader工具类的loadBeanDefinitions()方法,启动对配置文件的加载和解析。 BeanDefinitionReader 的主要作用是读取 Spring 配置文件中的内容,将其转换为BeanDefinition对象。而BeanDefinitionReader又有非常多的实现类,每种类型的配置具体解析的过程又不一样,比如


XmlBeanDefinitionReader , 用于读取 XML 文件并解析为BeanDefinition对象。


PropertiesBeanDefinitionReader,用于读取属性文件,将Resource,Property 等解析为BeanDefinition对象。


GroovyBeanDefinitionReader,用于读取 Groovy 语言定义的 Bean,将它们解析为BeanDefinition对象。


以上就是关于Spring Bean定义的全部解析。


我是被编程耽误的文艺Tom,关注我,面试不再难!

3c2047b0ee454886b4e6edf75f6c98c3.gif

相关文章
|
19天前
|
XML 安全 Java
|
2天前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
17 6
|
3天前
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
29 3
|
4月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
1月前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
17天前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
27 1
|
2月前
|
XML Java 数据格式
Spring从入门到入土(bean的一些子标签及注解的使用)
本文详细介绍了Spring框架中Bean的创建和使用,包括使用XML配置文件中的标签和注解来创建和管理Bean,以及如何通过构造器、Setter方法和属性注入来配置Bean。
80 9
Spring从入门到入土(bean的一些子标签及注解的使用)
|
3月前
|
缓存 安全 Java
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
315 24
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
|
2月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
3月前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
247 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
下一篇
DataWorks