Spring源码之Bean的创建(一)

17 阅读12分钟

源码环境

IDEA:2022.2.2

Spring 版本:5.2.x

备注:本文(Spring源码之Bean创建)将从源码角度,一步步分析bean一个创建大体过程,以及涉及到的面试点、扩展点。

AOP及事务源码会另起文章分析。

Spring 创建 bean流程

图片

Spring 源码解析

示例

public static void main(String[] args) {    ClassPathXmlApplicationContext ac=newClassPathXmlApplicationContext("bean.xml");    A bean = ac.getBean(A.class);    System.out.println(bean);}// A.classpublic class A {}// xml配置<?xml version="1.0" encoding="UTF-8"?><beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns="http://www.springframework.org/schema/beans"     xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans-4.2.xsd">  <bean class="com.wl.A"></bean></beans>

下面开始分析:new ClassPathXmlApplicationContext("bean.xml")

public ClassPathXmlApplicationContext(String... configLocations) throws BeansException {    this(configLocations, true, null);}// 最终执行当前类的此方法public ClassPathXmlApplicationContext(      String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)      throws BeansException {    // @1 :调用父类构造方法,进行相关的对象创建和属性的赋值    // 父类:AbstractApplicationContext    super(parent);    // @2 : 设置配置文件    setConfigLocations(configLocations);    // @3 : 刷新容器,核心核心核心    if (refresh) {      refresh();    }  }

@1 :调用 AbstractApplicationContext

public AbstractApplicationContext(@Nullable ApplicationContext parent) {    // 执行构造器,创建resourcePatternResolver    // resourcePatternResolver = new PathMatchingResourcePatternResolver(this);    this();    // 设置父容器,合并参数    setParent(parent);}

@2 :AbstractRefreshableConfigApplicationContext

public void setConfigLocations(@Nullable String... locations) {   if (locations != null) {      Assert.noNullElements(locations, "Config locations must not be null");      this.configLocations = new String[locations.length];      for (int i = 0; i < locations.length; i++) {         // 解析给定路径         this.configLocations[i] = resolvePath(locations[i]).trim();      }   }   else {      this.configLocations = null;   }}// resolvePathprotected String resolvePath(String path) {    return getEnvironment().resolveRequiredPlaceholders(path);}// getEnvironment():如果enviroment为空,就创建一个默认environment(new StandardEnvironment())public ConfigurableEnvironment getEnvironment() {    if (this.environment == null) {      this.environment = createEnvironment();    }    return this.environment;  }  

前面两部都是初始化,第三步才是Spring 核心,搞懂这个方法基本也就搞懂 bean 创建过程

@3 :refresh()

public void refresh() throws BeansException, IllegalStateException {   synchronized (this.startupShutdownMonitor) {      // Prepare this context for refreshing.      /**       * 容器前刷新工作       *        * 设置容器启动时间、活跃状态、关闭状态、加载系统属性到envinemnt、准备监听器和事件集合空对象       */      prepareRefresh(); // refresh-01      // Tell the subclass to refresh the internal bean factory.      // 创建容器工厂:DefaultListableBeanFactory      // 加载xml配置文件到当前工厂,其实就是 BeanDefinition      ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// refresh-02      // Prepare the bean factory for use in this context.      // bean工厂初始化设置属性值      prepareBeanFactory(beanFactory);// refresh-03      try {         // Allows post-processing of the bean factory in context subclasses.         // 后置处理器         postProcessBeanFactory(beanFactory);// refresh-04         // Invoke factory processors registered as beans in the context.         // 执行后置处理器         invokeBeanFactoryPostProcessors(beanFactory);// refresh-05         // Register bean processors that intercept bean creation.         // 注册 beanPostPorocessor         registerBeanPostProcessors(beanFactory);// refresh-06         // Initialize message source for this context.         // 国际化         initMessageSource();// refresh-07         // Initialize event multicaster for this context.         // 初始化广播器         initApplicationEventMulticaster();// refresh-08         // Initialize other special beans in specific context subclasses.         // 留给子类来初始化其他bean(Spring Boot 在此扩展加载tomcat)         onRefresh();// refresh-09         // Check for listener beans and register them.         // 注册监听器         registerListeners();// refresh-10         // Instantiate all remaining (non-lazy-init) singletons.         // 初始化单实例(非懒加载)         finishBeanFactoryInitialization(beanFactory);// refresh-11         // Last step: publish corresponding event.         // 完成刷新,通知生命周期处理器         finishRefresh();// refresh-12      }      catch (BeansException ex) {         if (logger.isWarnEnabled()) {            logger.warn("Exception encountered during context initialization - " +                  "cancelling refresh attempt: " + ex);         }         // Destroy already created singletons to avoid dangling resources.         // 防止bean资源占用,销毁在前面创建过程生成的bean         destroyBeans();         // Reset 'active' flag.         // 重置active         cancelRefresh(ex);         // Propagate exception to caller.         throw ex;      }      finally {         // Reset common introspection caches in Spring's core, since we         // might not ever need metadata for singleton beans anymore...         resetCommonCaches();      }   }}

refresh-01

此方法比较简单,设置响应的属性

refresh-02:创建容器工厂(obtainFreshBeanFactory())

protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {    // 初始化BeanFactory,并进行XML文件读取,并将得到的BeanFactory记录在当前实体的属性中    refreshBeanFactory();    // 返回当前实体的beanFactory属性    return getBeanFactory();}

protected final void refreshBeanFactory() throws BeansException { // 如果存在beanFactory,则销毁beanFactory if (hasBeanFactory()) { destroyBeans(); closeBeanFactory(); } try { // 创建DefaultListableBeanFactory对象 DefaultListableBeanFactory beanFactory = createBeanFactory(); // 为了序列化指定id,可以从id反序列化到beanFactory对象 beanFactory.setSerializationId(getId()); // 定制beanFactory,设置相关属性,包括是否允许覆盖同名称的不同定义的对象以及循环依赖 // allowBeanDefinitionOverriding allowCircularReferences customizeBeanFactory(beanFactory); // 初始化documentReader,并进行XML文件读取及解析,默认命名空间的解析,自定义标签的解析 loadBeanDefinitions(beanFactory); this.beanFactory = beanFactory; } catch (IOException ex) { throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex); } }


loadBeanDefinitions:根据xml,解析bean生成bd

备注:此处使用 XmlBeanDefinitionReader类,解析xml生成BeanDefinition(bd),还有(GroovyBeanDefinitionReader、PropertiesBeanDefinitionReader)更好的兼容不同场景 bean 配置 ,支持注解或配置文件,生成db后,根据bd构建bean实例。

// 最终调用到XmlBeanDefinitionReader.doLoadBeanDefinitionsprotected int doLoadBeanDefinitions(InputSource inputSource, Resource resource) throws BeanDefinitionStoreException { try { // 此处获取xml文件的document对象,这个解析过程是由documentLoader完成的,从String[] -string-Resource[]- resource,最终开始将resource读取成一个document文档,根据文档的节点信息封装成一个个的BeanDefinition对象 Document doc = doLoadDocument(inputSource, resource); int count = registerBeanDefinitions(doc, resource); if (logger.isDebugEnabled()) { logger.debug("Loaded " + count + " bean definitions from " + resource); } return count; } catch (BeanDefinitionStoreException ex) { throw ex; } catch (SAXParseException ex) { throw new XmlBeanDefinitionStoreException(resource.getDescription(), "Line " + ex.getLineNumber() + " in XML document from " + resource + " is invalid", ex); } catch (SAXException ex) { throw new XmlBeanDefinitionStoreException(resource.getDescription(), "XML document from " + resource + " is invalid", ex); } catch (ParserConfigurationException ex) { throw new BeanDefinitionStoreException(resource.getDescription(), "Parser configuration exception parsing XML from " + resource, ex); } catch (IOException ex) { throw new BeanDefinitionStoreException(resource.getDescription(), "IOException parsing XML document from " + resource, ex); } catch (Throwable ex) { throw new BeanDefinitionStoreException(resource.getDescription(), "Unexpected exception parsing XML document from " + resource, ex); } }


解析document

protected void doRegisterBeanDefinitions(Element root) { // Any nested elements will cause recursion in this method. In // order to propagate and preserve default-* attributes correctly, // keep track of the current (parent) delegate, which may be null. Create // the new (child) delegate with a reference to the parent for fallback purposes, // then ultimately reset this.delegate back to its original (parent) reference. // this behavior emulates a stack of delegates without actually necessitating one. BeanDefinitionParserDelegate parent = this.delegate; this.delegate = createDelegate(getReaderContext(), root, parent); if (this.delegate.isDefaultNamespace(root)) { String profileSpec = root.getAttribute(PROFILE_ATTRIBUTE); if (StringUtils.hasText(profileSpec)) { String[] specifiedProfiles = StringUtils.tokenizeToStringArray( profileSpec, BeanDefinitionParserDelegate.MULTI_VALUE_ATTRIBUTE_DELIMITERS); // We cannot use Profiles.of(...) since profile expressions are not supported // in XML config. See SPR-12458 for details. if (!getReaderContext().getEnvironment().acceptsProfiles(specifiedProfiles)) { if (logger.isDebugEnabled()) { logger.debug("Skipped XML bean definition file due to specified profiles [" + profileSpec + "] not matching: " + getReaderContext().getResource()); } return; } } } preProcessXml(root); parseBeanDefinitions(root, this.delegate); // 真正解析的地方 postProcessXml(root); this.delegate = parent; }


// 解析xml标签,分默认和自定义标签

protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {   if (delegate.isDefaultNamespace(root)) {     NodeList nl = root.getChildNodes();     for (int i = 0; i < nl.getLength(); i++) {         Node node = nl.item(i);         if (node instanceof Element) {           Element ele = (Element) node;           if (delegate.isDefaultNamespace(ele)) {               // 默认标签:bean               parseDefaultElement(ele, delegate);           }           else {               // 自定义标签 : aop 、事务、自定义标签               delegate.parseCustomElement(ele);           }         }     }   }   else {     delegate.parseCustomElement(root);   }}

private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {   // import   if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) {      importBeanDefinitionResource(ele);   }   // alias   else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) {      processAliasRegistration(ele);   }   // bean   else if (delegate.nodeNameEquals(ele, BEAN_ELEMENT)) {      processBeanDefinition(ele, delegate);   }   // beans   else if (delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)) {      // recurse      doRegisterBeanDefinitions(ele);   }}
```

分析bean解析过程

```
protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {   // beanDefinitionHolder是beanDefinition对象的封装类,封装了BeanDefinition,bean的名字和别名,用它来完成向IOC容器的注册    // 得到这个beanDefinitionHolder就意味着beandefinition是通过BeanDefinitionParserDelegate对xml元素的信息按照spring的bean规则进行    // 解析得到的    BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);    if (bdHolder != null) {      bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);      try {        // Register the final decorated instance.        // 向ioc容器注册解析得到的beandefinition的地方        BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());      }      catch (BeanDefinitionStoreException ex) {        getReaderContext().error("Failed to register bean definition with name '" +            bdHolder.getBeanName() + "'", ele, ex);      }      // Send registration event.      // 在beandefinition向ioc容器注册完成之后,发送消息      getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));    }}
```

  

```
public BeanDefinitionHolder parseBeanDefinitionElement(Element ele, @Nullable BeanDefinition containingBean) {   String id = ele.getAttribute(ID_ATTRIBUTE);   String nameAttr = ele.getAttribute(NAME_ATTRIBUTE);   List<String> aliases = new ArrayList<>();   if (StringUtils.hasLength(nameAttr)) {      String[] nameArr = StringUtils.tokenizeToStringArray(nameAttr, MULTI_VALUE_ATTRIBUTE_DELIMITERS);      aliases.addAll(Arrays.asList(nameArr));   }   String beanName = id;   if (!StringUtils.hasText(beanName) && !aliases.isEmpty()) {      beanName = aliases.remove(0);      if (logger.isTraceEnabled()) {         logger.trace("No XML 'id' specified - using '" + beanName +               "' as bean name and " + aliases + " as aliases");      }   }   if (containingBean == null) {      checkNameUniqueness(beanName, aliases, ele);   }   AbstractBeanDefinition beanDefinition = parseBeanDefinitionElement(ele, beanName, containingBean);   if (beanDefinition != null) {      if (!StringUtils.hasText(beanName)) {         try {            if (containingBean != null) {               beanName = BeanDefinitionReaderUtils.generateBeanName(                     beanDefinition, this.readerContext.getRegistry(), true);            }            else {               beanName = this.readerContext.generateBeanName(beanDefinition);               // Register an alias for the plain bean class name, if still possible,               // if the generator returned the class name plus a suffix.               // This is expected for Spring 1.2/2.0 backwards compatibility.               String beanClassName = beanDefinition.getBeanClassName();               if (beanClassName != null &&                     beanName.startsWith(beanClassName) && beanName.length() > beanClassName.length() &&                     !this.readerContext.getRegistry().isBeanNameInUse(beanClassName)) {                  aliases.add(beanClassName);               }            }            if (logger.isTraceEnabled()) {               logger.trace("Neither XML 'id' nor 'name' specified - " +                     "using generated bean name [" + beanName + "]");            }         }         catch (Exception ex) {            error(ex.getMessage(), ele);            return null;         }      }      String[] aliasesArray = StringUtils.toStringArray(aliases);      return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray);   }   return null;}

public BeanDefinitionHolder parseBeanDefinitionElement(Element ele, @Nullable BeanDefinition containingBean) {   // ID属性   String id = ele.getAttribute(ID_ATTRIBUTE);   // name属性   String nameAttr = ele.getAttribute(NAME_ATTRIBUTE);   // 别名分割解析   List aliases = new ArrayList<>();   if (StringUtils.hasLength(nameAttr)) {     String[] nameArr = StringUtils.tokenizeToStringArray(nameAttr, MULTI_VALUE_ATTRIBUTE_DELIMITERS);     aliases.addAll(Arrays.asList(nameArr));   }   String beanName = id;   if (!StringUtils.hasText(beanName) && !aliases.isEmpty()) {     beanName = aliases.remove(0);     if (logger.isTraceEnabled()) {         logger.trace("No XML 'id' specified - using '" + beanName +               "' as bean name and " + aliases + " as aliases");     }   }   if (containingBean == null) {     checkNameUniqueness(beanName, aliases, ele);   }   // bean 详细解析   AbstractBeanDefinition beanDefinition = parseBeanDefinitionElement(ele, beanName, containingBean);   if (beanDefinition != null) {     if (!StringUtils.hasText(beanName)) {         try {           if (containingBean != null) {               // 不存在beanname,生成默认name               beanName = BeanDefinitionReaderUtils.generateBeanName(                     beanDefinition, this.readerContext.getRegistry(), true);           }           else {               beanName = this.readerContext.generateBeanName(beanDefinition);               // Register an alias for the plain bean class name, if still possible,               // if the generator returned the class name plus a suffix.               // This is expected for Spring 1.2/2.0 backwards compatibility.               String beanClassName = beanDefinition.getBeanClassName();               if (beanClassName != null &&                     beanName.startsWith(beanClassName) && beanName.length() > beanClassName.length() &&                     !this.readerContext.getRegistry().isBeanNameInUse(beanClassName)) {                 aliases.add(beanClassName);               }           }           if (logger.isTraceEnabled()) {               logger.trace("Neither XML 'id' nor 'name' specified - " +                     "using generated bean name [" + beanName + "]");           }         }         catch (Exception ex) {           error(ex.getMessage(), ele);           return null;         }     }     String[] aliasesArray = StringUtils.toStringArray(aliases);     return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray);   }   return null;}

public AbstractBeanDefinition parseBeanDefinitionElement(      Element ele, String beanName, @Nullable BeanDefinition containingBean) {   this.parseState.push(new BeanEntry(beanName));   // 解析class   String className = null;   if (ele.hasAttribute(CLASS_ATTRIBUTE)) {      className = ele.getAttribute(CLASS_ATTRIBUTE).trim();   }   // 解析parent   String parent = null;   if (ele.hasAttribute(PARENT_ATTRIBUTE)) {      parent = ele.getAttribute(PARENT_ATTRIBUTE);   }   try {      // 创建装在bean信息的AbstractBeanDefinition对象,实际的实现是GenericBeanDefinition      AbstractBeanDefinition bd = createBeanDefinition(className, parent);      // 解析bean标签的各种其他属性      parseBeanDefinitionAttributes(ele, beanName, containingBean, bd);      // description      bd.setDescription(DomUtils.getChildElementValueByTagName(ele, DESCRIPTION_ELEMENT));      // 元数据      parseMetaElements(ele, bd);      // lookup-method      parseLookupOverrideSubElements(ele, bd.getMethodOverrides());      // replace-method      parseReplacedMethodSubElements(ele, bd.getMethodOverrides());      // 构造函数参数      parseConstructorArgElements(ele, bd);      // property 子元素      parsePropertyElements(ele, bd);      // qualifier 子元素      parseQualifierElements(ele, bd);      bd.setResource(this.readerContext.getResource());      bd.setSource(extractSource(ele));      return bd;   }   catch (ClassNotFoundException ex) {      error("Bean class [" + className + "] not found", ele, ex);   }   catch (NoClassDefFoundError err) {      error("Class that bean class [" + className + "] depends on not found", ele, err);   }   catch (Throwable ex) {      error("Unexpected failure during bean definition parsing", ele, ex);   }   finally {      this.parseState.pop();   }   return null;}
```

到此bd已经解析完成,容器工厂已经准备

BeanFactory

![图片](https://mmbiz.qpic.cn/mmbiz_png/0svRp2bbRibaDMREgI2m49HwnmHlXziaibp2uibiadxeszmqQPg2ZTUNyUjTkVesmZ2Xbvs5WOHOKLEia3mSCzj14MFg/640?wx_fmt=png&from=appmsg)

bd

![图片](https://mmbiz.qpic.cn/mmbiz_png/0svRp2bbRibaDMREgI2m49HwnmHlXziaibpxALVl75p272qsL6yCxwGrCWsiadtlXPWLvXfhJw8D21LltdDSwm89HQ/640?wx_fmt=png&from=appmsg)

**refresh-04**

子类覆盖方法做额外的处理,web项目复写此方法,添加一些后置处理器

**refresh-05**:invokeBeanFactoryPostProcessors执行后置处理器

```
public static void invokeBeanFactoryPostProcessors(            ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {        // Invoke BeanDefinitionRegistryPostProcessors first, if any.        // 优先执行BeanDefinitionRegistryPostProcessors        // 将已经执行过的BFPP存储在processedBeans中,防止重复执行        Set<String> processedBeans = new HashSet<>();        // 判断beanfactory是否是BeanDefinitionRegistry类型,此处是DefaultListableBeanFactory,实现了BeanDefinitionRegistry接口,所以为true        if (beanFactory instanceof BeanDefinitionRegistry) {            // 类型转换            BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;            // BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子集            // BeanFactoryPostProcessor主要针对的操作对象是BeanFactory,而BeanDefinitionRegistryPostProcessor主要针对的操作对象是BeanDefinition            // 存放BeanFactoryPostProcessor的集合            List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();            // 存放BeanDefinitionRegistryPostProcessor的集合            List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();            // 首先处理入参中的beanFactoryPostProcessors,遍历所有的beanFactoryPostProcessors,将BeanDefinitionRegistryPostProcessor            // 和BeanFactoryPostProcessor区分开            for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {                // 如果是BeanDefinitionRegistryPostProcessor                if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {                    BeanDefinitionRegistryPostProcessor registryProcessor =                            (BeanDefinitionRegistryPostProcessor) postProcessor;                    // 直接执行BeanDefinitionRegistryPostProcessor接口中的postProcessBeanDefinitionRegistry方法                    registryProcessor.postProcessBeanDefinitionRegistry(registry);                    // 添加到registryProcessors,用于后续执行postProcessBeanFactory方法                    registryProcessors.add(registryProcessor);                } else {                    // 否则,只是普通的BeanFactoryPostProcessor,添加到regularPostProcessors,用于后续执行postProcessBeanFactory方法                    regularPostProcessors.add(postProcessor);                }            }            // Do not initialize FactoryBeans here: We need to leave all regular beans            // uninitialized to let the bean factory post-processors apply to them!            // Separate between BeanDefinitionRegistryPostProcessors that implement            // PriorityOrdered, Ordered, and the rest.            // 用于保存本次要执行的BeanDefinitionRegistryPostProcessor            List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();            // First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.            // 调用所有实现PriorityOrdered接口的BeanDefinitionRegistryPostProcessor实现类            // 找到所有实现BeanDefinitionRegistryPostProcessor接口bean的beanName            String[] postProcessorNames =                    beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);            // 遍历处理所有符合规则的postProcessorNames            for (String ppName : postProcessorNames) {                // 检测是否实现了PriorityOrdered接口                if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {                    // 获取名字对应的bean实例,添加到currentRegistryProcessors中                    currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));                    // 将要被执行的BFPP名称添加到processedBeans,避免后续重复执行                    processedBeans.add(ppName);                }            }            // 按照优先级进行排序操作            sortPostProcessors(currentRegistryProcessors, beanFactory);            // 添加到registryProcessors中,用于最后执行postProcessBeanFactory方法            registryProcessors.addAll(currentRegistryProcessors);            // 遍历currentRegistryProcessors,执行postProcessBeanDefinitionRegistry方法            invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);            // 执行完毕之后,清空currentRegistryProcessors            currentRegistryProcessors.clear();            // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.            // 调用所有实现Ordered接口的BeanDefinitionRegistryPostProcessor实现类            // 找到所有实现BeanDefinitionRegistryPostProcessor接口bean的beanName,            // 此处需要重复查找的原因在于上面的执行过程中可能会新增其他的BeanDefinitionRegistryPostProcessor            postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);            for (String ppName : postProcessorNames) {                // 检测是否实现了Ordered接口,并且还未执行过                if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {                    // 获取名字对应的bean实例,添加到currentRegistryProcessors中                    currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));                    // 将要被执行的BFPP名称添加到processedBeans,避免后续重复执行                    processedBeans.add(ppName);                }            }            // 按照优先级进行排序操作            sortPostProcessors(currentRegistryProcessors, beanFactory);            // 添加到registryProcessors中,用于最后执行postProcessBeanFactory方法            registryProcessors.addAll(currentRegistryProcessors);            // 遍历currentRegistryProcessors,执行postProcessBeanDefinitionRegistry方法            invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);            // 执行完毕之后,清空currentRegistryProcessors            currentRegistryProcessors.clear();            // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.            // 最后,调用所有剩下的BeanDefinitionRegistryPostProcessors            boolean reiterate = true;            while (reiterate) {                reiterate = false;                // 找出所有实现BeanDefinitionRegistryPostProcessor接口的类                postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);                // 遍历执行                for (String ppName : postProcessorNames) {                    // 跳过已经执行过的BeanDefinitionRegistryPostProcessor                    if (!processedBeans.contains(ppName)) {                        // 获取名字对应的bean实例,添加到currentRegistryProcessors中                        currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));                        // 将要被执行的BFPP名称添加到processedBeans,避免后续重复执行                        processedBeans.add(ppName);                        reiterate = true;                    }                }                // 按照优先级进行排序操作                sortPostProcessors(currentRegistryProcessors, beanFactory);                // 添加到registryProcessors中,用于最后执行postProcessBeanFactory方法                registryProcessors.addAll(currentRegistryProcessors);                // 遍历currentRegistryProcessors,执行postProcessBeanDefinitionRegistry方法                invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);                // 执行完毕之后,清空currentRegistryProcessors                currentRegistryProcessors.clear();            }            // Now, invoke the postProcessBeanFactory callback of all processors handled so far.            // 调用所有BeanDefinitionRegistryPostProcessor的postProcessBeanFactory方法            invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);            // 最后,调用入参beanFactoryPostProcessors中的普通BeanFactoryPostProcessor的postProcessBeanFactory方法            invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);        } else {            // Invoke factory processors registered with the context instance.            // 如果beanFactory不归属于BeanDefinitionRegistry类型,那么直接执行postProcessBeanFactory方法            invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);        }        // 到这里为止,入参beanFactoryPostProcessors和容器中的所有BeanDefinitionRegistryPostProcessor已经全部处理完毕,下面开始处理容器中        // 所有的BeanFactoryPostProcessor        // 可能会包含一些实现类,只实现了BeanFactoryPostProcessor,并没有实现BeanDefinitionRegistryPostProcessor接口        // Do not initialize FactoryBeans here: We need to leave all regular beans        // uninitialized to let the bean factory post-processors apply to them!        // 找到所有实现BeanFactoryPostProcessor接口的类        String[] postProcessorNames =                beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);        // Separate between BeanFactoryPostProcessors that implement PriorityOrdered,        // Ordered, and the rest.        // 用于存放实现了PriorityOrdered接口的BeanFactoryPostProcessor        List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();        // 用于存放实现了Ordered接口的BeanFactoryPostProcessor的beanName//    List<String> orderedPostProcessorNames = new ArrayList<>();        List<BeanFactoryPostProcessor> orderedPostProcessor = new ArrayList<>();        // 用于存放普通BeanFactoryPostProcessor的beanName//    List<String> nonOrderedPostProcessorNames = new ArrayList<>();        List<BeanFactoryPostProcessor> nonOrderedPostProcessorNames = new ArrayList<>();        // 遍历postProcessorNames,将BeanFactoryPostProcessor按实现PriorityOrdered、实现Ordered接口、普通三种区分开        for (String ppName : postProcessorNames) {            // 跳过已经执行过的BeanFactoryPostProcessor            if (processedBeans.contains(ppName)) {                // skip - already processed in first phase above            }            // 添加实现了PriorityOrdered接口的BeanFactoryPostProcessor到priorityOrderedPostProcessors            else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {                priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));            }            // 添加实现了Ordered接口的BeanFactoryPostProcessor的beanName到orderedPostProcessorNames            else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {//        orderedPostProcessorNames.add(ppName);                orderedPostProcessor.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));            } else {                // 添加剩下的普通BeanFactoryPostProcessor的beanName到nonOrderedPostProcessorNames//        nonOrderedPostProcessorNames.add(ppName);                nonOrderedPostProcessorNames.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));            }        }        // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.        // 对实现了PriorityOrdered接口的BeanFactoryPostProcessor进行排序        sortPostProcessors(priorityOrderedPostProcessors, beanFactory);        // 遍历实现了PriorityOrdered接口的BeanFactoryPostProcessor,执行postProcessBeanFactory方法        invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);        // Next, invoke the BeanFactoryPostProcessors that implement Ordered.        // 创建存放实现了Ordered接口的BeanFactoryPostProcessor集合//    List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());        // 遍历存放实现了Ordered接口的BeanFactoryPostProcessor名字的集合//    for (String postProcessorName : orderedPostProcessorNames) {        // 将实现了Ordered接口的BeanFactoryPostProcessor添加到集合中//      orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));//    }        // 对实现了Ordered接口的BeanFactoryPostProcessor进行排序操作//    sortPostProcessors(orderedPostProcessors, beanFactory);        sortPostProcessors(orderedPostProcessor, beanFactory);        // 遍历实现了Ordered接口的BeanFactoryPostProcessor,执行postProcessBeanFactory方法//    invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);        invokeBeanFactoryPostProcessors(orderedPostProcessor, beanFactory);        // Finally, invoke all other BeanFactoryPostProcessors.        // 最后,创建存放普通的BeanFactoryPostProcessor的集合//    List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());        // 遍历存放实现了普通BeanFactoryPostProcessor名字的集合//    for (String postProcessorName : nonOrderedPostProcessorNames) {        // 将普通的BeanFactoryPostProcessor添加到集合中//      nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));//    }        // 遍历普通的BeanFactoryPostProcessor,执行postProcessBeanFactory方法//    invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);        invokeBeanFactoryPostProcessors(nonOrderedPostProcessorNames, beanFactory);        // Clear cached merged bean definitions since the post-processors might have        // modified the original metadata, e.g. replacing placeholders in values...        // 清除元数据缓存(mergeBeanDefinitions、allBeanNamesByType、singletonBeanNameByType)        // 因为后置处理器可能已经修改了原始元数据,例如,替换值中的占位符        beanFactory.clearMetadataCache();    }
```

此处代码逻辑比较长,但逻辑比较简单,分为3类:PriorityOrdered、Ordered、其他,放在三个集合,通过invokeBeanDefinitionRegistryPostProcessors执行

```
private static void invokeBeanFactoryPostProcessors(      Collection<? extends BeanFactoryPostProcessor> postProcessors, ConfigurableListableBeanFactory beanFactory) {   for (BeanFactoryPostProcessor postProcessor : postProcessors) {      postProcessor.postProcessBeanFactory(beanFactory);   }}
```

**refresh-06**:registerBeanPostProcessors

此处代码逻辑,找到容器中的BeanPostProcessor,添加到容器中;分三类:PriorityOrdered、ordered、其他,排序后添加;

![图片](https://mmbiz.qpic.cn/mmbiz_png/0svRp2bbRibaDMREgI2m49HwnmHlXziaibprQeB7bQfcicAfT3YyFk3XwgM580qTA1BvibWpPe7LeGQrnJ9Pojzk79A/640?wx_fmt=png&from=appmsg)

  

> 来自公众号:[一个程序猿的笔记](https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=wx26c025854dc3a9ae#wechat_redirect)