从零开始入门 Spring Boot 框架

前言

近期开始筹备小程序开发运营平台,之前使用 Egg.js 构建过后台管理系统,但是在市场推广过程中发现会使用 Node.js 服务的人员真的很少,前端人员不太懂数据库库表设计,传统后端对于 Node.js 服务又不太熟悉,所以实际场景中对于团队人员配置很尴尬。基于公司产品大多数是 Java 技术体系的考虑,所以决定在新项目中采用 Java 社区的框架去构建。JavaEE 常见的框架组合有 SSH(Structs + Spring + Hibernate)和 SSM(Spring + SpringMVC + MyBatis),一般学习顺序是 Servlet -> JSP -> Spring -> 组合框架,传统的 Spring 项目开发上手难度较大,所以项目计划采用 Spring Boot 框架。

为什么要学习 Spring Boot?

Spring Framework 5

Spring Framework 5 是一个重要的版本,距离 Spring Framework 4 差不多四年。在此期间,大多数增强都是在 Spring Boot 项目中完成的。Spring5 发行版中的一些特性:

  • 基准升级

要构建和运行 Spring5 应用程序,你至少需要 J2EE7 和 JDK8。以前的 JDK 和 JavaEE 版本不再支持。 JavaEE7 包含:Servlet 3.1、JMS 2.0、JPA 2.1、JAX-RS 2.0、Bean Validation 1.1。 各种服务器最低支持版本:Tomcat 8.5+、Jetty 9.4+、WildFly 10+、Netty 4.1+、Undertow 1.4+。

  • 兼容 JDK9 运行时

Spring5 发行版与 JDK9 发行日期非常接近。目标是让 Spring Framework5 在 JDK9 的 GA 之后正确运行。 Spring5 版本的候选版本已经在 classpath 和 modulepath 上支持 Java9 了。

  • 使用 JDK8 特性

在 Spring4.3 之前,JDK 基准版本是 6。所以 Spring4 必须支持 Java6,7 和 8,为了保持向后兼容性, Spring 框架没有适应 Java8 带来的许多新特性,比如 lambda 表达式。Spring5 的基准版本为 8,因此它使用了 Java8 和 9 的许多新特性。例如: Spring 接口中的默认方法 基于 Java8 反射增强的内部代码改进 在框架代码中使用函数式编程 - lambda 表达式 和 stream 流。

  • 响应式编程支持

响应式编程是 Spring Framework 5.0 最重要的特性之一。响应式编程提供了另一种编程风格,专注于构建对事件做出响应的应用程序。 Spring Framework 5.0 包含响应流(定义响应性 API 的语言中立尝试)和 Reactor(由 Spring Pivotal 团队提供的 Reactive Stream 的 Java 实现),以用于其自身的用途以及其许多核心 API。

Spring Web Reactive 在 spring-webmvc 模块中现有的(而且很流行)Spring Web MVC 旁边的新的 spring-web-reactive 模块中。 请注意,在 Spring5 中,传统的 SpringMVC 支持 Servlet3.1 上运行,或者支持 JavaEE7 的服务器。

  • 函数式 web 框架

除了响应式功能之外,Spring5 还提供了一个函数式 Web 框架。它提供了使用函数式编程风格来定义端点的特性。 该框架引入了两个基本组件:HandlerFunction 和 RouterFunction。HandlerFunction 表示处理接收到的请求并生成响应的函数。 RouterFunction 替代了 @RequestMapping 注解。它用于将接收到的请求路由到处理函数。

  • Kotlin 支持

Kotlin 是一种静态类型的 JVM 语言,它让代码具有表现力,简洁性和可读性。 Spring5.0 对 Kotlin 有很好的支持。

Spring Boot 2

Spring 框架是 Java EE 中最常用的框架,主要包含的内容有:

  • Spring Boot:Spring Boot 旨在尽可能快地启动和运行,只需最少的 Spring 前端配置。 Spring Boot 对构建生产就绪应用程序持批评态度。
  • Spring Cloud:Spring Cloud 直接基于 Spring Boot 的创新企业 Java 方法,通过实施经过验证的模式,为您的微服务带来弹性,可靠性和协调,从而简化了分布式微服务式架构。
  • Spring Cloud Data Flow:将企业连接到任何东西 - 移动设备,传感器,可穿戴设备,汽车等。Spring Cloud Data Flow 为创建可组合数据微服务提供统一服务,这些服务可解决基于流和基于 ETL 的数据处理模式。

Spring Boot 2.0 基于 Spring 5 Framework ,提供了异步非阻塞 IO 的响应式 Stream 、非堵塞的函数式 Reactive Web 框架 Spring WebFlux。

Spring Boot 优点

  • 使用 Spring 项目引导页面可以在几秒构建一个项目
  • 方便对外输出各种形式的服务,如 RESTAPI、WebSocket、Web、Streaming、Tasks
  • 非常简洁的安全策略集成
  • 支持关系数据库和非关系数据库
  • 支持运行期内嵌容器,如 Tomcat、Jetty、Undertow
  • 强大的开发包,支持热启动
  • 自动管理依赖
  • 自带应用监控
  • 支持各种 IDE,如 IntelliJ IDEA 、NetBeans、Eclipse 等

Spring Boot 三大特性:

  • 组件自动装配:Web MVC、Web Flux、JDBC 等
  • 嵌入式 Web 容器:Tomcat、Jetty 以及 Undertow
  • 生产准备特性:指标、健康检查、外部化配置等

社区资源

国际惯例 Hello, world 工程

创建工程

  • 在线创建工程模块:通过 start.spring.io 网站 SpringInitializr 创建:https://start.spring.io/
  • 通过 IDEA 开发工程创建:IDEA 企业版可以通过 spring Initializr 创建,社区版可以下载 Spring Assistant 插件。

这里我下载的是 IDEA 社区版,通过下载 Spring Assistant 插件实现工程创建,下面是创建一个基本的 Web 工程:

我们可以选择 Maven 或者 Gradle 管理我们的依赖,这里选择 Gradle: 选择 Gradle 工程

我们可以配置工程的依赖: 选择 Web 工程

工程介绍

Spring Boot Gradle 工程基本结构为:

┌─gradle
│  └─wrapper
├─src
│  ├─main
|  |  ├─java
|  |  └─resources
│  └─test
├─build.gradle
├─gradlew
├─gradlew.bat
└─settings.gradle

build.gradle 文件中的 dependencies 中添加 springboot 框架的 web 依赖:

implementation 'org.springframework.boot:spring-boot-starter-web'

典型的 build.gradle 脚本如下:

apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

buildscript {
	repositories {
		jcenter()
		mavenCentral()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:2.1.3.RELEASE")
	}
}

repositories {
	jcenter()
	mavenCentral()
}

bootJar {
	baseName = 'helloworld'
	version =  '0.1.0'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
	implementation "org.springframework.boot:spring-boot-starter-web"
}

工程整体上和 Android 工程类似,同样也可以采用多 Module 的构建模式,具体多配置可以参考 Gradle 官方文档

创建自定义 Controller 类

package cn.com.agree.helloworld;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@EnableAutoConfiguration
class HelloworldController {
    @ResponseBody
    @RequestMapping("/")
    public String home() {
        return "Hello, World";
    }
}

在 Application 类处右键-执行 run 即可,此时不需要管存不存在 web.xml, 也不需要创建 application.properties 文件。打开 http://localhost:8080/ 会出现 Hello, World

组件自动装配:

  • 激活:@EnableAutoConfiguration
  • 配置:/META-INF/spring.factories
  • 实现:XXXAutoConfiguration

其实我们也可以在 Application 类填加 @Controller、@RequestMapping 注解实现上述功能。

参考

写这些代码也许就一两个小时的事,写一篇大家好接受的文章需要几天的酝酿,如果文章对您有帮助请我喝杯咖啡吧!