Spring-Bean包分析
Spring Beans包概述spring beans 包主要用来处理Spring Bean,包括Bean的容器定义、Bean的生命周期、Bean的初始化、Bean配置加载等。spring 提供了三种Bean的配置方式,包括xml配置、Java config配置、groovy配置。结构图spring-beans 下主要包含annotation、factory、propertyeditors...
我的个人网址: zidot.cn
Spring Beans
包概述
spring beans 包主要用来处理Spring Bean,包括Bean的容器定义、Bean的生命周期、Bean的初始化、Bean配置加载等。spring 提供了三种Bean的配置方式,包括xml配置、Java config配置、groovy配置。
结构图
spring-beans 下主要包含annotation、factory、propertyeditors、support包。最主要的是factory、propertyeditors包了。我精心整理了包下关键的接口或类,并绘制了类图。如下图
spring-beans 包结构:
其中有几个核心的类,如下:
- BeanInfoFactory
- ExtendedBeanInfo
- BeanWrapper
BeanInfoFactory
BeanInfoFactory 是BeanInfo 工厂类,用来生成指定的Bean Class的描述类BeanInfo。BeanInfoFactory的实现类是ExtendedBeanInfoFactory,其中getBeanInfo方法放回的其实是ExtendedBeanInfo实例。有一点要注意ExtendedBeanInfoFactory 中的getBeanInfo 每次返回的是新的BeanInfo对象,内部没有作缓存。
那BeanInfo是用来做什么的呢。其实BeanInfo,是在java.beans包下,是java标准的一个接口。用来描述Iava Bean的一些信息。我们可以通过java 提供的 Introspector#getBeanInfo 方法获取指定类的的BeanInfo实例。
ExtendedBeanInfo
ExtendedBeanInfo 采用了代理模式,继承了BeanInfo接口,持有一个BeanInfo实例的引用。
BeanWrapper
BeanWrapper 是Spring Bean的包装类,通过它我们可以非常方便的访问Bean的属性、获取某个属性的值或给某个属性赋值。Spring 还提供了强大的类型转换机制,在给Bean属性赋值时,进行对应的类型转换工作,这个转换是由TypeConverter来定义并由AbstractNestablePropertyAccessor类实现。
对Bean属性的访问、赋值是通过PropertyAccessor来实现的。PropertyAccessor 支持嵌套的属性访问和数组访问,我们可以用路径来表式一个属性,如:“foo.bar”,“person.addresses[0]”。这种嵌套的属性路径有可能出现父一级为null的情况,这种情况下spring为我们提供了两种处理方式,一:如果父一级为null,spring 帮我们自动创建一个父级对象;二:抛出NullValueInNestedPathException 异常。spring 把这种特性叫 auto-grow。可以通过ConfigurablePropertyAccessor#setAutoGrowNestedPaths方法设置是否开启,默认关闭。
在BeanWrapper接口中还有一个方法跟 auto-grow有关,它就是BeanWrapper#setAutoGrowCollectionLimit 方法。它是用来控制auto-grow开启下,如果父一级是数组或集合的话,auto-grow 对生成的数组元素个数的限制,默认是没有限制的。如,我通过 “person.addresses[1]” 来给person对象中的addresses数组种的元素赋值,在auto-grow开启的情况下如果访问的下表元素不存在spring会帮我们创建一个。假如数组下标值很大,spring就或创建一个很大的数组来容纳这个元素。setAutoGrowCollectionLimit方法就是用来控制这个的,我们可以控制要创建的元素个数不能超过某个值。
TypeConverter类型转换具体的实现是通过 ConversionService,ConversionService是在Spring-Core中定义一个服务接口。Spring为我们提供了很好的扩展支持。如果进行扩展,我会在其他地方写到。
factory 结构图
前面提到了spring 提供了三种Bean的配置方式,包括xml配置、Java config配置、groovy配置。这么强大的能力都是在factory包中实现的。由于内容比较多各个配置的代码是如何实现的,我会在其他的章节详细讲解。下边主要介绍BeanFactory、Bean声明周期相关的一些类。
spring-beans 子包factory包结构:图中颜色部分一般用在Bean上。
其中有几个核心的类,如下:
- BeanFacotry
- Aware
- FactoryBean
BeanFactory
BeanFactory 就是我们经常讲的Bean 容器。BeanFactory为我们提供了几个常见的获取Bean的方法,如通过名字、类型、别名来获取Bean。BeanFactory 是支持父子容器的。提到父子容器,我们首先想到的大概就是Spring MVC了吧。
Aware
Aware 接口只是一个标识接口。factory下有BeanClassLoaderAware、BeanFactoryAware、BeanNameAware。比较常用的是BeanFactoryAware,用来注入BeanFacotry。
FactoryBean
FactoryBean是一种特殊接口,我们可以叫他工厂Bean。它首先是一个Spring Bean,然后是一个工厂。那么这个工厂用来做什么的呢,它是用来生成Spring Bean的。如果一个Bean 实现了该接口,就不能想普通的Bean一样来使用。我们通过名字获取到的Bean实例都是通过工厂来生成的。如果我要获取FactoryBean的实例怎么办呢,我们可以在BeanName请加上“&”符号。例如:BeanFactory.getBean("&delegator");
DisposableBean
InitializingBean
SmartInitializingSingleton
可以在Bean周期中的回调接口,通过实现某个接口可以参与到Bean的整个过程中来,从Bean的创建到销毁。
更多推荐
所有评论(0)