1.2. Spring Boot简介

在 Java 后端框架繁荣的今天,Spring 框架无疑是最最火热,也是必不可少的开源框架,更是稳坐 Java 后端框架的龙头老大。

用过 Spring 框架的都知道 Spring 能流行是因为它的两把利器:IoC 和 AOP,IoC 可以帮助我们管理对象的依赖关系,极大减少对象的耦合性,而 AOP 的切面编程功能可以更方面的使用动态代理来实现各种动态方法功能(如事务、缓存、日志等)。

而要集成 Spring 框架,必须要用到 XML 配置文件,或者注解式的 Java 代码配置。无论是使用 XML 或者代码配置方式,都需要对相关组件的配置有足够的了解,然后再编写大量冗长的配置代码。

然而又有多少开发人员能精通这些配置呢?如果我们只提供一些配置参数让框架能自动配置这些组件,那是不是会更加容易呢。

基于简化 Spring 快速上手为目的,Spring Boot 框架诞生了!当然,Spring Boot之前,还有一个基于代码生成的叫做 Spring Roo 的开发工具。正如 Spring Boot 宣称的那样“如果(骨架)代码可以生成,那就不要生成代码,使用配置、自动装配方式,来的更优雅”。所以,Spring Roo 在出生后不久就被抛弃了,现在最火热的当然是,也必须是 Spring Boot 框架(技术栈)。

Spring Roo is an easy-to-use development tool for quickly building web applications in the Java programming language, which can be used as an standalone application or as an Eclipse or STS plugin. It allows you to build high-quality, high-performance, lock-in-free enterprise applications in just minutes.

1.2.1 Spring Boot概述

Spring Boot 是 Spring 开源组织下的一个子项目,也是 Spring 组件一站式解决方案,主要是为了简化使用 Spring 框架的难度,简化繁重的配置。Spring Boot 提供了各种组件的启动器(starters),开发者只要能配置好对应组件参数,Spring Boot 就会自动配置,让开发者能快速搭建依赖于 Spring 组件的 Java 项目。Spring Boot 不但能创建传统的 war 包应用,还能创建独立的不依赖于任何外部容器(如:Tomcat)的独立应用,使用 java -jar 命令就能启动。同时,Spring Boot 也提供了一个命令行工具来执行 Spring 的脚本。Spring Boot 的设计目标是:

  • 为 Spring 应用开发提供一个更快、更容易上手的入门体验;
  • 提供一系列在大型项目中经常用到的公共的非功能性特性,如:内嵌入服务器、安全、度量指标、健康检测、外部化配置;
  • 零代码配置生成及零 XML 配置;

1.2.2 Spring Boot能做什么

  • 独立运行
    • Spring Boo t内嵌了各种 Servlet 容器,Tomcat、Jetty 等,现在不再需要打成 war 包部署到容器中,Spring Boot 只要打成一个可执行的 jar 包就能独立运行,所有的依赖包都在一个 jar 包内。
    • 对一个程序员来说,回归到入口 main 函数的感觉,简直是不能再棒了。
      package com.example.demo;
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      @SpringBootApplication
      public class DemoApplication {
      	public static void main(String[] args) {
      		SpringApplication.run(DemoApplication.class, args);
      	}
      }
      
  • 简化 Maven 配置
    • 例如只要依赖 spring-boot-starter-web 启动器,它包含所有 Web 开发所有的依赖,就能拥有 Spring Web 的能力,极大简少了 maven 对依赖的配置。
  • 自动配置
    • Spring Boot 能根据当前类路径下的类或者 jar 包里面来的类来自动配置 Spring Bean,如添加一个 spring-boot-starter-web 启动器就能拥有 Web 的功能,无需其他配置。也可以在配置文件中添加相关配置来自定义装配,这个后面的课程会讲到,请关注后续内容。
  • 无代码生成和XML配置
    • Spring Boot 配置过程中无代码生成,也无需XML配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是 Spring 4+ 的核心功能之一。
  • 应用监控
    • Spring Boot 提供一系列端点可以监控服务及应用,能对 Spring 应用做健康检测。

1.2.3 Spring Boot 2 的新特性

Spring Boot 依赖于 Spring,而 Spring Cloud 又依赖于 Spring Boot,因此 Spring Boot 2.0 的发布正式整合了 Spring5.0 的很多特性,同样后面 Spring Cloud 最新版本的发布也整合了最新的 Spring Boot 2.0 内容。

1.2.3.1 基于 Java 8,支持 Java 9

也就是说 Spring Boot 2.0 的最低版本要求为 JDK8,据了解国内大部分的互联网公司系统都还跑在JDK1.6/7 上,因此想要升级到 Spring Boot 2.0 的同学们注意啦。同时支持了 Java9,也仅仅是支持而已。

1.2.3.2 响应式编程

使用 Spring WebFlux/WebFlux.fn 提供响应式 Web 编程支持, Webflux 是一个全新的非堵塞的函数式 Reactive Web 框架,可以用来构建异步的、非堵塞的、事件驱动的服务,在伸缩性方面表现非常好,此功能来源于 Spring 5.0。

Spring Boot 2.0 也提供对响应式编程的自动化配置,如:Reactive Spring Data、Reactive Spring Security 等。

1.2.3.3 HTTP/2 支持

在 Tomcat, Undertow 和 Jetty 中均已支持 HTTP/2。

1.2.3.4 对 Kotlin 支持

引入对 Kotlin 1.2.x 的支持,并提供了一个 runApplication 函数,让你通过惯用的 Kotlin 来运行 Spring Boot 应用程序。

1.2.3.5 全新的执行器架构

全新的执行器架构,支持 Spring MVC, WebFlux 和 Jersey。

1.2.3.6 支持 Quartz

Spring Boot1.0 并没有提供对 Quartz 的支持,之前出现了各种集成方案,Spring Boot 2.0 给出了最简单的集成方式。

1.2.3.7 Security

大大的简化了安全自动配置。

1.2.3.8 Metrics

Metrics 方面,Spring Boot 2 引入了 Micrometer,来统一metrics的规范,使得开发人员更好的理解和使用 metrics 的模块,而不需要关心对接的具体存储是什么。

1.2.3.9 监控方面

Spring Boot 2 增强了对 Micrometer 的集成。RabbitMQ、JVM 线程和垃圾收集指标会自动进行 instrument 监控,异步控制器(controller)也会自动添加到监控里。通过集成,还可以对 InfluxDB 服务器进行监控。

1.2.3.10 数据方面

  • db 方面,默认引入了HikariCP,替代了之前的 tomcat-pool 作为底层的数据库连接池, 对比于tomcat-pool, HikariCP拥有更好的性能,总而言之就是提高了db 的访问速度;
  • JOOQ 的支持;
  • Redis 方面, 默认引入了 Lettuce, 替代了之前的 jedis 作为底层的 Redis 链接方式;
  • MongoDB\Hibernate 优化。

1.2.3.11 Thymeleaf 3

Spring Boot 2 支持了 Thymeleaf 3,Thymeleaf 3 相对于 Thymeleaf 2 性能提升可不是一点点,因为 2.0 的性能确实不咋地,同时也使用了新的页面解析系统。

1.2.3.12 OAuth 2.0

同时也加入了对于 OAuth 2.0 的支持, 使得开发人员更加友好的使用 spring-security 来完成权限模块的开发。

1.2.3.13 依赖组件的更新

  • Jetty 9.4
  • Tomcat 8.5
  • Flyway 5
  • Hibernate 5.2
  • Gradle 3.4
  • Thymeleaf 3.0

注意:最后还有一个小彩蛋,Spring Boot 2.0 支持了动态 gif 的启动 logo 打印,这纯粹是为了好玩。

下一节:学习 Spring Boot 必须得了解它的核心模块,以对其形成整体的印象。和 Spring 框架一样,Spring Boot 也是一个庞大的项目,也是由许多核心子模块组成的。最权威的,也是最直接的是到 Spring Boot 在 github 上的源码,找到其代码模块划分,如下图: