在上一篇文章中我们已经详解介绍了Spring boot
相关的概念、特性以及周边知识,这一篇文章我们继续深入。我们知道Spring boot
是一个入口,利用Spring Boot
提供的核心组件可以很方便的、快速的
(Boot)创建或配置实际项目,接下来我们来了解Spring boot
都包含了哪些核心模块(组件),以及Spring boot
是如何运转起来的,最后通过一个实际的Hello World
项目来说明。
名词术语 | 释义 |
---|---|
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 |
Spring Boot
主要几个核心模块:
? 下面的操作看不懂或者理解很模糊,先别慌,后面会深入讲解的。因为我现在自己也没彻底搞懂,怕带歪你们,都是摘取官方文档中汇总而来的。
1) SpringApplication 类:
SpringApplication
类可用于从Java main
方法引导和启动Spring应用程序。默认情况下,该class将执行以下步骤来引导应用程序:ApplicationContext
实例(取决于你的类路径)CommandLinePropertySource
以将命令行参数公开为Spring的属性(properties)ApplicationContext
),加载所有单例beanCommandLineRunner
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运行容器有着很好的支持。
Spring Boot Starters
是Spring Boot Framework
的主要关键功能或组件之一。Spring Boot Starter
的主要职责是将一组常见或相关的依赖项组合为单个依赖项,从而可以自动化导入全部依赖。
例如,我们想用Tomcat WebServer
开发一个Spring WebApplication
。然后,我们需要在Maven
的pom.xml
文件或Gradle
的build.gradle
文件中添加以下最小jar
依赖项
如果还需要添加一些数据库内容,则需要添加与数据库相关的jar,例如Spring JDBC jar
文件,Spring ORM jar
文件,Spring Transaction 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的主要优点就是:
在没有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
。Spring Boot CLI
(命令行界面)是一种Spring Boot
软件,用于从命令提示符下运行和测试Spring Boot
应用程序。Spring命令行应用程序可以编译并运行Groovy
源代码(采用"spring"命令),这使得编写绝对的最少代码以使应用程序运行变得非常容易。Spring CLI
还可以监视文件,并在文件更改时自动重新编译并重新启动。
spring 命令行示例:
spring run HelloWorld.groovy
具体的Spring Boot CLI工具怎么安装和使用,下面我们会具体讨论。
Spring Boot Actuator
有很多功能,但是主要的功能就是:
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项目。
了解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依赖项管理器。
好了,上面说了这么多,不容易,就是为了做个铺垫,让我们知道Spring boot
有哪些核心的东西,都是干啥用的,接下来就正式进入实践环节了,我们从开发环境入手。
从Spring boot
官方提供的系统需求来看(Spring Boot 2.2.0):
Spring Boot
应用程序部署到任何Servlet 3.1+
兼容的容器中)我们选定相关软件版本:
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的方式可以有多种,如在类Linux平台中可以通过安装管理工具直接从远程镜像源拉取安装;
配置JDK:
安装好STS后,打开软件-->Window
-->Preferences
-->Java
-->Installed JREs
:
配置Marven:
Marven在安装好STS后,已经默认内部安装了,不过想要另外指定Marven版本也是可以的,打开STS-->Window
-->Preferences
-->Marven
-->Installations
-->Add
添加:
这一篇我们开始从内部了解Spring boot
,从它的几个核心模块讲起,知道了Spring boot
是如何减少组件依赖和简化繁杂的配置的,以及讲述了Spring boot
减少组件依赖和简化繁杂配置的内部原理,最后开始进入Spring boot
实践,完成了Spring boot
的开发环境搭建。至此,我们开始慢慢走进Spring boot
。加油!
本文属于原创,转载注明出处,欢迎关注微信小程序小白AI博客
微信公众号小白AI
或者网站 https://xiaobaiai.net