0 前言1.BeanDefinition有父子关系有个属性parentName可设置BeanDefinition的父子关系2.为啥要设置BeanDefinition的父子关系因为子类可继承父类属性抽出共性3.BeanDefinition的合并过程就是将父子关系的 BeanDefinition 属性合并如有相同的就使用子类的属性值1 案例AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext(springConfiguration.class); // 父 RootBeanDefinition RootBeanDefinition rootBeanDefinition new RootBeanDefinition(); rootBeanDefinition.setScope(AbstractBeanDefinition.SCOPE_DEFAULT); rootBeanDefinition.getPropertyValues().add(name,xiaoming); applicationContext.registerBeanDefinition(parent,rootBeanDefinition); // 子 ChildBeanDefinition 继承使用父类已有属性 // 如属性值冲突不一样则合并过程中就会使用子类的 ChildBeanDefinition childBeanDefinition new ChildBeanDefinition(parent); childBeanDefinition.setBeanClass(A.class); childBeanDefinition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_NAME);2 啥时合并初始化bean工厂的过程中调用PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors DefaultListableBeanFactory.getBeanNamesForTypepublic String[] getBeanNamesForType(Nullable Class? type, boolean includeNonSingletons, boolean allowEagerInit) { return doGetBeanNamesForType }private String[] doGetBeanNamesForType(ResolvableType type, boolean includeNonSingletons, boolean allowEagerInit) { ListString result new ArrayList(); // 遍历所有 beanDefinitionNames for (String beanName : this.beanDefinitionNames) { // Only consider bean as eligible if the bean name // is not defined as alias for some other bean. if (!isAlias(beanName)) { try { //获取合并的bd RootBeanDefinition mbd getMergedLocalBeanDefinition(beanName); //..... }AbstractBeanFactory#getMergedLocalBeanDefinitionprotected RootBeanDefinition getMergedLocalBeanDefinition(String beanName) throws BeansException { // 先尝试从缓存获取bd就是一个map RootBeanDefinition mbd this.mergedBeanDefinitions.get(beanName); if (mbd ! null) { return mbd; } //合并bd return getMergedBeanDefinition(beanName, getBeanDefinition(beanName)); }AbstractBeanFactory#getMergedBeanDefinitionprotected RootBeanDefinition getMergedBeanDefinition( String beanName, BeanDefinition bd, Nullable BeanDefinition containingBd) throws BeanDefinitionStoreException { synchronized (this.mergedBeanDefinitions) { RootBeanDefinition mbd null; // 先从缓存拿合并的bd if (containingBd null) { mbd this.mergedBeanDefinitions.get(beanName); } //合并的bd为空就进行bd合并 if (mbd null) { //如果父类为空就不进行bd合并 if (bd.getParentName() null) { // Use copy of given root bean definition. if (bd instanceof RootBeanDefinition) { mbd ((RootBeanDefinition) bd).cloneBeanDefinition(); } else { mbd new RootBeanDefinition(bd); } } else { // 进行bd合并 BeanDefinition pbd; try { String parentBeanName transformedBeanName(bd.getParentName()); if (!beanName.equals(parentBeanName)) { //父类的bd可能也需要合并所以调用 getMergedBeanDefinition pbd getMergedBeanDefinition(parentBeanName); } else { BeanFactory parent getParentBeanFactory(); if (parent instanceof ConfigurableBeanFactory) { pbd ((ConfigurableBeanFactory) parent).getMergedBeanDefinition(parentBeanName); } } } //进行bd合并子类覆盖父类的如果子类没有就用父类的属性 mbd new RootBeanDefinition(pbd); mbd.overrideFrom(bd); } // Set default singleton scope, if not configured before. if (!StringUtils.hasLength(mbd.getScope())) { mbd.setScope(RootBeanDefinition.SCOPE_SINGLETON); } } return mbd; } }