北京时间 3 月 1 日,经过漫长的等待之后,Spring Boot 2.0 正式发布,目前已在 GitHub 上发布了 v2.0.0.RELEASE 版本的下载地址,读者可以点击链接去下载。不过由于同步至 Maven 仓库出错,使用Maven方式来使用Spring Boot 2.0暂时会有一些问题。
作为 Spring 生态中的重要开源项目,Spring Boot 旨在简化创建产品级的 Spring 应用和服务。用户只需要”run”就能创建一个独立的,产品级别的 Spring 应用。自去年 5 月 16 日发布 M1 版本,再到后来的 RC 版本,再到现在的正式版,Spring Boot 2.0也已有近 1 年时间.
那么在Spring Boot 2.0究竟引入了哪些新特性呢,让我们一探究竟。此次版本主要包含以下内容:支持 Java 9、HTTP/2、基于 Spring 5 构建、强力集成 GSON 等等。
Spring与Spring Boot
2004 年 3 月,Spring 的第一个版本以及其创始人 Rod Johnson 的经典力作《Expert one-on-one J2EE Development without EJB》发布,打破了当时 Java 开发领域的传统思考模式,企业级应用开始走向“轻量化”发展的步伐。
最初的 Spring Framework 1.0 并不像如今的 Spring 那么复杂,但是在该版本中已经包含了 Spring 中最为核心的两大要素:依赖注入(IOC)和面向切面编程(AOP),这两个功能是 Spring 区别于其他优秀框架,并在企业级应用中建立核心地位的关键所在。
很多开发者在初涉 Java 应用的时候很可能会觉得这两个功能的意义并不大,因为不用它们我们依然可以很好的实现业务功能,事实也确实如此,但是随着业务的迭代和开发的深入,复杂多变的需求开始慢慢侵蚀原本“完美”的架构,开发与测试的难度逐步增大,往往在这个时候,我们才体会到了 Spring 的价值。
所以,即便在 Spring 的最初版本中也封装了诸多偏业务型的功能封装,如:邮件发送、事务管理等,但我们要知道真正让企业级应用离不开 Spring 的理由并不是这些与业务直接相关的功能,而是上面所提及的与业务实现毫不相关的两大核心。
由于在初期版本中 Spring 对很多功能性封装并没有今天的 Spring 那么强大,所以很长一段时间,我们都采用了 Spring 做工程管理来整合其他更优秀的功能型框架来完成系统开发的架构模式,比如曾经风靡一时的 Spring Struts Hibernate 架构,相信可以勾起一代人的回忆。
不过随着Spring 2.0版本的发布,Spring开始支持 Annotation 的优雅配置方式以及更为灵活的 Java 类的配置,这使得 Spring 在管理 Bean 的配置方式上变得更为多样化。
在之后的 Spring 4.x 中除了提供对 Java 8 的支持以及对依赖注入的增强之外,有很长一段时间,Spring 社区对其核心框架的创新就没有那么出彩了,社区更多的精力开始将矛头转向了曾经那些亲密无间的小伙伴们。于是,我们在 Spring 社区发现多出了各种功能性的兄弟项目,比如:简化数据访问的 Spring Data、提供批处理能力的 Spring Batch、用于保护应用安全的 Spring Security 等。
虽然这些框架从个体来说都有一定的优势和先进的理念,但是对于很多既有系统来说,在功能性框架上很难做出改变,对于这些新生的轮子项目就很难得到应用,除了一些从零开始的系统会做一些尝试之外,鉴于学习成本和踩坑风险的考虑,中小团队对这些新项目很少有愿意去尝试的。所以,一些老牌的功能性框架除非有严重的性能或安全问题出现,不然很难被这些轮子所替代。
不过,Spring社区在2014 年 4 月 1 日迎来了Spring Boot,Spring Boot 发布了第一个正式版本。该项目旨在帮助开发者更容易地创建基于 Spring 的应用程序和服务,使得现有的和新的 Spring 开发者能够最快速地获得所需要的 Spring 功能。一直到今天发布 2.x 版本,共经历了近 4 年的发展,Spring Boot 已经是一个拥有了 21000 多 Star,15000 多次 Commits,贡献者超过 400 多名的超热门开源项目。
使用Spring Boot进行开发可以大大的节约开发时间,提高开发效率,它具有以下的一些特点:
- 简化依赖管理:在 Spring Boot 中提供了一系列的 Starter POMs,将各种功能性模块进行了划分与封装,让我们可以更容易的引入和使用,有效的避免了用户在构建传统 Spring应用时维护大量依赖关系而引发的 JAR 冲突等问题。
- 自动化配置:Spring Boot 为每一个 Starter 都提供了自动化的 Java 配置类,用来替代我们传统 Spring 应用在 XML 中繁琐且并不太变化的 Bean 配置;同时借助一系列的条件注解修饰,使得我们也能轻松的替换这些自动化配置的 Bean 来进行扩展。
- 嵌入式容器:除了代码组织上的优化之外,Spring Boot 中支持的嵌入式容器也是一个极大的亮点,借助这个特性使得 Spring Boot 应用的打包运行变得非常的轻量级。
- 生产级的监控端点:spring-boot-starter-actuator的推出可以说是 Spring Boot 在 Spring 基础上的另一个重要创新,为 Spring 应用的工程化变得更加完美。该模块并不能帮助我们实现任何业务功能,但是却在架构运维层面给予我们更多的支持,通过该模块暴露的 HTTP 接口,我们可以轻松的了解和控制 Spring Boot 应用的运行情况。
可以说,Spring Boot 虽然是基于 Spring 构建的,但是它改变了我们使用 Spring 的姿势,极大得简化了构建企业级应用的各种配置工作,尤其对于很多初学者来说,变得更加容易入门使用。
Spring Boot 2.0新特性
那么,相比如之前的版本Spring Boot 2.0究竟带来了哪些变化呢,从之前的预览版本就可以看出一些端倪。 根据此前的报道,Spring Boot 2.0 最大的变化主要集中在以下几方面:
- Spring Boot 2.0 基于 Spring Framework 5,而整个 Spring Framework 5.0 代码库运行于Java 8 之上。所以,Spring Boot 2.0 要求的 JDK 版本最低也是 Java 8,同时也已正式支持Java 9。
- 与 Spring Boot 1 的差别在于,许多配置属性已被重命名或被删除,因此由 Spring Boot 1 迁移至 Spring Boot 2 需要注意这些配置属性的变化。
- Spring Boot 为 Java 应用程序引入的关键创新是将 Servlet 容器嵌入到一个可执行的 jar 包中,这个 jar 包会打包整个应用。Spring Boot 还提供了 Tomcat、Undertow 和 Jetty 作为可选的方案。
除此之外,在 Spring Boot 2.0 中还有非常多其他令人振奋的新特性,比如:对 HTTP/2 的支持、新增了更灵活的属性绑定 API(、对 Spring Security 整合的简化配置、Gradle 插件的增强、Actuator 模块的优化等等。
在此前发布的RC 版本中,Tomcat、Undertow 和 Jetty 均已支持 HTTP/2(超文本传输协议 2.0),并通过 Conscrypt 库提供对原生 TLS 的支持。这对 Spring Boot 的默认服务器 Tomcat 8.5.x 来说意义重大,如果 libtcnative 库及其依赖项安装在主机操作系统上,则只支持 HTTP/2。
监控方面,Spring Boot 2 增强了对 Micrometer 的集成。RabbitMQ、JVM 线程和垃圾收集指标会自动进行 instrument 监控,异步控制器(controller)也会自动添加到监控里。通过集成,还可以对 InfluxDB 服务器进行监控。
数据方面,Spring Boot 2 让你能够以更加细粒度的方式自定义 Hibernate 属性。另外,还可以暴露 RedisCacheConfiguration,从而控制 RedisCacheManager。Flyway 和 Liquibase 配置也更灵活。
此外,Spring Boot 2 也大大增强了对 GSON 的支持,还包含了改进的 actuator JSON 架构。除此之外,还有很多新功能,读者可以通过以下地址来了解具体的细节:https://www.oschina.net/translate/spring-boot-2-0-migration-guide。
支持 Java 9
Spring Boot 2.0 最值得期待的新功能莫过于对 Java 9 的正式支持,现在要求最低的 JDK 版本是 Java 8,这意味着不可以使用 JDK 7 或更旧的版本运行 Spring Boot 2.0。
值得注意的是,当前版本的 Spring Boot 2.0 虽然支持 Java 9,但是依然还有一些问题。比如:JDK 的代理支持需要使用 AspectJ 1.9,但是该版本还处于 RC 版;还不支持 Apache Cassandra;对于 JSP TLDs 在嵌入式 Tomcat 中也无法支持等情况。对于这些问题的具体处理方法可见:Running Spring Boot on Java 9:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-with-Java-9
Spring Framework
Spring Framework 5.0 现已与 Spring Boot 集成。Spring Framework 5.0 一些有趣的功能:
- 支持 JDK 9 和 Java EE 8 级别的 API(如 Servlet 4.0);
- 与 Reactor 3.1, JUnit 5, 和 Kotlin 语言的全面集成;
- 带来了许多函数式 API 变体 (functional API variants);
- 响应式堆栈 Web 框架 —— Spring WebFlux;
- 完全支持 JUnit 5 Jupiter,因此可以在 JUnit 5 中编写测试;
- 添加对 @Nullable 和 @NotNull 注解的支持,以在编译时而不是运行时处理空指针异常。
Spring Security
Spring Security 并非是 Spring Boot 的正式组成部分,但这里仍值得一提,因为它能与 Spring Framework 5.0 很好地搭配使用。最新的 Spring Security 5 提供了超过 400 多项的功能增强和错误修复。这些新功能主要有:
- 用户可通过 OAuth 2.0 provider 使用现有帐户进行身份验证;
- 与 Spring Framework 5 一样,Spring Security 5 也添加了对响应式编程的支持;
- 以更现代的方式完成对密码的编码。
WebFlux 和 WebFlux.fn 支持
Spring Boot 2.0 为响应式的 Spring Web 框架提供了一个新的启动器 — spring-boot-starter-webflux,spring-boot-starter-webflux 本身包含 WebFlux,再加上 Reactor Netty 作为默认的 Web 引擎(spring-boot-starter-reactor-netty)。
可以使用 @WebFluxTest 来测试响应式的控制器,它为 Spring MVC 提供了类似于 @WebMvcTest 的支持,而且 WebTestClient 是自动配置的。
依赖组件更新
Spring Boot 的 Starter 中整合了不少优秀的第三方组件,这些组件的升级也需要我们做好一定的考量,在这些组件的版本升级过程中,使用上是否有变化等问题。其中,最为关键的几个组件需要我们注意:
Tomcat 升级至 8.5.28 Flyway 升级至 5 Hibernate 升级至 5.2 Thymeleaf 升级至 3
值得注意的是,前段时间爆出的CouchDB漏洞的问题,经查 Spring Boot 2.0 选用的版本为 8.5.28,属于安全版本,所以大家可以放心使用。
Thymeleaf
Spring Boot 2 另一个值得关注的新特性是现已正式支持 Thymeleaf 3,包含了对 Thymeleaf 和 Spring Security Thymeleaf 依赖关系的更新。Thymeleaf 3 中值得关注的变化:
- 由于使用了新的解析系统,Thymeleaf 不再基于 XML;
- 引入新的文本模板模式,它给 Thymeleaf 提供了输出 CSS,Javascript 和纯文本的功能;
- 重写了引擎,性能显著提升。
注:本文在写作过程中,借鉴和参考了如下文章:Spring Boot 2.0正式发布,新特性解读