共计 2797 个字符,预计需要花费 7 分钟才能阅读完成。
大家好,我是被编程耽搁的文艺 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 类,这个类上面的所有属性都可能和申明配置文件中的内容一一对应上,来看代码:
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,如果大家还有其余疑难,能够在评论区留言。如果我的解析对你有帮忙,请动动手指一键三连分享给更多的人。
关注我,面试不再难!
关注『Tom 弹架构』回复“MongoDB”可获取配套材料。
- 本文为“Tom 弹架构”原创,转载请注明出处。技术在于分享,我分享我高兴!如果您有任何倡议也可留言评论或私信,您的反对是我保持创作的能源。关注『Tom 弹架构』可获取更多技术干货!
原创不易,保持很酷,都看到这里了,小伙伴记得点赞、珍藏、在看,一键三连加关注!如果你感觉内容太干,能够分享转发给敌人滋润滋润!