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++ 中可调用的且有函数功能的东东
第一个:函数 其实函数在声明的时候都有个名字: 这个名字可以看作是是指针,将其直接赋值给函数指针 也可以看作是可取指的对其& 再赋值给函数指针 第二个:函数指针 通过其被赋值的方式 ...
随机推荐
- Processing 高效控制管理图形方法(一)
之前在CSDN上发表过: https://blog.csdn.net/fddxsyf123/article/details/62456299
- spring-boot-route(一)Controller接收参数的几种方式
Controller接收参数的常用方式总体可以分为三类.第一类是Get请求通过拼接url进行传递,第二类是Post请求通过请求体进行传递,第三类是通过请求头部进行参数传递. 1 @PathVariab ...
- 《kubernetes + .net core 》dev ops部分
目录 1.kubernetes 预备知识 1.1 集群资源 1.1.1 role 1.1.2 namespace 1.1.3 node 1.1.4 persistent volume 1.1.5 st ...
- MATLAB中conv2的详细用法 (以及【matlab知识补充】conv2、filter2、imfilter函数原理)
转载: 1.https://blog.csdn.net/jinv5/article/details/52874880 2.https://blog.csdn.net/majinlei121/artic ...
- 微服务 | Spring Cloud(一):从单体SSM 到 Spring Cloud
系列文章目录 微服务 | Spring Cloud(一):从单体SSM 到 Spring Cloud 目录 系列文章目录 前言 单体式架构 微服务架构 优点 缺点 服务发现与弹性扩展 参考 前言 在微 ...
- Oracle 数据库下赋予用户的执行存储过程和创建表权限
grant create any table to username; grant create any procedure to username; grant execute any proced ...
- 【4】进大厂必须掌握的面试题-Java面试-jdbc
1.什么是JDBC驱动程序? JDBC驱动程序是使Java应用程序与数据库进行交互的软件组件.JDBC驱动程序有4种类型: JDBC-ODBC桥驱动程序 本机API驱动程序(部分为Java驱动程序) ...
- 西安交通大学c++[mooc]课后题12章(只有后两题)
不是从第一题开始的,因为我刚准备把代码粘到CSDN上面,可以给自己看,也有可能启发后来者. 机会是留给有准备的人的 --路易斯·巴斯德 先写下第12周慕课学习总结吧! 多态就是将运算符重载, ...
- 多测师讲解python_模块(导入模块和内置模块)_高级讲师肖sir
#自定义模块# from aaa import * #指定导入某个包中具体的类.函数.方法## A.fun1(2,2) #import +模块名 :# # import +模块名+.+.+# # 导入 ...
- Markdown语法及使用方法完整手册
欢迎使用 Markdown在线编辑器 MdEditor Markdown是一种轻量级的「标记语言」 Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容 ...