天天看點

Spring中beanDefinition合并操作分析

在Spring中,beanDefinition加載後會被放置beanDefinitionMap,當Spring容器進行bean對象建立時,這個過程中會先進行beanDefinition的合并;

對于單例對象流程大緻如下:

Spring中beanDefinition合并操作分析

AbstractBeanFactory#doGetBean

Spring中beanDefinition合并操作分析

在進行bean對象建立前會先進行beanDefinition的合并操作;

對于子beanDefinition是可以繼承父beanDefinition的;

例子如下:

将父beanDefinition設定為多例類型;

@Test
public void childBeanDefinitionTest1() {
	AnnotationConfigApplicationContext context =
			new AnnotationConfigApplicationContext();

	// 作為一個父類,也可以是一個普通類
	RootBeanDefinition beanADefinition = new RootBeanDefinition(BeanA.class);
	beanADefinition.setScope(AbstractBeanDefinition.SCOPE_PROTOTYPE);

	ChildBeanDefinition childBeanDefinition = new ChildBeanDefinition("beanA");
	childBeanDefinition.setBeanClass(BeanB.class);

	context.registerBeanDefinition("beanA", beanADefinition);
	context.registerBeanDefinition("beanB", childBeanDefinition);

	context.refresh();
}      

此時BeanA,BeanB都沒有被執行個體化,BeanA的beanDefinition的scope為prototype類型,說明BeanA的beanBeanDefinition被BeanB的beanDefinition繼承了;

Spring中beanDefinition合并操作分析

 從上面的例子可以看出,beanDefinition具有繼承性;

例子如下:

将子beanDefinition設定為多例類型;

@Test
public void childBeanDefinitionTest1() {
	AnnotationConfigApplicationContext context =
			new AnnotationConfigApplicationContext();

	// 作為一個父類,也可以是一個普通類
	RootBeanDefinition beanADefinition = new RootBeanDefinition(BeanA.class);

	ChildBeanDefinition childBeanDefinition = new ChildBeanDefinition("beanA");
	childBeanDefinition.setBeanClass(BeanB.class);
	childBeanDefinition.setScope(AbstractBeanDefinition.SCOPE_PROTOTYPE);

	context.registerBeanDefinition("beanA", beanADefinition);
	context.registerBeanDefinition("beanB", childBeanDefinition);

	context.refresh();
}
      

  

此時隻有一個BeanA進行執行個體化,BeanA的beanDefinition作為父beanDefinition,預設為單例,BeanB的beanDefinition設定為多例,是以BeanB不能被顯示執行個體化;

Spring中beanDefinition合并操作分析

getMergedLocalBeanDefinition最終會調用到下面方法;

AbstractBeanFactory#getMergedBeanDefinition(java.lang.String, org.springframework.beans.factory.config.BeanDefinition, org.springframework.beans.factory.config.BeanDefinition)

Spring中beanDefinition合并操作分析

而對于beanDefinition為parent類型的會執行cloneBeanDefinition方法,clone意思是克隆,常見于原型模式,如下:

Spring中beanDefinition合并操作分析

而這個this表示原始的beanDefinition,beanDefinitionMap中的beanDefinition;