共计 8749 个字符,预计需要花费 22 分钟才能阅读完成。
本文属于原创,转载注明出处,欢迎关注微信小程序 小白 AI 博客
微信公众号 小白 AI
或者网站 https://xiaobaiai.net
[TOC]
1 前言
在上一篇文章中我们已经详解介绍了 Spring boot
相关的概念、特性以及周边知识,这一篇文章我们继续深入。我们知道 Spring boot
是一个入口,利用 Spring Boot
提供的核心组件可以很方便的、快速的
(Boot) 创建或配置实际项目,接下来我们来了解 Spring boot
都包含了哪些核心模块 (组件),以及Spring boot
是如何运转起来的,最后通过一个实际的 Hello World
项目来说明。
2 名词术语
名词术语 | 释义 |
---|---|
CLI | 命令行界面,command-line interface |
Marven | Apache Maven 是一个软件项目管理和综合工具,构建自动化系统(如 Make,CMake)。基于项目对象模型(POM)的概念,Maven 可以从一个中心资料片管理项目构建,报告和文件。Maven 简化和标准化项目建设过程,处理编译,分配,文档,团队协作和其他任务的无缝连接。Maven 增加可重用性并负责建立相关的任务;Marven 拥有依赖管理功能,它通过简单的配置就可以自动从网络上下载项目所需的依赖 |
POM | 项目对象模型(Project Object Model),它是 Maven 项目中的文件,使用 XML 表示,名称叫做 pom.xml;该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的 url、项目的依赖关系等;Maven 世界中,project 可以什么都没有,甚至没有代码,但是必须包含 pom.xml 文件 |
Gradle | Gradle 是一个完全开源的构建自动化系统,使用特定编程语言 Groovy 来书写配置文件,不同于 Marven 使用 XML。如 Android 开发 IDE Android Studio 默认就是使用 Gradle 来构建项目;Gradle 与 Maven 相比更为灵活,简单。 |
Groovy | Groovy 是一种基于 JVM(Java 虚拟机)的敏捷开发语言,最终会编译成 JVM 字节码,它是一种动态编程语言,即可以面向对象编程,也可以用作纯粹的脚本语言,它结合了 Python、Ruby 和 Smalltalk 的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy 也可以使用其他非 Java 语言编写的库。像 Kotlin, Scala 也都是工作在 JVM 之上的;语法跟 Java 语法特别相似;Apache2.0 授权;不像 Java,所有依赖包是默认导入的; |
Spring IoC 容器 | 它是 Spring 框架的核心。IoC 容器从 XML 文件,Java 注解或 Java 代码接收元数据。容器通过读取提供的配置元数据,从简单的普通 Java 对象(Plain Old Java Objects, POJO)获取有关要实例化,配置和组装哪些对象的指令。这些通过此过程创建的对象称为 Spring Beans。 |
JDK8 | JDK8 或者 JDK1.8 是由于自从 JDK1.5/JDK5 命名方式改变后遗留的新旧命令方式问题。所以 JDK8 或者 JDK1.8 也是同一个东西。 |
STS | Spring Tool Suite |
3 Spring Boot 核心模块
Spring Boot
主要几个核心模块:
- spring-boot(主模块),提供了支持 Spring Boot 其他部分的功能
- spring-boot-starters(起步依赖)
- spring-boot-autoconfigure(自动配置)
- spring-boot-cli(命令行界面)
- spring-boot-actuator(执行器)
- spring-boot-actuator-autoconfigure
- spring-boot-test
- spring-boot-loader
- spring-boot-devtools
- ……
3.1 spring-boot(主模块)
???? 下面的操作看不懂或者理解很模糊,先别慌,后面会深入讲解的。因为我现在自己也没彻底搞懂,怕带歪你们,都是摘取官方文档中汇总而来的。
1) SpringApplication 类:
-
该模块其中的
SpringApplication
类可用于从Java main
方法引导和启动 Spring 应用程序。默认情况下,该 class 将执行以下步骤来引导应用程序:- 创建一个适当的
ApplicationContext
实例(取决于你的类路径) - 注册一个
CommandLinePropertySource
以将命令行参数公开为 Spring 的属性(properties) - 刷新应用程序上下文(
ApplicationContext
),加载所有单例 bean - 触发任何
CommandLineRunner
bean
- 创建一个适当的
在大多数情况下,可以直接从主方法中调用静态 run(Class, String [])
方法来引导应用程序:
@Configuration
@EnableAutoConfiguration
public class MyApplication {
// ... Bean definitions
public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);
}
}
对于更高级的配置,可以在运行之前创建和定制 SpringApplication
实例:
public static void main(String[] args) {SpringApplication application = new SpringApplication(MyApplication.class);
// ... customize application settings here
application.run(args)
}
SpringApplications
可以从各种不同的来源读取 beans。通常建议使用单个 @Configuration
类来引导你的应用程序,但是,你也可以从以下位置设置来源:
- 要由
AnnotatedBeanDefinitionReader
加载的完全限定的类名 -
XmlBeanDefinitionReader
加载的 XML 资源的位置,或GroovyBeanDefinitionReader
加载的groovy
脚本 - 要由
ClassPathBeanDefinitionScanner
扫描的软件包的名称
配置属性 (Configuration properties) 也绑定到 SpringApplication
。这样就可以动态设置SpringApplication
属性,例如用于指示 Web 环境的标记(” spring.main.web-application-type=none”)或其他来源("spring.main.sources" -a CSV list
)。标志以关闭 banner(”spring.main.banner-mode=off”)。
2) 提供嵌入式 Web 应用程序,使用可选择容器(Tomcat,Jetty 或 Undertow)
3) 一流的外部化配置支持
4) 方便的 ApplicationContext
初始化程序,包括对合理的日志记录默认值的支持
总之, 就是 spring-boot
模块对应用程序的初始化、配置、启动以及提供可选 WEB 运行容器有着很好的支持。
3.2 spring-boot-starters(起步依赖)
Spring Boot Starters
是 Spring Boot Framework
的主要关键功能或组件之一。Spring Boot Starter
的主要职责是将一组常见或相关的依赖项组合为单个依赖项,从而可以自动化导入全部依赖。
例如,我们想用 Tomcat WebServer
开发一个 Spring WebApplication
。然后,我们需要在Maven
的pom.xml
文件或 Gradle
的build.gradle
文件中添加以下最小 jar
依赖项
- Spring core Jar file(spring-core-xx.jar)
- Spring Web Jar file(spring-web-xx.jar)
- Spring Web MVC Jar file(spring-webmvc-xx.jar)
- Servlet Jar file(servlet-xx.jar)
如果还需要添加一些数据库内容,则需要添加与数据库相关的 jar,例如 Spring JDBC jar
文件,Spring ORM jar
文件,Spring Transaction Jar
文件等。
- Spring JDBC Jar file(spring-jdbc-xx.jar)
- Spring ORM Jar file(spring-orm-xx.jar)
- Spring Transaction Jar file(spring-transaction-xx.jar)
最后,我们需要在构建文件中定义很多依赖项,对于开发人员而言,这是非常繁琐且繁琐的任务,而且它还会增加我们的构建文件大小。有什么解决方案可以避免在构建文件中出现如此多的依赖项定义?解决方案是 Spring Boot Starter
组件。Spring Boot Starter
组件将所有相关的 jar
组合到单个 jar
文件中,因此我们只需要将 jar
文件依赖项添加到我们的构建文件中。无需将上述这么多个 jar 文件添加到我们的构建文件中,我们在 Spring boot
中利用 Spring Boot Starter
特性,需要添加一个并且仅添加一个 jar 文件:spring-boot-starter-web
jar 文件就可以了。当我们将 spring-boot-starter-web
jar 文件依赖项添加到我们的构建文件中时,Spring Boot Framework
将自动下载所有必需的 jar
并添加到我们的项目类路径中,如下图所示。
总结下来,sping-boot-staters 的主要优点就是:
- 减少了许多依赖的定义,简化了项目构建的依赖
- 简化了项目构建的依赖关系
3.3 spring-boot-autoconfigure(自动配置)
在没有 Spring Boot
出来之前,比如使用 Spring MVC
框架开发应用需要大量配置,XML 各种配置,注解满天飞(我没亲身经历过,不过特意去查了下,确实),到了 Spring boot
这里如何解决,那就是 spring-boot-autoconfigurator
模块了。它主要职责是减少 Spring 配置。如果我们在 Spring Boot
中开发 Spring 应用程序,那么我们就不需要定义单个 XML 配置,而几乎不需要或只需很少的 Annotation
(注解) 配置。Spring Boot AutoConfigurator
组件将负责提供这些信息。
举个例子,如果我们在项目构建文件中使用 ”spring-boot-starter-web” jar 文件,则 Spring Boot AutoConfigurator
将自动解析视图 (views),视图解析器(view resolvers) 等。而且,Spring Boot
减少了注释配置的定义。如果我们在类级别使用 @SpringBootApplication
注释,那么 Spring Boot AutoConfigurator
将自动
将所有必需的注释添加到 Java 类 ByteCode 中。
如果我们阅读 Spring Boot Documentation
,我们可以为@SpringBootApplication
找到以下定义。
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters={@ComponentScan.Filter(type=CUSTOM,classes=TypeExcludeFilter.class),})
@ConfigurationPropertiesScan
public @interface SpringBootApplication
也就是说,@SpringBootApplication = @Configuration + @ComponentScan + @EnableAutoConfiration
。
简而言之,
-
Spring Boot Starter
减少了构建的依赖性,而Spring Boot AutoConfigurator
减少了 Spring 配置。 - 正如我们所讨论的,
Spring Boot Starter
依赖于Spring Boot AutoConfigurator
,Spring Boot Starter
自动触发Spring Boot AutoConfigurator
。
3.4 Spring Boot CLI(命令行界面)
Spring Boot CLI
(命令行界面)是一种 Spring Boot
软件,用于从命令提示符下运行和测试 Spring Boot
应用程序。Spring 命令行应用程序可以编译并运行 Groovy
源代码 (采用 ”spring” 命令),这使得编写绝对的最少代码以使应用程序运行变得非常容易。Spring CLI
还可以监视文件,并在文件更改时自动重新编译并重新启动。
spring 命令行示例:
spring run HelloWorld.groovy
具体的 Spring Boot CLI 工具怎么安装和使用,下面我们会具体讨论。
3.5 spring-boot-actuator(执行器)
Spring Boot Actuator
有很多功能,但是主要的功能就是:
- 对应用程序进行健康检查 (health check-up),审核(auditing),指标收集(metrics gathering) 和监控,所有这些功能都可以通过 JMX 或 HTTP 端点进行访问。
-
Spring Boot Actuator
提供了执行器端点所需的基础架构。它包含对执行器端点的注释支持。开箱即用。 - 此模块提供许多端点,包括
HealthEndpoint
,EnvironmentEndpoint
,BeansEndpoint
等。
当我们使用 CLI 运行 Spring Boot Web
应用程序时,Spring Boot Actuator
会自动提供主机名 ”localhost” 和默认端口号 ”8080″。我们可以使用 ”http://localhost:8080 /” 端点访问此应用程序。但是我们实际上使用 HTTP 请求方法(例如 GET 和 POST)来使用 Spring Boot Actuator
表示管理端点。后面我们再来详细了解 Actuator 吧。
???? 上面大概知道了核心模块都能干些啥,不过具体细节的,我们在实际工程中再来体会,除了上述核心模块,另外有 Spring Initilizr Web 工具来快速配置生成一个 Spring Boot 项目。
4 Spring Boot 减少依赖、配置的内部原理
了解 Spring boot
是如何减少依赖和配置的原理,这是有一定必要的。了解 Spring Boot
如何减少构建的依赖关系,Spring Configuration
等,Spring Boot
是如何在后台运行的。
如果熟悉 Groovy 编程语言的话,那么你会了解大多数内容。在 Groovy
中,我们不需要添加一些导入,也不需要在 Groovy 项目中添加一些依赖项。当我们使用 Groovy Compiler(groovyc)
编译 Groovy 脚本时,它将自动添加所有默认导入语句,然后对其进行编译。同样,Groovy
编程语言包含一个 JAR 依赖关系解析器,用于解析所有必需的 jar 文件并将其添加到 Groovy Project
类路径。Spring Boot
在内部使用 Groovy 添加一些默认值,例如 Default import
语句,Application main()
方法等。当我们从 CLI 命令提示符运行 Groovy 脚本时,它使用此 main()
方法运行Spring Boot Application
。
Grape
是嵌入式依赖关系解决方案引擎。Grape 是嵌入 Groovy 的 JAR 依赖管理器。Grape 让我们快速将 maven
信息库依赖项添加到我们的项目类路径中,以减少构建文件的定义。Spring Boot
框架编程模型主要是受 Groovy 编程模型启发的。Spring Boot
框架在内部取决于这两个主要组件:Groovy
和Grape
。
具体地可以详细了解 Grape JAR 依赖项管理器。
5 Spring Boot 开发环境
好了,上面说了这么多,不容易,就是为了做个铺垫,让我们知道 Spring boot
有哪些核心地东西,都是干啥用的,接下来就正式进入实践环节了,我们从开发环境入手。
从 Spring boot
官方提供的系统需求来看(Spring Boot 2.2.0):
-
构建工具
- Marven: 3.3+
- Gradle:5.x(也支持 4.10,但已弃用)
-
Servlet 容器 (可以将
Spring Boot
应用程序部署到任何Servlet 3.1+
兼容的容器中)- Tomcat 9.0:Servlet4.0
- Jetty 9.4: Servlet3.1
- Undertow 2.0: Servlet4.0
5.1 安装相关软件
我们选定相关软件版本:
- Open JDK 12: https://jdk.java.net/java-se-… (JDK 也可以通过安装好 STS 后,在 STS 里面下载安装)
- Open JDK 8: https://jdk.java.net/java-se-… (注意 Window 版本没有 64 位软件包)
- Marven 3.6.2: https://maven.apache.org/down… (在 STS 安装好后,已经内部自带了一个 Marven 版本,也可以不用另外安装 Marven)
- STS 4.13.0: https://spring.io/tools3/sts/all 或 https://spring.io/tools
- Spring Boot 2.2.0: 可以像使用任何标准 Java 库一样使用
Spring Boot
。因此,在类路径中包含相应的spring-boot-*.jar
文件即可。
???? 目前为止已经是 JDK13 了,这里指的是 OpenJDK,Oracle 已经在 2019 年 4 月 16 日更改了 Oracle JDK 许可证 (从 Java11 开始);另外 Open JDK 应用到生产环境已经经过验证了的,没有问题。Spring Boot 2.2.0.RELEASE 需要 Java 8 版本,并且与 Java 13(包括) 兼容;另外我们可以使用其他 IDE,例如 IntelliJ IDEA,NetBeans 或 Eclipse,同样,也可以使用其他构建工具,例如 Gradle。
- JDK 安装:解压后就可以了,然后配置下环境变量(自行搞定);
- Marven 安装:解压后就可以了,然后需要在 STS 中指定该安装版本,后面会介绍;
- STS 安装:解压后就可以了。
???? 安装 JDK 的方式可以有多种,如在类 Linux 平台中可以通过安装管理工具直接从远程镜像源拉取安装;
5.2 配置 STS
配置 JDK:
安装好 STS 后,打开软件 –>Window
–>Preferences
–>Java
–>Installed JREs
:
配置 Marven:
Marven 在安装好 STS 后,已经默认内部安装了,不过想要另外指定 Marven 版本也是可以的,打开 STS–>Window
–>Preferences
–>Marven
–>Installations
–>Add
添加:
6 总结
这一篇我们开始从内部了解 Spring boot
,从它的几个核心模块讲起,知道了Spring boot
是如何减少组件依赖和简化繁杂的配置的,以及讲述了 Spring boot
减少组件依赖和简化繁杂配置的内部原理,最后开始进入 Spring boot
实践,完成了 Spring boot
的开发环境搭建。至此,我们开始慢慢走进Spring boot
。加油!
7 参考资料
- https://dzone.com/articles/gr…
- https://stackoverflow.com/que…
- https://www.ibm.com/developer…
- https://www.educba.com/groovy…
- https://stackoverflow.com/que…
- https://www.zoltanraffai.com/…
- https://docs.spring.io/spring…
- https://docs.spring.io/spring…
- https://github.com/spring-pro…
- http://docs.groovy-lang.org/l…
- https://juejin.im/post/593386…
- https://github.com/spring-pro…
- https://docs.spring.io/spring…
- https://www.callicoder.com/sp…
- https://www.journaldev.com/79…
- https://www.javatpoint.com/sp…
- https://blog.51cto.com/luecsc…
- https://content.pivotal.io/sp…
- https://docs.spring.io/spring…
- https://maven.apache.org/down…
本文属于原创,转载注明出处,欢迎关注 CSDNfreeape 或微信小程序 小白 AI 博客
微信公众号 小白 AI
或者网站 https://xiaobaiai.net