SpringApplication.run(xxx.class, args)背后的东东——整体脉络
从spring到springmvc,再到springboot、springcloud,应用程序api开发调用方面都已经非常熟悉,但对spring背后的扩展机制:为何一个简单的main方法可以实现这么强大的功能,以及与第三方应用如何完美集成?带着这些疑问,了解下springboot背后的整体脉络。
大家都知道,对spring的扩展一般有三种方式:@import注解,实现ImportSeletor,以及实现ImportBeanDefinitionRegistrar接口,所以其实主要搞明白springboot底层是如何支持这三种方式就可以了。
首先,run方法执行时,会实例化spring容器,其实根据不同的环境实例化不同的容器类
context = createApplicationContext();
servlet环境是实例化AnnotationConfigServletWebServerApplicationContext类,这里最重要是注册一些内置的BeanDefinitionRegistryPostProcessor(BeanFactoryPostProcessor的子接口),其中就包含重要ConfigurationClassPostProcessor,spring还特意为这种beandefinition取了beanname,如:org.springframework.context.annotation.internalConfigurationAnnotationProcessor。这里有必要解释下beandefinition,这个类个人认为是spring最重要的,spring容器管理的对象是我们创建的普通bean,但spring在创建之前,对这种bean用beandefinition进行了包装和描述,进而可以在不同的扩展点去扩展bean的功能,底层是通过实现beanpostprocessor接口,同理咱们还可以实现beanfactorypostprocessor接口去扩展beandefinition,这也是spring设计的巧妙之处。
实例化工作完成之后会调用spring刷新容器的方法
org.springframework.context.support.AbstractApplicationContext#refresh
接下来工作其实无非就是在哪个时机对刚刚spring进行注册的beanfactorypostprocessor进行调用的问题,spring底层是委托PostProcessorRegistrationDelegate进行处理的。
org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanDefinitionRegistryPostProcessors
最后就是回调ConfigurationClassPostProcessor等方法了
org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry
@Import就是通过以下方法处理,将其配置信息解析出来
org.springframework.context.annotation.ConfigurationClassParser#processImports
最后,将其注册到spring的BeanDefinitionRegistry中,整个扩展过程就完成了,剩下的就是spring如何根据beandefinition去实例化bean了。
org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader#registerBeanDefinitionForImportedConfigurationClass
回到最开始的问题,spring既然可以通过BeanDefinitionRegistryPostProcessor去动态的扩展beandefinition来实例化bean,那我们就可以利用这个扩展机制来集成第三方的工具到spring中,利用容器来管理这些bean,比如mybatis就是通过MapperScannerConfigurer来和spring整合的。
SpringApplication.run(xxx.class, args)背后的东东——整体脉络的更多相关文章
- Spring boot 源码分析(一)SpringApplication.run(上)
SpringApplication.run(Main.class, args); 从这个方法开始讲吧: public static ConfigurableApplicationContext run ...
- 现象:SpringApplication.run后面的语句未执行
下面的两种情况下,红色的log.info中的内容一直没有执行,和预期不符. 看来,需要在@PostConstruct修饰的函数.CommandLineRunner的run方法中调用 另外的线程 来执行 ...
- 011-Spring Boot 运行流程分析SpringApplication.run
一.程序入口 1.1.静态方法 //直接调用run方法 ConfigurableApplicationContext context = SpringApplication.run(App.class ...
- SpringApplication.run 做了哪些事?
SpringApplication.run一共做了两件事,分别是 创建SpringApplication对象 利用创建好的SpringApplication对象,调用run方法论 结论: 面试官: 我 ...
- SpringApplication.run
SpringApplication.run一共做了两件事,分别是 创建SpringApplication对象 利用创建好的SpringApplication对象,调用run方法 1.创建SpringA ...
- 三面面试官:运行 npm run xxx 的时候发生了什么?
事情是这样的,直接开讲 面试官:npm run xxx的时候,发生了什么?讲的越详细越好. 我(心想,简单啊): 首先,DNS 解析,将域名解析成 IP 地址,然后 TCP 连接,TCP 三次握手.. ...
- JSNI GWT中的东东
二.JavaScript Native InterfaceJavaScript本地接口JSNI.1)声明一个本地方法在JSNI中声明一个本地方法时,使用Java的标准native关键字,就像在JNI( ...
- [巩固C#] 一、特性是什么东东
阅读目录 关闭 前言 特性是什么? 那么什么是“元数据”? 特性到底是什么? 我们自定义一个特性玩玩 什么是命名参数? 我们来继续要看看AttributeUsage(这个描... 自定义特性可 ...
- C++ 中可调用的且有函数功能的东东
第一个:函数 其实函数在声明的时候都有个名字: 这个名字可以看作是是指针,将其直接赋值给函数指针 也可以看作是可取指的对其& 再赋值给函数指针 第二个:函数指针 通过其被赋值的方式 ...
随机推荐
- C语言专项错题集
2020-08-10 记录 #1 1 struct student{ 2 int num; 3 int age; 4 }; 5 struct student stu[3]={{6001,20},{60 ...
- Spring源码系列(四)--spring-aop是如何设计的
简介 spring-aop 用于生成动态代理类(底层是使用 JDK 动态代理或 cglib 来生成代理类),搭配 spring-bean 一起使用,可以使 AOP 更加解耦.方便.在实际项目中,spr ...
- 【CF1425B】 Blue and Red of Our Faculty! 题解
原题链接 简要翻译: 有一个连通图,A和B同时从点1出发,沿不同的路径前进.原本,图上的每一条边都是灰色的.A将经过的边涂成红色,B将经过的边涂成蓝色的.每个回合每个人只能走灰色的边.当某个回合中不存 ...
- 内存操作【memset】【memcpy】
void *memset(void *s, int c, unsigned long n); 将指针变量 s 所指向的前 n 字节的内存单元用一个"整数" c 替换,注意 c 是 ...
- 初识HTTP 图解 形象生动
使用软件: 通信猫 请自行下载 使用平台: win7 360浏览器 当前PC连接的是无线网,所以第2步查看的是 无线局域网适配器上的IP地址
- 035 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 02 多重if结构
035 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 02 多重if结构 本文知识点:Java中的多重if结构 选择结构回顾 if选择结构 注意: 1.条 ...
- asp.net mvc核心、实体框架和simplepagin .js中的分页
下载demo - 516.1 KB , 介绍 这篇文章将解释如何在asp.net mvc核心应用程序中进行分页,目标是enity框架,并使用jquery模板simplepagin .js. 我的一个应 ...
- MinGW与Cygwin的关系与差别
PART1 共同点 Cygwin / GCC和MinGW都是gcc在WINDOWS下的实现. gcc:它是一款原来只能在Linux系统上使用的开源C语言编译器,后来移植到了Windows操作系统上(以 ...
- JavaScript常用对象介绍
目录 对象(object) 对象的创建方式 点语法 括号表示法 内置对象 Array 数组创建方式 检测数组 转换方法 分割字符串 栈方法 队列方法 重排序方法 操作方法 位置方法 迭代方法 Stri ...
- mysql5.7.23 解压版 密码忘记了咋办??
mysql 5.7.23 err文件: 查看log中保存的 密码 记下密码,重新启动MySQL服务,并进入CMD命令行,在此使用mysql -u root -p登陆,键入密码 进入数据库后,使用se ...