从零开始入门 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:
我们可以配置工程的依赖:
工程介绍
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 注解实现上述功能。
参考
写这些代码也许就一两个小时的事,写一篇大家好接受的文章需要几天的酝酿,如果文章对您有帮助请我喝杯咖啡吧!