——在快速读完整本书后开始第二遍带着思考的方式和目前对该技术的有限认知再进行阅读来加深自己的理解
目录
一、对spring boot的理解
二、创建独立的Spring应用
2.1应用的分类
2.2创建独立的spring应用的方式
在 《spring boot编程思想》中提到“spring boot 为快速启动且最小化配置的Spring应用而设计,并通过固化的视图的方式用于构建生产级别的应用”。
结合后面提到的技术我认为spring boot就是
1、通过基于注解的编程方式和外部化配置的方式来代替接口式的编程方式,从而达到简化配置的目的。
2、固化的视图就是指对"starter"的固化依赖,通过固化spring boot依赖的Spring平台和第三方类库的方式减少对他们管理的烦恼,减少了开发成本。
Spring boot有六大特性:
1、创建独立的Spring应用
原理分析:Jarlauncher的实现原理_sky_dianziaihaozhe的博客-CSDN博客
2、提供嵌入式容器,不用再部署WAR文件
3、提供固化的“starter”依赖,简化构建配置(需要Maven仓库进行管理其依赖的第三方类库)
4、在条件满足时自动装配Spring或第三方类库(需要Maven仓库进行管理其依赖的第三方类库)
5、提供运维特性(还不太了解该技术的实现)如指标信息(Metrics)、健康检查和外部化配置
6、绝无代码生成、并通过注解的方式进行配置不在需要XML配置
针对这6大特性注意进行学习思考其实现原理和方式
开发环境:
Maven3.0+
jdk8.0+
idea/Eclipse等
需要思考的问题:
1)为什么是独立的应用?
2)为什么是spring应用而不是spring boot应用?
在大多数Spring boot应用场景中,程序直接或者间接的使用springApplication API引导应用,然后在结合嵌入式的容器对外部提供http服务。而引导应用最简单的应用场景如下图所示:
public static void main(String[] args) {
SpringApplication.run(App.class,args);
}
在传统的spring应用是将开发好的应用打包成WAR文件或者EAR文件然后部署到外部的容器中(Java EE容器),然后通过脚本的方式进行引导,随其生命周期回调执行Spring上下文的回调。而spring boot提供了内嵌的Web容器,不需要再依赖于外部的容器,其应用的生命周期拥有完全自主的控制。所以说spring boot可以开发独立的应用。
嵌入式容器作为应用的一部分,从本质上讲,它属于spring应用上下文的组件beans,该beans和其他组件均有自动装配特性组装成Spring Bean定义(BeanDefinition),随着spring应用上下文的启动进行注册和初始化,而启动的核心组件就是spring boot的核心API springApplication所以它是spring应用也是springboot应用。 而spring boot是通过方便快捷的启动方式提高开发部署spring应用的效率。
按照应用类型分类的化可以分为web应用和非web应用。web应用就是指通过内嵌的web容器向外提供http服务,非web应用主要是用于提供后台处理服务、任务调度、消息处理等场景。随着spring boot版本的迭代web应用又分为主动式web容器(servlet容器)和反应式容器(reactive服务),在spring boot 1.x版本仅提供了servlet web容器,在2.0版本以后开始增加了reactive web容器实现——WebFlux。
那么为了简化开发应用的类型,在spring boot 2.0版本中在springApplication类中提供了setWebApplicationType(Web ApplicationType)方法来显示的设置开发的应用类型。
/**
* Sets the type of web application to be run. If not explicitly set the type of web
* application will be deduced based on the classpath.
* @param webApplicationType the web application type
* @since 2.0.0
*/
public void setWebApplicationType(WebApplicationType webApplicationType) {
Assert.notNull(webApplicationType, "WebApplicationType must not be null");
this.webApplicationType = webApplicationType;
}
其中WebApplicationType是一个枚举类,在该类中有三个实例分别代表三种应用看源码:
public enum WebApplicationType {
/**
* The application should not run as a web application and should not start an
* embedded web server.
*/
NONE,
/**
* The application should run as a servlet-based web application and should start an
* embedded servlet web server.
*/
SERVLET,
/**
* The application should run as a reactive web application and should start an
* embedded reactive web server.
*/
REACTIVE;
//在该类还提供了一些方法,目前先不考虑
...
}
在使用的时候,需要指定应用类型和添加其固化的依赖的方式和自动装配的方式进行配置和启动容器,在这里先简单的提一下,在后面固化依赖时再详细说明。servlet web容器和reactive web容器的相关依赖分别为:
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-webflux
2.5.6
通过Maven仓库进行管理。
有两种创建方式:
1、通过命令行的方式启动maven仓库并进行配置和部署(对于开发人员来说通过Idea编译器创建更方便)
2、图形化界面创建spring boot应用(在https://start.spring.io中进行构建下载到本地的方式)
创建方式见连接:
创建spring boot 应用的两种方式_sky_dianziaihaozhe的博客-CSDN博客
对于运行spring boot应用的化就比较简单了,在开发阶段通过Idea中的run按钮就可以运行,其底层是通过执行:mvn spring-boot:run方式运行。在生产环境中通过执行java -jar运行spring jar包就可以运行spring boot应用。
注:如果要生成spring boot jar包则需要添加spring-boot-maven-plugin到pom.xml文件中。
org.springframework.boot
spring-boot-maven-plugin
并在终端运行mvn package命令方式完成打包。
打包完成后生成两个文件.jar文件和.jar.original文件,位置在target文件夹下。
解压jar文件并分析一下.jar文件的构成
├─BOOT-INF
│ ├─classes
│ │ └─thinking
│ │ └─in
│ │ └─spring
│ │ └─boot
│ └─lib
├─META-INF
│ └─maven
│ └─org.example
│ └─oneUnit
└─org
└─springframework
└─boot
└─loader
├─archive
├─data
├─jar
├─jarmode
└─util
jar文件包含BOOT-INF、META-INF、org三个文件。
BOOT_INF
其中BOOT-INF有两个子类:
1、classes文件是存放的编译后的class文件
2、lib存放的是应用依赖的jar包;
META-INF
META-INF存放的是相关的元信息,根据“JAR文件规范”java -jar命令引导的具体启动类必须配置在MANIFEST.MF文件中,该文件也必须存放在META-INF文件夹中。
Manifest-Version: 1.0
//类路径索引
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
//应用名称
Implementation-Title: first-app-by-gui
//应用版本号
Implementation-Version: 0.0.1-SNAPSHOT
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
//启动引导类
Start-Class: thinkinginspringboot.firstappbygui.FirstAppByGuiApplicati
on
//编译后的class文件的位置
Spring-Boot-Classes: BOOT-INF/classes/
//应用的依赖
Spring-Boot-Lib: BOOT-INF/lib/
//jdk的版本号
Build-Jdk-Spec: 1.8
//spring boot的版本号
Spring-Boot-Version: 2.5.6
//Maven版本号
Created-By: Maven Jar Plugin 3.2.0
//可执行的JAR文件启动器关联项目引导类----start-class
Main-Class: org.springframework.boot.loader.JarLauncher
org
org存放的是与是与springframework相关的class文件。
jar.original文件存放的是不包含第三方依赖资源的文件,在执行spring -boot-maven-plugin Maven插件后,该文件就会导入其以来的第三方资源被重新打包成一个.jar文件。
时间有点晚了,有点累了,其执行逻辑在下一篇spring boot执行逻辑中进行总结。