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 启动流程
- JSP 中EL表达式用法详解
- CSS判断不同分辨率显示不同宽度布局CSS3技术支持IE6到IE8
- Hibernate详细教程
- TensorFlow中的多线程
- nginx 域名绑定 域名, nginx 域名绑定 端口
- Centos下Yum安装PHP5.5,5.6,7.0
- 请注意,我们要谈谈神经网络的注意机制和使用方法
- Configure Apache Virtual Hosts - CentOS 7
- centos7查看端口命令
- 为什么算法容易忘记之快速排序
- 为什么算法容易忘记之插入排序
- 让你又爱又恨的推荐系统--程序猿篇
- C#使用RSA证书文件加密和解密示例
- Python调用C函数的方法以及如何编写Python的C扩展
- 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 文档注释
- C#记事本项目开发,一个可以实现批量操作的记事本!【附源码】
- Python 库引用问题:name 'json' is not defined,原因及解决办法
- Java集合类之Collection接口,集合的“爸爸”接口了解一下?
- Python 微信机器人-下载微信接收到的语音、图片等资源
- Python源文件打包成可执行的exe应用,给你的代码变个身!
- Python 技术篇-ffmpeg.exe的安装及配置
- Python 库配置问题-"Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work",原因及解决办法
- 小白都能看懂的简单爬虫入门案例剖析(爬虫入门看它就够了!)
- Python 技术篇-音频mp3格式转wav格式,高保真
- Python3 模块
- Python 微信机器人-向好友发送名片、转发名片
- iOS多线程:GCD使用介绍
- 适用于各语言的二分查找算法,你get到了嘛?
- Theme preview
- “抽象类”到底抽不抽象?实例对比一看便知!