前言

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

首先是Java 语言,这门长期占据编程语言排行榜首位的语言到底有什么魔力?
大家的看法是多种多样的,比如:

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

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

其中,主要说的是:

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

原文出自这里,感兴趣的朋友可以去读一读。

"命好"的确没错,但这里想说的是开放性(开源)是非常关键的。
由于Java的开放性,其开源生态衍生出了非常多的优秀框架,其中最有代表性的就是SpringFramework。
随着框架的受众越来越多,该项目也在持续演进以满足日益增长的能力需求,最终大家便越来越离不开它。
到如今 SpringFramework 已经形成了一个庞大的生态圈,同时 Spring Web也已经成为Java开发的一种"事实标准"。

如果希望了解Spring 框架的一些历史,推荐读一读 是时候给大家介绍 Spring Boot/Cloud 背后豪华的研发团队了 这篇文章。

一、SpringBoot 简史

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

然后,因为要做自动化的对象初始化、关系装配,需要有个东西来描述这些关系,一般是用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

二、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 中,对测试模块有了一些调整,如自动化的配置增强。

在这里,可以看到更详细的的版本特性。

三、要不要升级

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篇" ,期待更多精彩内容^-^

SpringBoot 2 要不要升级的更多相关文章

  1. springboot 1.3.5升级1.5.9后 默认使用tomcat 8.5版本 get请求报400 异常信息为 The valid characters are defined in RFC 7230 and RFC 3986

    1.springboot 1.3.5升级1.5.9后 默认使用tomcat 8.5版本而之前用的是tomcat7    get请求报400 异常信息为 The valid characters are ...

  2. springboot升级到2.x需要改动的地方

    由于需要跟进技术发展的脚步,对原有项目springboot进行2.0升级,但升级并不是说改一下版本就完事了,springboot2.0变动比较多,详细变化可以百度一下,下面针对升级springboot ...

  3. Springboot连接MySQL8.0出现的问题

    以前用的是5.7版本的MySQL,在学习实践Springboot的时候顺带升级了一下8.0,遇到了一些坑,在这记录一下,有碰到同类问题的童鞋需要自取. 使用 navicat连接发现报错1251- Cl ...

  4. springboot 2.0 Redis command timed out的解决

    环境:springboot 2.0.7 spring data redis springboot从1.x升级到2.x后,spring data redis使用的redis客户端驱动从1.x的jedis ...

  5. Log4j未平,Logback 又起!再爆漏洞?

    前段时间 Log4j接连爆漏洞的事儿相比把大家都折腾的不轻,很多开发都被连夜叫起来修复漏洞.这几天终于平复一些了. 可是,昨晚,忽然看到技术群和朋友圈,有人开始聊Logback 又爆漏洞了. 这是什么 ...

  6. SpringMVC Web项目升级为Springboot项目(二)

    一.访问原项目地址,报404错误 由于原项目地址启动路径为http://localhost:8080/xxx Spring boot默认启动路径为http://localhost:8080/ 所以需要 ...

  7. springboot 升级到2.0后 context-path 配置 不起作用,不生效 不管用 皆是因为版本改动导致的在这里记录一下

    不知不觉,新的项目已经将springboot升级为2.0版本了.刚开始没有配置server.contextpath,默认的“/”,然后今天放到自己的服务器上,所以就要规范名称.  结果,失败了,无论我 ...

  8. springboot升级到2.0后context-path配置不起作用

    springboot升级到2.0后,context-path配置不起作用,改成了: server.servlet.context-path=/projname

  9. 升级springboot 2.x 踩过的坑——跨域导致session问题

    目前IT界主流前后端分离,但是在分离过程中一定会存在跨域的问题. 什么是跨域? 是指浏览器从一个域名的网页去请求另一个域名的资源时,域名.端口.协议任一不同,都是跨域. 做过web后台的童鞋都知道,跨 ...

随机推荐

  1. 代码生成平台Xxl-Code-Generator

    <代码生成平台Xxl-Code-Generator> 一.简介 1.1 概述 Xxl-Code-Generator 是一个 "controller/service/dao/myb ...

  2. oracle 触发器,当一个表更新或插入时将数据同步至另个库中的某个表中

    有两个表分别是 A用户下的 T_SRC_WEATHER_TSPG字段如图, B用户下的t_src_weather 表,如图: 要求,当A用户下的T_SRC_WEATHER_TSPG表有插入或者更新数据 ...

  3. PAT1047: Student List for Course

    1047. Student List for Course (25) 时间限制 400 ms 内存限制 64000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...

  4. Alfred效率神器

    下图就是Alfred的主界面我们所有的操作都在这一个界面上进行.通过热键打开主界面(本人设置的是option+command),输入一个"a"后Alfred就会为我在候选界面上显示 ...

  5. Exchanger兄弟线程间数据信息交换

    一.简述 Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据.当线程A调用Exchange对象的exchange()方法后,他会陷入阻塞状态,直到线程B也调用 ...

  6. java.lang.IllegalArgumentException: Request header is too large

    tomcat运行项目时,有一个请求过去后,后台报这样的错java.lang.IllegalArgumentException: Request header is too large原因:请求头超过了 ...

  7. DCOS实践分享(4):如何基于DC/OS整合SMACK(Spark, Mesos, Akka, Cassandra, Kafka)

    这篇文章入选CSDN极客头条 http://geek.csdn.net/news/detail/71572 当前,要保证业务的市场竞争力,仅靠设计一个可用并且好看的产品,已经完全不能满足要求.全球消费 ...

  8. python函数注释, :与 ->

    python函数注释, :与 -> 如图:add1函数中的:意思是:函数中的参数说明    add2函数中:->意思是:函数的返回值为整型 这两种方法都是函数的注释方法,具体使用时要别人能 ...

  9. 实际项目开发需要注意的tips

    1.尽量少用== 或者 != ,除非能够保证这里不会出现强制类型转换,严格起见,最好用 === 与 !==

  10. centos网络配置方法(手动设置,自动获取)

    不知道为什么最近一段时间网络特别的慢,还老是断,断的时候,局域网都连不上,当我手动设置一下ip后就可以了,搞得我很无语.下面是2种设置网络连接的方法,在说怎么设置前,一定要做好备份工作,特别是对于新手 ...