Spring有一个内部的BeanFactoryPostProcessor

ID:org.springframework.context.annotation.internalConfigurationAnnotationProcessor;

类型:BeanDefinitionRegistryPostProcessor;

实现类ConfigurationClassPostProcessor;

负责解析处理所有@Configuration标签类,并将Bean定义注册到BeanFactory中。

那ConfigurationClassPostProcessor是怎么处理打了@Configuration标签的Class的呢?

首先进行解析过程是在ApplicationContext-refresh-invokeBeanFactoryPostProcessor中执行的。

此时的BeanFactory中已经将加载了main class,以及内部定义的class。内部定义的class都是带internal的,这些并不是Configuration Class,解析程序会忽略这些类,最后只有sampleApplication会进行Configuration的解析处理。此时BeanFactory中的Bean定义请见附1。

ConfigurationClassPostProcessor的解析过程:

ConfigurationClassPostProcessor通过ConfigurationClassParser进行实际解析操作。

ConfigurationClassParser将会进行如下解析处理:

处理嵌套的MemberClass

处理@PropertySource标签,用来解析属性文件并设置到Environment中。

处理@ComponentScan标签,扫描package下的所有Class并进行迭代解析。

处理@Import标签。

处理@ImportResource标签。

处理@Bean标签。

处理所有继承的Interface上的@Bean标签。

处理SuperClass。

处理标签中的DeferredImport。

DeferredImport跟spring-boot-autoconfig息息相关。

在@SpringBootApplication中有@EnableAutoConfiguration,@EnableAutoConfiguration中有@Import(AutoConfigurationImportSelector.class),AutoConfigurationImportSelector是DeferredImportSelector,会被作为DeferredImport进行处理。

那DeferredImportSelector都做了些什么呢?

1、加载spring-boot-autoconfig包下的spring-autoconfigure-metadata.properties配置文件,获取所有支持自动配置的信息。

2、获取所有支持EnableAutoConfiguration的组件信息,这部分信息配置在spring-boot-autoconfig包下的spring.factories下,可以看到支持127个第三方组件配置。

3、对现有的这些组件进行排序、去重等处理。

4、然后使用AutoConfigurationImportFilter进行过滤,过滤的方式基本上是判断现有系统是否引入了某个组件,(系统是否使用哪个组件是在pom定义的时候就确定了的),如果有的话则进行相关配置。比如ServletWebServerFactoryAutoConfiguration,会在ServletRequest.class等条件存在的情况下进行配置,而EmbeddedTomcat会在Servlet.class, Tomcat.class存在的情况下创建TomcatServletWebServerFactory。

最后有效的DeferredImport请见附2,共有22个配置类。

而在DeferredImport之后BeanFactory中的Beans则有112个,里边有我们自定义的sampleApplication、sampleController,以及组件自定义的dispatcherServlet等。这样整个web工程启动所需要的Bean基本上都全了。

附1:

name:org.springframework.context.annotation.internalConfigurationAnnotationProcessor,

class:rg.springframework.context.annotation.ConfigurationClassPostProcessor

name:org.springframework.context.annotation.internalAutowiredAnnotationProcessor,

class:org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor

name:org.springframework.context.annotation.internalRequiredAnnotationProcessor,

class:org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor

name:org.springframework.context.annotation.internalCommonAnnotationProcessor,

class:org.springframework.context.annotation.CommonAnnotationBeanPostProcessor

name:org.springframework.context.event.internalEventListenerProcessor,

class:org.springframework.context.event.EventListenerMethodProcessor

org.springframework.context.event.internalEventListenerFactory,

class:org.springframework.context.event.DefaultEventListenerFactory

name:sampleApplication,

class:com.travelsky.ibeplus.sample.helloworld.SampleApplication

name:org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory

class:org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer$SharedMetadataReaderFactoryBean

附2:

附3:

转载于:https://www.cnblogs.com/jiaoqq/p/7678037.html

3.1.1_Spring如何加载和解析@Configuration标签相关推荐

  1. 一个mapper接口有多个mapper.xml 文件_MyBatis 源码解析:映射文件的加载与解析(上)

    上一篇我们分析了配置文件的加载与解析过程,本文将继续对映射文件的加载与解析实现进行分析.MyBatis 的映射文件用于配置 SQL 语句.二级缓存,以及结果集映射等,是区别于其它 ORM 框架的主要特 ...

  2. HTML页面加载和解析流程详细介绍

    浏览器加载和渲染html的顺序.如何加快HTML页面加载速度.HTML页面加载和解析流程等等,在本文将为大家详细介绍下,感兴趣的朋友不要错过 浏览器加载和渲染html的顺序 1. IE下载的顺序是从上 ...

  3. 浏览器加载、解析、渲染的过程

    最近在学习性能优化,学习了雅虎军规 ,可是觉着有点云里雾里的,因为里面有些东西虽然自己也一直在使用,但是感觉不太明白所以然,比如减少DNS查询,css和js文件的顺序.所以就花了时间去了解浏览器的工作 ...

  4. linux优化网页加载过程,HTML页面加载和解析流程 介绍

    1.浏览器加载和渲染html的顺序 1.1.IE下载的顺序是从上到下,渲染的顺序也是从上到下,下载和渲染是同时进行的. 1.2.在渲染到页面的某一部分时,其上面的所有部分都已经下载完成(并不是说所有相 ...

  5. 高性能js之js文件的加载与解析

    随着网站的发展,现在的网页已经离不开js,经常一个页面会引入大量的js.那么该如何合理的加载这些js? head标签中引入js文件可能是最常见的一种方式,但是这样会造成一个问题.因为j可以说是浏览器中 ...

  6. html中加载解析,HTML页面加载和解析流程详细介绍

    序言: 我一直都认为"网页制作"这个词是一个不怎么高端的词,在我的印象中网页制作的词是没有生命力的一个制作,我喜欢用HTML 这样简单直接,这词凸显高端,有大气漂亮的UI.一套完美 ...

  7. Spring bean 标签加载、解析过程分析

    概述 上一篇[Spring 加载.解析applicationContext.xml 流程]分析了从xml文件加载到开始解析xml里面的标签为止,基本都是跟spring 真正的核心没什么关系. 这篇我们 ...

  8. plsql 无法解析指定的连接标识符_Java方法加载、解析、存储、调用

    方法调用在项目中是数不胜数,除了一些常量类其他的类都会定义方法并调用,那你有想过他是怎么从一个java语言写的方法到计算机执行的吗,下面我们就来学习Class字节码文件中保存java中的方法.方法加载 ...

  9. extjs 文件加载、解析流程

    extjs版本:4.2.1 在html中添加应用的启动脚本,如下: <script src="app.js"></script> 2. 用户访问html的时 ...

最新文章

  1. 皮一皮:我也想做这样的房东,善解人意、为他人着想...
  2. Oracle DBlink相关
  3. Access导入MDB文件
  4. 交叉熵代价函数cross-entropy
  5. Jenkins的卸载
  6. node汉字拼音转换需要用到pinyin包,使用pinyin中的分词时报错提示需要安装nodejieba依赖...
  7. 2020年度JEECG开发者大赛,开发插件赚外块还能赢大奖!!
  8. KVM之初体验——QEMU安装虚拟机
  9. 英特尔预计第12代酷睿H系列处理器将有超过100款设备采用
  10. 软件工程——成品展示
  11. python函数可以提高代码执行速度吗_Python代码运行速度慢?这五种方法很管用
  12. 快乐大本营中测试声音年龄的软件_海天味极鲜酱油极限挑战宝藏行 终极试炼,极限成员们勇登珠峰大本营...
  13. 【机器学习】一文详尽系列之EM算法
  14. C#用正则表达式 获取网页源代码标签的属性或值
  15. 服务器芯片的引脚功能,74ls06中文资料汇总(74ls06引脚图及功能_真值表及应用电路)...
  16. 二层交换机、三层交换机、路由器的区别
  17. linux 网卡爽ip,linux服务器双网卡爽IP实现双线
  18. 乐动手环app下载安装_乐动手环app下载安装
  19. npm安装失败及解决办法 error network tunneling socket could not be established
  20. Python2.X无换行无空格输出

热门文章

  1. [BUUCTF-pwn]——rip
  2. 关于优酷开放SDK之setOnVideoSizeChangedListener
  3. psql+加载mysql数据库_Go实战--go语言操作PostgreSQL数据库(github.com/lib/pq)
  4. org.eclipse.jdt.internal.compiler.CompilationResult.getProblems()[Lorg/eclipse/jdt/core/compiler/IPr
  5. Spring Web Service 学习之Hello World篇
  6. log4j xml配置详解
  7. 剖析Linux系统启动过程
  8. NOIP2016 愤怒的小鸟
  9. Codeforces Round #392(div 2) 758D (贪心)
  10. 数学趣题——魔幻方阵