Spring源码解读(二)

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源码深度解析》

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

97年的典藏版

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值