SpringBoot 2 要不要升级
前言
在谈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 2 要不要升级的更多相关文章
- 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 ...
- springboot升级到2.x需要改动的地方
由于需要跟进技术发展的脚步,对原有项目springboot进行2.0升级,但升级并不是说改一下版本就完事了,springboot2.0变动比较多,详细变化可以百度一下,下面针对升级springboot ...
- Springboot连接MySQL8.0出现的问题
以前用的是5.7版本的MySQL,在学习实践Springboot的时候顺带升级了一下8.0,遇到了一些坑,在这记录一下,有碰到同类问题的童鞋需要自取. 使用 navicat连接发现报错1251- Cl ...
- 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 ...
- Log4j未平,Logback 又起!再爆漏洞?
前段时间 Log4j接连爆漏洞的事儿相比把大家都折腾的不轻,很多开发都被连夜叫起来修复漏洞.这几天终于平复一些了. 可是,昨晚,忽然看到技术群和朋友圈,有人开始聊Logback 又爆漏洞了. 这是什么 ...
- SpringMVC Web项目升级为Springboot项目(二)
一.访问原项目地址,报404错误 由于原项目地址启动路径为http://localhost:8080/xxx Spring boot默认启动路径为http://localhost:8080/ 所以需要 ...
- springboot 升级到2.0后 context-path 配置 不起作用,不生效 不管用 皆是因为版本改动导致的在这里记录一下
不知不觉,新的项目已经将springboot升级为2.0版本了.刚开始没有配置server.contextpath,默认的“/”,然后今天放到自己的服务器上,所以就要规范名称. 结果,失败了,无论我 ...
- springboot升级到2.0后context-path配置不起作用
springboot升级到2.0后,context-path配置不起作用,改成了: server.servlet.context-path=/projname
- 升级springboot 2.x 踩过的坑——跨域导致session问题
目前IT界主流前后端分离,但是在分离过程中一定会存在跨域的问题. 什么是跨域? 是指浏览器从一个域名的网页去请求另一个域名的资源时,域名.端口.协议任一不同,都是跨域. 做过web后台的童鞋都知道,跨 ...
随机推荐
- 代码生成平台Xxl-Code-Generator
<代码生成平台Xxl-Code-Generator> 一.简介 1.1 概述 Xxl-Code-Generator 是一个 "controller/service/dao/myb ...
- oracle 触发器,当一个表更新或插入时将数据同步至另个库中的某个表中
有两个表分别是 A用户下的 T_SRC_WEATHER_TSPG字段如图, B用户下的t_src_weather 表,如图: 要求,当A用户下的T_SRC_WEATHER_TSPG表有插入或者更新数据 ...
- PAT1047: Student List for Course
1047. Student List for Course (25) 时间限制 400 ms 内存限制 64000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...
- Alfred效率神器
下图就是Alfred的主界面我们所有的操作都在这一个界面上进行.通过热键打开主界面(本人设置的是option+command),输入一个"a"后Alfred就会为我在候选界面上显示 ...
- Exchanger兄弟线程间数据信息交换
一.简述 Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据.当线程A调用Exchange对象的exchange()方法后,他会陷入阻塞状态,直到线程B也调用 ...
- java.lang.IllegalArgumentException: Request header is too large
tomcat运行项目时,有一个请求过去后,后台报这样的错java.lang.IllegalArgumentException: Request header is too large原因:请求头超过了 ...
- DCOS实践分享(4):如何基于DC/OS整合SMACK(Spark, Mesos, Akka, Cassandra, Kafka)
这篇文章入选CSDN极客头条 http://geek.csdn.net/news/detail/71572 当前,要保证业务的市场竞争力,仅靠设计一个可用并且好看的产品,已经完全不能满足要求.全球消费 ...
- python函数注释, :与 ->
python函数注释, :与 -> 如图:add1函数中的:意思是:函数中的参数说明 add2函数中:->意思是:函数的返回值为整型 这两种方法都是函数的注释方法,具体使用时要别人能 ...
- 实际项目开发需要注意的tips
1.尽量少用== 或者 != ,除非能够保证这里不会出现强制类型转换,严格起见,最好用 === 与 !==
- centos网络配置方法(手动设置,自动获取)
不知道为什么最近一段时间网络特别的慢,还老是断,断的时候,局域网都连不上,当我手动设置一下ip后就可以了,搞得我很无语.下面是2种设置网络连接的方法,在说怎么设置前,一定要做好备份工作,特别是对于新手 ...