转载

Spring Boot从零入门2_核心模块详述和开发环境搭建

本文属于原创,转载注明出处,欢迎关注微信小程序 小白AI博客 微信公众号 小白AI 或者网站 https://xiaobaiai.net

Spring Boot从零入门2_核心模块详述和开发环境搭建

[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(主模块)

:bulb: 下面的操作看不懂或者理解很模糊,先别慌,后面会深入讲解的。因为我现在自己也没彻底搞懂,怕带歪你们,都是摘取官方文档中汇总而来的。

1) SpringApplication 类:

  • 该模块其中的 SpringApplication 类可用于从 Java main 方法引导和启动Spring应用程序。默认情况下,该class将执行以下步骤来引导应用程序:
    ApplicationContext
    CommandLinePropertySource
    ApplicationContext
    CommandLineRunner
    

在大多数情况下,可以直接从主方法中调用静态 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 StartersSpring Boot Framework 的主要关键功能或组件之一。 Spring Boot Starter 的主要职责是将一组常见或相关的依赖项组合为单个依赖项,从而可以自动化导入全部依赖。

例如,我们想用 Tomcat WebServer 开发一个 Spring WebApplication 。然后,我们需要在 Mavenpom.xml 文件或 Gradlebuild.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 并添加到我们的项目类路径中,如下图所示。

Spring Boot从零入门2_核心模块详述和开发环境搭建

总结下来,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从零入门2_核心模块详述和开发环境搭建

简而言之,

  • Spring Boot Starter 减少了构建的依赖性,而 Spring Boot AutoConfigurator 减少了Spring配置。
  • 正如我们所讨论的, Spring Boot Starter 依赖于 Spring Boot AutoConfiguratorSpring 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 提供了执行器端点所需的基础架构。它包含对执行器端点的注释支持。开箱即用。
  • 此模块提供许多端点,包括 HealthEndpointEnvironmentEndpointBeansEndpoint 等。

当我们使用CLI运行 Spring Boot Web 应用程序时, Spring Boot Actuator 会自动提供主机名"localhost"和默认端口号"8080"。我们可以使用"http://localhost:8080 /"端点访问此应用程序。但是我们实际上使用HTTP请求方法(例如GET和POST)来使用 Spring Boot Actuator 表示管理端点。后面我们再来详细了解Actuator吧。

:bulb:上面大概知道了核心模块都能干些啥,不过具体细节的,我们在实际工程中再来体会,除了上述核心模块,另外有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 框架在内部取决于这两个主要组件: GroovyGrape

具体地可以详细了解 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-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 文件即可。

:bulb:目前为止已经是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 安装:解压后就可以了。

:bulb:安装JDK的方式可以有多种,如在类Linux平台中可以通过安装管理工具直接从远程镜像源拉取安装;

5.2 配置STS

配置JDK:

安装好STS后,打开软件--> Window --> Preferences --> Java --> Installed JREs :

Spring Boot从零入门2_核心模块详述和开发环境搭建

配置Marven:

Marven在安装好STS后,已经默认内部安装了,不过想要另外指定Marven版本也是可以的,打开STS--> Window --> Preferences --> Marven --> Installations --> Add 添加:

Spring Boot从零入门2_核心模块详述和开发环境搭建

6 总结

这一篇我们开始从内部了解 Spring boot ,从它的几个核心模块讲起,知道了 Spring boot 是如何减少组件依赖和简化繁杂的配置的,以及讲述了 Spring boot 减少组件依赖和简化繁杂配置的内部原理,最后开始进入 Spring boot 实践,完成了 Spring boot 的开发环境搭建。至此,我们开始慢慢走进 Spring boot 。加油!

7 参考资料

  • https://dzone.com/articles/gradle-vs-maven
  • https://stackoverflow.com/questions/39247487/why-spring-boot-application-class-needs-to-have-configuration-annotation
  • https://www.ibm.com/developerworks/cn/education/java/j-groovy/j-groovy.html
  • https://www.educba.com/groovy-vs-java/
  • 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
  • https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/SpringBootApplication.html
  • https://github.com/spring-projects/spring-boot
  • http://docs.groovy-lang.org/latest/html/documentation/grape.html
  • https://juejin.im/post/593386ca2f301e00584f8036
  • https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-cli/samples
  • https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/SpringApplication.html
  • https://www.callicoder.com/spring-boot-actuator/
  • https://www.journaldev.com/7969/spring-boot-tutorial
  • https://www.javatpoint.com/spring-boot-actuator
  • https://blog.51cto.com/luecsc/1964056
  • https://content.pivotal.io/springone-platform-2017/from-zero-to-hero-with-spring-boot-brian-clozel
  • https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-started-system-requirements
  • https://maven.apache.org/download.cgi

本文属于原创,转载注明出处,欢迎关注CSDN freeape 或微信小程序 小白AI博客 微信公众号 小白AI 或者网站 xiaobaiai.net

原文  https://juejin.im/post/5db8168a518825649b0fb8b3
正文到此结束
Loading...