SpringBoot 2 要不要升级

[TOC]html

前言

在谈SpringBoot 2.x 以前,先来聊点别的:java

首先是Java 语言,这门长期占据编程语言排行榜首位的语言到底有什么魔力? 你们的见解是多种多样的,好比:git

  • 面向对象设计,使用简单,能够很快速的入门;
  • 开源生态作得好,不少可重用的组件,拿来即用;
  • 跨平台,高性能,是作后台开发的首选

还有一种观点颇有意思:这是命好,每当人们以为 Java 不行了的时候,总会有英雄横刀救美..github

其中,主要说的是:web

":最初 Java 开发出来不知道有什么用的时候,发现能够用 Applet 在网页上作动画。 后来企业级软件开发时代 JavaEE 大行其道,开源社区 Spring 桃李满天下。 等到了移动时代,人们以为 Java 要完蛋了,Google 拍马救市,收购并开放了 Android 平台,当家语言就是 Java。 因而 Java 再次焕发勃勃生机。 目前在大数据领域,Java 一样是当仁不让的好手。"redis

原文出自这里,感兴趣的朋友能够去读一读。spring

**"命好"**的确没错,但这里想说的是开放性(开源)是很是关键的。 因为Java的开放性,其开源生态衍生出了很是多的优秀框架,其中最有表明性的就是SpringFramework。 随着框架的受众愈来愈多,该项目也在持续演进以知足日益增加的能力需求,最终你们便愈来愈离不开它。 到现在 SpringFramework 已经造成了一个庞大的生态圈,同时 Spring Web也已经成为Java开发的一种"事实标准"。mongodb

若是但愿了解Spring 框架的一些历史,推荐读一读 是时候给你们介绍 Spring Boot/Cloud 背后豪华的研发团队了 这篇文章。数据库

1、SpringBoot 简史

SpringBoot 的诞生不是没有道理的,可能你们都清楚,Spring Framework定义了一个核心的概念叫IoC,即控制反转。 这是什么意思? 控制反转,即对象的关系再也不由对象自己决定,由容器来控制其依赖。简单说,就是由容器来帮你初始化对象,并完成自动化的关联。 这样,又有了依赖注入(Dependency Injection)的概念...总之,IoC 和 DI是 理解Spring框架的关键,后面全部出现的东西,都是从这两个概念开始的。apache

而后,由于要作自动化的对象初始化、关系装配,须要有个东西来描述这些关系,通常是用xml文件来描述,好比applicationContext.xml 会描述一个ApplicationContext上下文里面所拥有的对象实例,以及这些实例之间的关系。 因而乎,全部的 Spring 应用程序都使用了这样的配置方式。

在 Web 开发方面,Spring Framework诞生了 Spring MVC,用来简化 Servlet的开发。 经过AOP实现的路由转换能力,能够快速的把URL映射到一个Bean方法去处理;经过内置经常使用的编解码转换器,能够避免每次都要写格式转换的代码.. 这些能力,也让 Spring MVC 称为了Java Web开发框架的不二之选。

可是发展到了后来,随着 Web开发技术的逐步完善,一个框架集成的模块愈来愈多,而单一Web应用的功能特性也愈来愈多了。 此时你们逐渐发现,基于 xml的方式去定义Bean加载,工做量其实很大,并且配置文件逐渐变得臃肿、很差维护,有时候配置出现错误,常常是要排查个半天。 因而乎都用了@Bean、@Autowired注解,还有@ComponentScan 来实现自动化扫描,这些特性大大简化了开发工做。

SpringBoot 是基于免配置的思路来设计的,也就是说让你不用在配置上花太多时间,全部的东西尽量都用内置的、现成的。 因而乎,就有了各类各样的 starter 子项目,严格说,这些 starter 只能算是胶水项目(几乎没有代码),可是它们能让你得到许多开发上的愉悦体验! 下面的这些starter都具有不一样的用途:

  • spring-boot-starter  核心启动器,包含了自动配置、日志和YAML。
  • spring-boot-starter-web  引入全栈式Web开发组件,包括Tomcat和spring-webmvc
  • spring-boot-starter-thymeleaf  引入Thymeleaf模板引擎,包括与Spring的集成。
  • spring-boot-starter-test  引入常规的测试依赖,包括JUnit、Hamcrest、Mockito以及spring-test模块。
  • spring-boot-starter-websocket  引入WebSocket模块
  • spring-boot-starter-redis  引入Redis模块
  • spring-boot-starter-security  引入 spring-security安全模块
  • spring-boot-starter-data-jpa  引入数据存储层JPA(Java Persistence API)
  • spring-boot-starter-data-mongodb  引入MongoDB数据库模块
  • spring-boot-starter-amqp  引入spring-rabbitmq客户端来支持AMQP协议
  • spring-boot-starter-aop  引入AOP的编程模块,包括spring-aop和AspectJ
  • spring-boot-starter-mail  引入javax.mail模块
  • spring-boot-starter-log4j  引入Log4J日志框架

同时,这些模块化项目是随着SpringBoot版本一块儿演进的。 2014年4月份,Spring Boot 刚发布了 1.0版本 便 迅速圈粉,接下来1.x 版本经历了4年的演进; 直到2018年3月份,Spring Boot 2.0版本发布,

下面,是SpringBoot经历过的一些版本:

Spring boot 1.1(2014 年 6 月) 改进的模板支持,gemfire 支持,elasticsearch 和 apache solr 的自动配置。

Spring Boot 1.2(2015 年 3 月) 升级到 servlet 3.1 / tomcat 8 / jetty 9,spring 4.1 升级, 支持 banner / jms / SpringBootApplication 注解。

Spring Boot 1.3(2016 年 12 月) 升级到 Spring 4.2 ,新的 spring-boot-devtools, 缓存模块实现自动化配置(ehcache,hazelcast,redis 和 infinispan) 支持彻底可执行的 jar 支持。

Spring Boot 1.4(2017年1月) spring 4.3 升级,支持 couchbase/neo4j,分析启动失败和RestTemplateBuilder。

Spring Boot 1.5(2017年2月) 支持 kafka / ldap,第三方库升级,弃用 crash 支持和执行器记录器端点以动态修改应用程序日志级别。

Spring Boot 2.0(2018 年 03 月) 基于 Java 8,支持 Java 9,支持 Quartz ,调度程序大大简化了安全自动配置,支持嵌入式 Netty。

Spring Boot 2.1(2018 年 10 月) 支持 Java 11,升级Spring 5.1,应用性能提高,度量模块作了改进。

其中 Spring Boot 2.0跨度较大,酝酿期也达到1年之多,整个 底层的SpringCore 核心都作了较大的升级(基于Spring 5.0)。 随着 SpringBoot 2.1的发布,2.2即将面世,整个2.0 版本也会趋于稳定。

其中,对于大多数人比较关心的,是Spring Boot 2都有哪些更新,要不要作升级?

图-Spring之父 Rod Johnson

2、SpringBoot 2 的变化

下面列举了Spring Boot 2.0这个重要版本的一些更新:

1.配置的变动

在 2.x 中废除了一些 1.x 中的配置,并增长了许多新配置,详细请查看如下连接中的变动表格。 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Configuration-Changelog

此外,关于配置的绑定方式也有些变化:

在 1.x 中,配置绑定是经过注解 @ConfigurationProperties 来注入到 Spring 环境变量中的。 在 2.x 中,配置绑定功能有了些的改造,在调整了 1.x 中许多不一致地方以外,还提供了独立于注解以外的 API 来装配配置属性。 并增长了属性来源,这样你就能知道这些属性是从哪一个配置文件中加载进来的。

2.JDK 版本升级

2.x 至少须要 JDK 8 的支持,2.x 里面的许多方法应用了 JDK 8 的许多高级新特性,因此升级到 2.0 版本必须先确认你的应用必须兼容 JDK 8。 另外是 2.x 开始了对 JDK 9 的支持。

3.第三方类库升级

2.x 对第三方类库升级了全部能升级的稳定版本,一些值得关注的类库:

1) Spring Framework 5+ 2) Tomcat 8.5+ 3) Flyway 5+ 4) Hibernate 5.2+ 5) Thymeleaf 3+

4.响应式编程支持

2.x 经过启动器和自动配置全面支持 Spring 的响应式编程,响应式编程是彻底异步和非阻塞的,它是基于事件驱动模型,而不是传统的线程模型。 就连 Spring Boot 内部也对一些功能点进行了有必要的响应式升级,最值得注意的是对内嵌式容器的支持。

对响应式编程支持又包括如下几个技术模块。

  1. Spring WebFlux & WebFlux.fn 支持
  2. 响应式 Spring Data 支持
  3. 响应式 Spring Security 支持
  4. 内嵌式的 Netty 服务器支持

5.Data 支持

上面有说到对响应式 Spring Data 的支持,除此以外,其余 Data 模块也作了许多更新和提高,具体体如今如下几个地方。

  1. 2.x 默认使用 HikariCP 链接池;
  2. 更加合理化的优化了数据库初始化逻辑;
  3. spring.jdbc.template 自动配置如今能够经过 spring.jdbc.template 属性定制;
  4. 提供了新配置 spring.jdbc.template 方便分页和排序;
  5. 对数据库 spring.jdbc.template 自动化配置支持;
  6. 能够高级定制 MongoDB 客户端;
  7. 能够经过 spring.cache.redis.* 来配置 Redis 缓存默认值。

6.Web增强

除了上面说了 2.x 对响应式框架的支持,还包括如下几个 web 开发改进。

  1. 使用内嵌式容器时,context path 会和端口一块儿记录并打印出来;
  2. 全部支持的容器都支持过滤器的初始化;
  3. Thymeleaf 开始支持 javax.time 类型;
  4. 提供了一个 spring-boot-starter-json 启动器对 JSON 读写的支持。

7.HTTP/2 支持

提供对HTTP/2 的支持,如:Tomcat, Undertow, Jetty,这个得依赖具体选择的应用服务器和应用环境。

8.其余加强

出了前面的一些变化,还包括如下的一些加强: Actuator增强 在 2.x 中,对执行器端点进行了许多改进,全部的 HTTP 执行端点如今都暴露在 /actuator路径下,并对 JSON 结果集也作了改善。

Gradle 插件 Spring Boot的 Gradle 插件全面重写了,而且最小支持 Gradle 4+ 以便提供一些重要的特性提高。

Kotlin 2.x 开始提供对 Kotlin 1.2 的支持,而且提供了一个 runApplication 函数来运行 Spring Boot 应用。

Quartz支持 2.x 提供了一个 spring-boot-starter-quartz 启动器对定时任务框架 Quartz 的支持。

测试支持 在 2.x 中,对测试模块有了一些调整,如自动化的配置加强。

在这里,能够看到更详细的的版本特性。

3、要不要升级

Spring Boot 2.0 发布至今已经将近一年了,目前来看应该是比较稳定的,而市面上也出现很多基于 SpringBoot 2.0的教程书籍,在这个时间点开始使用是没有问题的。

A. 若是所在的团队较小,或是对于新的项目,建议能够直接上手; B. 对于规模较大,或是已经上线一段时间的项目,则须要考虑以下问题:

  • 当前的Spring Boot版本是否存在重大的缺陷?
  • 切换过程产生的人力成本是否能够接受?
  • 团队中对于新版本的掌握程度如何?

对于后者,我更多建议持保守态度,Spring Boot 1.x 尽管目前已经中止更新,但其经历了4年多的迭代完善,目前是使用面最广且最为稳定的。

若是确实想进行升级,也建议先作好的分析及测试,也能够看看SpringBoot 2.0迁移指南

做为初学者来看,使用 Spring Boot 1.x 仍是 2.x 的区别并不大,相比较之下,当下在使用 1.x过程当中遇到的一些问题会更容易找到答案。 或许,你能够从下面这篇文章开始学习 Spring Boot。

springboot项目基础搭建课

欢迎继续关注"美码师的补习系列-springboot篇" ,期待更多精彩内容^-^

相关文章
相关标签/搜索