在Spring中,beanDefinition加載後會被放置beanDefinitionMap,當Spring容器進行bean對象建立時,這個過程中會先進行beanDefinition的合并;
對于單例對象流程大緻如下:

AbstractBeanFactory#doGetBean
在進行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繼承了;
從上面的例子可以看出,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不能被顯示執行個體化;
getMergedLocalBeanDefinition最終會調用到下面方法;
AbstractBeanFactory#getMergedBeanDefinition(java.lang.String, org.springframework.beans.factory.config.BeanDefinition, org.springframework.beans.factory.config.BeanDefinition)
而對于beanDefinition為parent類型的會執行cloneBeanDefinition方法,clone意思是克隆,常見于原型模式,如下:
而這個this表示原始的beanDefinition,beanDefinitionMap中的beanDefinition;