前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Bean的定义包含哪些内容?

Spring Bean的定义包含哪些内容?

作者头像
Tom弹架构
发布2022-08-22 14:12:10
5570
发布2022-08-22 14:12:10
举报
文章被收录于专栏:Tom弹架构Tom弹架构

大家好,我是被编程耽误的文艺Tom。

前面我发了一个关于Spring Bean的视频。在这个视频中,我简单提到了Spring Bean的定义。其中,有几位同学就私信我,说老师能不能拍一期关于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类,这个类下面的所有属性都能够和声明配置文件中的内容一一对应上,来看代码:

代码语言:javascript
复制
public AbstractBeanDefinition implements BeanDefinition {

    ...

	@Nullable
	private volatile Object beanClass;

	@Nullable
	private String scope = SCOPE_DEFAULT;

	private boolean lazyInit = false;

	@Nullable
	private String[] dependsOn;

	@Nullable
	private String factoryBeanName;

	@Nullable
	private ConstructorArgumentValues constructorArgumentValues;

	@Nullable
	private MutablePropertyValues propertyValues;

	@Nullable
	private String initMethodName;

	@Nullable
	private 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属性定义对照表

对照源码看完之后,大家应该非常清楚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,如果大家还有其他疑问,可以在评论区留言。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Tom弹架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、Spring Bean声明式配置内容
  • 2、BeanDefinition与配置文件的关系
  • 3、Spring如何解析配置文件?
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档