源码环境
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

bd

**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://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=wx26c025854dc3a9ae#wechat_redirect)