Spring源码解读(二)
解析注册bean的函数:
protected void processBeanDefinition(Element ele , BeanDefinitionParserDelegate delegate ) {
BeanDefinitionHolder bdHolder = delegate . parseBeanDefinitionElement ( ele ) ;
if ( bdHolder != null ) {
bdHolder =delegate .decorateBeanDefinitionIfRequired( ele , bdHolder) ;
try {
// Register the final decorated instance .
BeanDefinitionReaderUtils.registerBeanDefinition( bdHolder , getReader
Context( ) . getRegistry());
catch (BeanDefinitionStoreException ex ) {
getReaderContext () . error (” Failed to register bean d efi nition with n ame ’” +
bdHolder . getBeanName ( ) + ”’”, ele , ex );
// Send registration event .
getReaderContext ( ) .fireComponentRegistered (new BeanComponentDefinition
(bdHolder ) ) ;
}
}
我们重点要聊的是:
bdHolder =delegate .decorateBeanDefinitionIfRequired( ele , bdHolder) ;
假设有这样一个场景:
<bean id=” test” class=” test.MyClass ” >
<mybean:user username= ”aaa” />
</bean>
这个函数的作用就是修饰mybean这个自定义的属性,源码如下:
public BeanDefioitionHolder decorateBeanDefinitionIfRequired (
Element ele , BeanDefinitionHolder definitionHolder , BeanDefnition containingBd) (
BeanDefinitionHolder finalDefinition= definitionHolder ;
NamedNodeMap attributes= ele.getAttributes();
//遍历所有的周刊’,看牙?是否有适川于修饰的属性
for (i 口t i = O; i < attributes . getLength() ; i++) (
Node node = attributes . item(i);
finalDefinition = dee。rate工fRequired( node , finalDefinition , conta 工ningBd );
NodeListchildren = ele.getChildNodes() ;
// 边历所有的子节点,莉莉’是否有适用于修饰的子元素
for ( int i = 0; i < children . getLeηgth () ; i ++) {
Node node = children . item(i) ;
if (node . getNodeType () == Node. ELEMENT NODE) {
finalDefinition = decorateIfRequired (node , finalDefinition ,
containingBd) ;
}
}
return finalDefinition
}
附上AbstractBeanDefinition 属性:
public abstract class AbstractBeanDefin 工tion extends BeanMetadataAttributeAccessor
implements BeanDefinition , Cloneable {
//此处省略静态变量以及final 常量
/**
* bean 的作用范围, 对应bean 属性scope
*/
private String scope = SCOPE_DEFAULT ;
/**
*是存是单例, 来自bean 属性scope
*/
private boolean singleton = true ,
/**
*是否单例, 来向bean 属性scope
*/
private booleanprototype = false ;
/**
* 是否是抽象.对应bear. 属性abstract
*/
private boolean abstractFlag = false ;
/**
* 是否延迟加载,对应bean 属性lazy-init
*/
private boolean lazyInit = false ;
/**
* 自动注入模式, 对应bean 属性autowire
*/
private int autowireMode = AUTOWIRE_NO ;
/**
* 依赖检查,spring 3.0后弃用这个属性
*/
private int dependencyCheck = DEPENDENCY_CHECK_NONE ;
/**
*用来表示一个bean 先实例化依靠另一个bean先实例化,对应bean属性depend-on
*/
private Slring[] dependsOn,
/**
* aucowire - candidate属性设置为false .这样容器在查找自动装配对象时.
* 将不考虑该bean .即它不会被考虑作为其他bean自动装配的候选者,但是该bean本身还是可以使用自动装配来注入其他bean的
* 对应bean属性autowire-candidate
*/
private boolean autowireCandidate = true ;
/**
* 自动装配时当出现多个bean候选者时,将作为首选者,对应bean属性primary
*/
private boolean primary = false,
/**
* 用于记录Qualifier,对应子元素qualifier
*/
private final Map<String , AutowireCandidateQualifier> qualifiers =
newLinkedHashMap<String , AutowireCandidateQualifier> (0);
/**
*允许访问非公开的构造器和方法,程序设置
*/
private boolean nonPublicAccessAllcwed = true ;
/**
* 是否以一种宽松的模式解析构造函数,默认为true ,
* 如果为false,则在如下情况
* interface ITest {}
* class ITestimp lmplements I Test {} ;
* class Main{
* Mai n( ITest i ) {}
* Main ( ITestimpl i) {}
*}
* 抛出异常,因为spring无法准确定位哪个构造函数
* 程序设置
*/
private boolean len 工en tConstructorResolution = true ,
/*
* 记录构造函数注入属性,对应bean属性constructor-arg
*/
private ConstructorAcgumentValues constructorArgumentValues ;
/ **
*普通属性集合
*/
private MutablePropertyValues propertyValues ;
/**
*方法重写的持有者,记录lookup-method,replaced-method元素
*/
private MethodOverrides methodOverrides = new MethodOverrides( ) ;
/**
* 对应bean属性factory-bean, 用法.
* <bean id = ” instanceFactoryBean ” class=”example.chapter3.InstanceFactoryBean” /〉
* <bean id = ” currentTime " factory-bean = ” l nstanceFactoryBean ” factory-method=”
* createTime” />
*/
private String factoryBeanName ;
/**
*对应bean属性factory-method
*/
private String factoryMethodName ;
/**
* 初始化方法,对应bean属性init-method
*/
private String initMethodName;
/**
* 销毁方法, 对应bean 属性destory-method
*/
private String destroyMethodName ;
/**
* 是否执行init-method , 程序设置
*/
private boolean enforcelnitMethod = true ;
/**
* 是杏执行destory-method ,程序设置
*/
private boolean enforceDestroyMethod = true;
/**
* 是否是用户定义的而不是应用程序本身定义的,创建AOP 时候为true ,程序设置
*/
private boolean synthetic = false ;
/**
*定义这个bean的应用 , APPLICATION : 用户, INFRASTRUCTURE , 完全内部使用.与用户无关, SUPPORT ·
* 某些复杂配置的一部分
* 程序设置
*/
private int role = BeanDefinition . ROLE APPLICATION ;
/**
* bean 的描述信息
*/
private String description ;
/**
* 这个bean 定义的资源
*/
private Resource resource ,
// 此处省略目set/get 方法
}
参考自《Spring源码深度解析》