Springboot 原理
Springboot 帮助快速搭建java 应用程序,包括web和console 应用程序。 默认继承一般需要的依赖。 例如web应用会继承:tomcat-servlet, Jackson,oauth2,WebMvc等等。
Springboot项目有10个模块
- spring-boot
四大功能:
- SpringApplication,功能就是保证创建和刷新ApplicationContext
- 嵌入的web程序,可选择Tomcat, Jetty or Undertow
- 外部配置支持
- ApplicationContext初始化
- spring-boot-autoconfigure,
通过@EnableAutoConfiguration 启用,检测用户可能需要的bean。 例如, 如果HSQLDB在classpath里面, 并且用户没有设置数据库链接, 很可能需要一个内存数据库,springBoot会重新指派一个
这里设置了大量的默认类,约定优于配置主要体现在这里
- spring-boot-starter
依赖集合。 spring 一站式依赖集合, 如spring-boot-starter-web,等。 在pom.xm 指定即可
- spring-boot-cli
命令行工具,用来编译和执行Groovy代码
- spring-boot-atuator
程序监测, 使用它可以通过http,或者jmx 来审计,健康监测,以及指标收集。
- spring-boot-actuator-autoconfigure
自动配置自动监测
- spring-boot-test
自动化测试
- spring-boot-test-autoconfigure
自动化测试自动配置
- spring-boot-loader
用来构建 single jar, 这样的jar 可以用java -jar 来启动。 一般不直接使用,而是通过maven 插件来达到同样的功能
- spring-boot-devtools
Springboot 启动过程
- 载入。
SpringApplication 构造
- 设置resourceLoder. 默认是annotation loader
- 载入全部主要资源(primarySources)
- 设置webApplicationType. 从classpath推导
- 收集初始化器(ApplicationContextInitializer, 继承这个接口的类)
- 收集Listener. (ApplicationListener, 继承这个接口的类)
- 推导main class.
这个推导方法有点意思:
private Class<?> deduceMainApplicationClass() {
try {
StackTraceElement[] stackTrace =
new RuntimeException().getStackTrace();
for (StackTraceElement stackTraceElement : stackTrace) {
if ("main".equals(stackTraceElement.getMethodName())) {
return
Class.forName(stackTraceElement.getClassName());
}
}
}
catch (ClassNotFoundException ex) {
// Swallow and continue
}
return null;
}
- 启动运行(run)。 属于sprint-boot 模块
- 设置环境 prepareEnvironment
根据不同的context (servlet, reactiveWeb or standard)设置环境变量,
默认环境变量:
systemEnvironment |
systemProperties |
servletContextInitParams |
servletConfigInitParams |
jndiProperties |
|
---|---|---|---|---|---|
servlet |
有 |
有 |
有 |
有 |
有 |
reactive web |
有 |
有 |
|||
standard |
有 |
有 |
- 创建ConfigurableApplicationContext,
有三种ConfigurableApplicationContext:
- 默认 传统Servlet web AnnotationConfigServletWebServerApplicationContext
- 非阻塞reactive web AnnotationConfigReactiveWebServerApplicationContext
- 非web应用程序 AnnotationConfigServletWebServerApplicationContext
非Web应用就是普通的consol程序。 关于 Servlet web 和 Reactive web 见另我一篇文章 spring boot中的web技术
- 根据context 准备 beanContext,方法 prepareContext,
- 设置context 环境变量,
环境变量包括 Profile, 系统环境变量,系统属性(SystemProperties)
设置beanDefinitionReader(xmlReader,annotationReader,groovyReader) 和
classpath beandefinition scanner, 以决定是通过xml 定义还是注解定义的bean.
- 注册单例的bean。
- 设置资源加载器
- 设置classLoader
- 设置转换服务,如 stringToDuration, durationToString等
- 应用初始化器
- 载入资源(创建beans)
- refreshContext。 web server 是在这一步创建的。
程序都继承 AbstractApplicationContext,包括web程序
- afterRefresh
- 执行main函数
Springboot启动例子
- jvm classLoader 加载类
- 启动springboot 启动流程
- oracle中关于小数中0的格式化(55天)
- 关于trigger过滤最大值的问题(54天)
- oracle共享服务器配置汇总(53天)
- 关于drop user的cascade选项解惑(52天)
- ORACLE数据文件名导致的奇怪问题 (51天)
- linux下挂载新硬盘和分区的步骤 (50天)
- 通过shell脚本生成数据统计信息的报表 (笔记65天)
- 物化视图全量刷新的简单测试(63天)
- Golang语言社区--Go操作CSV文件
- TiDB 源码阅读系列文章(四)Insert 语句概览
- 食品安全溯源区块链解决方案探索
- Docker 简介与安装
- 经典Java面试题收集
- 关于update语句的性能测试(62天)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- keepalived结合lvs实现双机热备
- jenkins安装说明
- Haproxy combined with FTP cluster for load balancing
- redis使用playbook批量安装
- SpringCloud Alibaba微服务实战十八 - Oauth2.0 自定义授权模式
- 包子旧闻&Leetcode solution 1344. Angle Between Hands of a Clock
- Ubuntu下DNS服务搭建
- 深入理解JavaScript函数式编程
- JavaScript 异步编程
- 日志清理脚本-V0.0.3(增加多目录清理、正则表达式匹配、调试模式;部分细节优化)
- Fastdfs高可用集群搭建
- Logstash:处理多个 input
- 一文学会哈希法解题
- 一小时彻底掌握stm32中断。
- Python 爬虫进阶必备 | 关于某虚拟币网站加密签名的分析(难度0.1)