BeanDefinition,顾名思义,是一个对象(Bean)在Spring中描述,其核心类图:
从类图我们详细了解BeanDefinition。
BeanDefinition接口继承自BeanMetadataElement和AttributeAccessor两个接口。
BeanMetadataElement:bean元数据,返回该bean的来源。
AttributeAccessor:Spring定义的属性访问器,对Bean的属性进行操作的API,例如设置属性、获取属性、判断是否存在该属性,返回bean所有的属性名称等。
下面重点分析一下BeanDefinition接口。
属性列表:
1)String SCOPE_SINGLETON,bean的作用范围,单例模式
2)String SCOPE_PROTOTYPE,bean的作用范围为prototype,在Spring生命周期中,会存在多个,由垃圾回收期管理其生命周期。
3)int ROLE_APPLICATION:bean的角色定义,默认,为应用程序定义。
4)int ROLE_SUPPORT:bean的角色定义,为应用程序定义的比较大的对象。
5)int ROLE_INFRASTRUCTURE:Spring内部定义的Bean对象。
核心方法详解:
1)void setBeanClassName(String beanClassName) :该Bean的class name。
2)void setScope(String scope):bean的生命周期,单例还是prototype。
3)void setLazyInit(boolean lazyInit):lazyInit,是否延迟加载,如果设置为true,在需要用到时再初始化。
4)void setDependsOn(String… dependsOn):dependsOn一般用于两个bean之间没有显示依赖,但后一个Bean需要用到前一个Bean执行初始方法后的结果。例如在< bean id=”a” dependsOn=”b”/> 时,在初始化a时首先先初始化b,在销毁b之前会先销毁a。
5)void setAutowireCandidate(boolean autowireCandidate)设置该对象是否可以被其他对象自动装配。
spring通过配置bean的autowire属性设置自动装配方式:
no:不使用自动装配,必须通过ref元素指定依赖,为autowire默认值。
byName:使用属性名自动装配,如果存在一个与指定属性名相同类型的bean则自动装配,如果有多个,则抛
出异常。
byType:根据类型自动状态,如果存在与指定属性类型相同的bean,则自动装配,如果有多个,则抛出异常。
constructor:与byType类似,不同之处在于它使用的是构造器的参数类型。
autodetect:通过bean的自省机制来决定是使用constructor还是byType来进行自动装配。如果有默认构造
器,则使用byType,否则使用constructor。
6)void setPrimary(boolean primary),如果其他对象按照类型自动装配时发现有多个符合类型的多个实现bean,如果bean的primary属性为true,则以primary为true的优先,当然如果有多个primary为true,则抛出异常。
7)void setFactoryBeanName(String factoryBeanName):设置bean的factoryBeanName。
8)void setFactoryMethodName(String factoryMethodName):设置bean工厂的方法名,Spring在实例化Bean对象时支持工厂方法设计模式,在初始化bean时不是通过bean的class发射创建 bean实例,而是根据factoryBeanName反射出工厂的实例,然后调用它的实例方法factoryMethodName来创建bean实例。
9)ConstructorArgumentValues getConstructorArgumentValues():获取bean的构造方法参数。
10)MutablePropertyValues getPropertyValues():获取实例bean的所有属性。
11)boolean isSingleton():是否是单例。
12)boolean isPrototype():是否是非单例。
13)boolean isAbstract():是否是抽象的。
本文主要是根据BeanDefinition接口了解bean的一些特性,值得引起注意的是:lazy-init、depends-on、autowire-candidate、autowire、primary、factory-bean、factory-method。
注:本文并没有尝试去罗列spring bean标签的全部属性。