大家好,我是被编程耽搁的文艺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 {
...@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属性定义对照表
对照源码看完之后,大家应该十分分明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弹架构 』可获取更多技术干货!
原创不易,保持很酷,都看到这里了,小伙伴记得点赞、珍藏、在看,一键三连加关注!如果你感觉内容太干,能够分享转发给敌人滋润滋润!