本文属于原创,转载注明出处,欢迎关注微信小程序小白AI博客
和微信公众号别打名名
或者网站 https://xiaobaiai.net 或者我的CSDN http://blog.csdn.net/freeape
1 前言
2 名词术语
3 Spring Boot核心模块
3.1 spring-boot(主模块)
3.2 spring-boot-starters(起步依赖)
3.3 spring-boot-autoconfigure(自动配置)
3.4 Spring Boot CLI(命令行界面)
3.5 spring-boot-actuator(执行器)
4 Spring Boot减少依赖、配置的内部原理
5 Spring Boot开发环境
5.1 安装相关软件
5.2 配置STS
6 总结
7 参考资料
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@EnableAutoConfigurationpublic 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),})@ConfigurationPropertiesScanpublic @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
❝
各平台的OpenJDK都可以从这里下载 https://adoptopenjdk.net/installation.html?variant=openjdk8&jvmVariant=hotspot
❞
5.1 安装相关软件
我们选定相关软件版本:
Open JDK 12: https://jdk.java.net/java-se-ri/12 (JDK也可以通过安装好STS后,在STS里面下载安装)
Open JDK 8: https://jdk.java.net/java-se-ri/8 (注意Window版本没有64位软件包)
Marven 3.6.2: https://maven.apache.org/download.cgi (在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://www.ibm.com/developerworks/cn/education/java/j-groovy/j-groovy.html
https://stackoverflow.com/questions/44172261/how-spring-boot-application-works-internally
https://www.zoltanraffai.com/blog/how-does-spring-work-internally/
https://docs.spring.io/spring-boot/docs/current/api/allclasses-noframe.html
http://docs.groovy-lang.org/latest/html/documentation/grape.html
https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/SpringApplication.html
https://content.pivotal.io/springone-platform-2017/from-zero-to-hero-with-spring-boot-brian-clozel
文章难免疏漏,而公众号上每篇文章只能修改几个字,所以我会在我的小程序小白AI博客
上也发一遍,任何的错误,我会在及时修改,欢迎随时交流。
❝
关注我的公众号,获取最新学习分享:
❞
本文分享自微信公众号 - 别打名名(biedamingming)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。