Spring Boot2.X来临,扒一扒Spring家族的前世今生

当前互联网技术盛行,以Spring 框架为主导的Java 互联网技术成了主流,而基于Spring 技术衍生出来的Spring Boot,采用了“约定优于配置”的思想,极大地简化了Spring 框架的开发。

随着近些年来微服务技术的流行,Spring Boot 也成了时下炙手可热的热点技术。2017 年9 月,Spring 框架出现了重大版本升级,从4.x 版本升级为了5.x 版本,随着这次升级,Spring Boot的版本也在2018年3月从1.x升级到了2.x。

《深入浅出Spring Boot 2.x》
作者:杨开振
深入浅出升级版重点讲解Spring Boot 2.x 技术, 首先通过与传统Spring MVC 开发进行对比让读者融入Spring Boot 的开发中,然后再分别介绍全注解下的Spring IoC 和AOP。

结合MyBatis 框架详解数据库编程和其事务开发、流行的NoSQL(Redis和MongoDB)技术、Spring MVC 技术、REST风格网站搭建、Spring Security 技术、Spring 5.x 新发布的WebFlux 技术、高并发与锁、打包、测试、监 控和Spring Cloud 入门等内容,从而帮助读者掌握企业级Spring Boot 开发的要点,本书赠送作者讲解的部分配套视频课程。

《深入浅出Spring Boot 2.x》的缘起

为了进一步简化Spring的开发,2014年Spring Boot诞生了,它是一个由Pivotal团队提供的全新框架,其设计目的是简化Spring应用的搭建以及开发过程,并迎合时下流行的微服务思维,越来越多的企业选择了Spring Boot。随着2017年9月Spring 5.x的推出,2018年Spring Boot也推出了2.x版本,进入2.x版本时代。

基于这样的趋势,在我和朋友合作创作完成《Java EE互联网轻量级框架整合开发:SSM框架(Spring MVC+Spring+MyBatis)和Redis实现》后,收到了许多的读者、前同事和业内朋友的建议,他们希望我创作一本关于Spring Boot的书,来给需要学习Spring Boot的从业人员提供参考,这就是创作本书的缘起。

Spring Boot采用了“约定优于配置”的规则,大部分情况下依赖它提供的starter后,就可以使用默认的约定,加上属性文件,做大量的自定义配置,使开发更为简单;对于部署,Spring Boot提供了内嵌服务器,和Maven(或Grandle)打包,进一步降低了企业部署的难度;对于测试,它提供了快速测试的环境,进一步提高了开发效率,因此它渐渐成为中小型企业甚至是一些大型企业开发的主流选择。

加之在互联网世界中,分布式已经是一种必然的趋势,而分布式的治理和组件研发成本并非一般公司所能承担,为此Spring社区还在Spring Boot的基础上提供了Spring Cloud分布式开发组件,从而进一步简化了企业级分布式开发,这让Spring Boot和Spring Cloud都站到了互联网后端开发的主流方向上,越来越受到企业的青睐。

本书使用的Spring Boot版本

Spring Boot作为一个被市场高度关注的微服务开发框架,版本迭代十分频繁,这给我创作本书带来了极大的挑战。本书出版前还有一个有趣的插曲,在本书初创时Spring Boot的最新正式版是1.5.4,到我最初定稿时更新到了1.5.9,都是基于Spring Boot的1.x版本。在2018年3月初,在书稿进入复审环节之前,Spring Boot发生了重大的版本更替,正式更新到了2.x的正式(GA)版本。为了与时俱进,保证本书更有参考价值,我决定将本书采用的Spring Boot版本从最初定稿的1.5.9更新到2.0.0。因此,本书采用版本2.0.0.RELEASE进行讲解。Spring Boot 2.x和Spring Boot 1.x在使用上有很多地方存在很多不同,并且只能支持JDK 8或者以上版本,这些是读者在阅读本书和实践中需要注意的。
开启Spring Boot讲解之前,让我们先回顾Spring Framework的历史。

Spring的历史
在Spring框架没有开发出来时,Java EE是以Sun公司(已经被Oracle公司收购,不复存在,但为了纪念其对Java发展进程的巨大影响力,全书还是保留其名称,以表致敬之意)所制定的EJB(Enterprise Java Bean)作为标准的。

在“遥远”的EJB年代,开发一个EJB需要大量的接口和配置文件,直至EJB 2.0的年代,开发一个EJB还需要配置两个文件,其结果就是配置的工作量比开发的工作量还要大。

其次EJB是运行在EJB容器中的,而Sun公司定义的JSP和Servlet却是运行在Web容器中的,于是你可以想象得到,你需要使用Web容器去调用EJB容器的服务。

这就意味着存在以下的弊端:需要增加调用的配置文件才能让Web容器调用EJB容器;与此同时需要开发两个容器,非常多的配置内容和烦琐的规范导致开发效率十分低下,这非常让当时的开发者诟病;对于Web容器调用EJB容器的服务这种模式,注定了需要通过网络传递,造成性能不佳;对于测试人员还需要了解许多EJB烦琐的细节,才能进行配置和测试,这样测试也难以进行。

就在大家诟病EJB的时候,2002年澳大利亚工程师Rod Johnson(论学历他应该是音乐家,因为他是音乐博士)在其著名的著作Expert One-on-One J2EE Design and Development中提出了Spring的概念。按书中的描述,Spring是如下的框架。

We believe that:
J2EE should be easier to use.
It is best to program to interfaces, rather than classes. Spring reduces the complexity cost of using interfaces to zero.
JavaBean offers a great way of configuring applications.
OO design is more important than any implementation technology, such as J2EE.
Checked exceptions are overused in Java. A platform should not force you to catch exceptions you are unlikely to recover from Testability is essential and a platform such as spring should help make your code easier to test.
We aim that:
Spring should be a pleasure to use.
Your application codes should not depend on Spring APIs.
Spring should not compete with good existing solutions, but should foster integration.
然后在2004年由Rod Johnson主导的Spring项目推出了1.0版本,这彻底地改变了Java EE开发的世界,很快人们就抛弃了繁重的EJB的标准,迅速地投入到了Spring框架中,于是Spring成为了现实中Java EE开发的标准。

Spring以强大的控制反转(IoC)来管理各类Java资源,从而降低了各种资源的耦合;并且提供了极低的侵入性,也就是使用Spring框架开发的编码,脱离了Spring API也可以继续使用。

而Spring的面向切面的编程(AOP)通过动态代理技术,允许我们按照约定进行配置编程,进而增强了Bean的功能,它擦除了大量重复的代码,如数据库编程所需大量的try…catch…finally…语句以及数据库事务控制代码逻辑,使得开发人员能够更加集中精力于业务开发,而非资源功能性的开发。

Spring还提供许多整合了当时非常流行的框架的模板,如持久层Hibernate的HibernateTemplate模板、iBATIS的SqlMapClientTemplate模板等,极大地融合并简化了当时主流技术的使用,使得其展示了强有力的生命力,并延续至今。

值得一提的是,EJB 3.0的规范也引入了Spring的理念,而且整合了Hibernate框架的思想,但是也未能挽回其颓势,主要原因在于它的规范还是比较死板,而且比较难整合其他开源框架。其次,它运行在EJB容器之中,使用上还是比较困难,性能也不高。

注解还是XM
只是在Spring早期的1.x版本中,由于当时的JDK并不能支持注解,因此只能使用XML。而很快随着JDK升级到JDK5,它加入了注解的新特性,这样注解就被广泛地使用起来,于是Spring的内部也分为了两派,一派是使用XML的赞同派,一派是使用注解的赞同派。

为了简化开发,在Spring 2.x之后的版本也引入了注解,不过只是少量的注解,如@Component、@Service等,但是功能还不够强大,因此对于Spring的开发,绝大部分的情况下还是以使用XML为主,注解为辅。

到了Spring 3.0后,引入了更多的注解功能,于是在Spring中产生了这样一个很大的分歧,即是使用注解还是使用XML?对于XML的引入,有些人觉得过于繁复,而对于注解的使用,会使得注解分布得到处都是,难以控制,有时候还需要了解很多框架的内部实现才能准确使用注解开发所需的功能。

这个时候大家形成了这样的一个不成文的共识,对于业务类使用注解,例如,对于MVC开发,控制器使用@Controller,业务层使用@Service,持久层使用@Repository;而对于一些公用的Bean,例如,对于数据库(如Redis)、第三方资源等则使用XML进行配置,直至今时今日这样的配置方式还在企业中广泛地使用着。

也许使用注解还是XML是一个长期存在的话题,但是无论如何都有道理。

随着注解的功能增强,尤其是Servlet 3.0规范的提出,Web容器可以脱离web.xml的部署,使得Web容器完全可以基于注解开发,对于Spring 3.x和Spring 4.x的版本注解功能越来越强大,对于XML的依赖越来越少,到了4.x的版本后甚至可以完全脱离XML,因此在Spring中使用注解开发占据了主流的地位。

与此同时,Pivotal团队在原有Spring的基础上主要通过注解的方式继续简化了Spring框架的开发,它们基于Spring框架开发了Spring Boot,所以Spring Boot并非是代替Spring框架,而是让Spring框架更加容易得到快速的使用。

Pivotal团队在2014年推出Spring Boot的1.0版本,该版本使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。在2018年3月Spring Boot推出了2.0.0 GA版本,该版本是基于Spring 5的,并引入其最新的功能,能够有效支持Java 9的开发。

Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)借助Java EE在企业互联网的强势地位成为业界领导者,它也是近年来Java开发最令人感到惊喜的项目之一。

随着近年来微服务的流行,越来越多的企业需要快速的开发,而Spring Boot除了以注解为主的开发,还有其他的绑定,例如,对服务器进行了绑定和默认对Spring的最大化配置,所以开发者能够尽快进行开发代码、发布和测试自己的项目。

这符合了现今微服务快速开发、测试和部署的需要,于是越来越多的企业选择Spring Boot作为开发的选型,进而使得Spring Boot更加兴旺起来。本书主要就是论述Spring Boot这一令人激动的开发工具。

Spring Boot的优点

谈到Spring Boot,就让我们先来了解它的优点。依据官方的文档,Spring Boot的优点如下:
创建独立的Spring应用程序;
嵌入的Tomcat、Jetty或者Undertow,无须部署WAR文件;
允许通过Maven来根据需要获取starter;
尽可能地自动配置Spring;
提供生产就绪型功能,如指标、健康检查和外部配置;
绝对没有代码生成,对XML没有要求配置。
这段描述告诉我们,首先Spring Boot是一个基于Spring框架搭建起来的应用,其次它会嵌入Tomcat、Jetty或者Undertow等服务器,并且不需要传统的WAR文件进行部署,也就是说搭建Spring Boot项目并不需要单独下载Tomcat等传统的服务器。

同时提供通过Maven(或者Grandle)依赖的starter,这些starter可以直接获取开发所需的相关包,通过这些starter项目就能以Java Application的形式运行Spring Boot的项目,而无须其他服务器配置。

对于配置,Spring Boot提供Spring框架的最大自动化配置,大量使用自动配置,使得开发者对Spring的配置尽量减少。

此外还提供了一些监测、自动检测的功能和外部配置,与此同时没有附加代码和XML的配置要求。

约定优于配置,这是Spring Boot的主导思想。对于Spring Boot而言,大部分情况下存在默认配置,你甚至可以在没有任何定义的情况下使用Spring框架,如果需要自定义也只需要在配置文件配置一些属性便可以,十分便捷。

而对于部署这些项目必需的功能,Spring Boot提供starter的依赖,例如,spring-boot-starter-web捆绑了Spring MVC所依赖的包,spring-boot-starter-tomcat绑定了内嵌的Tomcat,这样使得开发者能够尽可能快地搭建开发环境,快速进行开发和部署,这就是Spring Boot的特色。也许作为传统开发者的你,还未能理解其意义,但这并不要紧。

为了展示Spring Boot的特色,下节将分别展示传统Spring MVC项目和简易的Spring Boot入门实例,并进行比较。

传统Spring MVC和Spring Boot的对比
在传统的Spring MVC项目开发中,开发一个简易的Spring MVC项目,需要配置DispatcherServlet,也需要配置Spring IoC的容器。你可以选择使用web.xml的配置来实现,当然,如果你使用的是Servlet 3.1规范,也可以继承由Spring MVC提供的AbstractAnnotationConfigDispatcherServletInitializer来配置Spring MVC项目。

这里先给出可以运行的代码示例,即使你还不熟悉Spring MVC也没有关系,这里只是为了说明开发比较烦琐而已,后面将详谈Spring MVC的开发原理。

假设你已经导入需要的Spring和Spring MVC相关的依赖包到工程中,那么就可以开始配置DispatcherServlet了。例如,代码清单1-1就是通过继承AbstractAnnotationConfigDispatcherServletInitializer的方式来配置Spring MVC的DispatcherServlet的。

代码清单1-1 配置Spring MVC

1package com.springboot.springmvc.conf;
2
3import
4org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
5public class MyWebAppInitializer
6 extends AbstractAnnotationConfigDispatcherServletInitializer {
7
8 // Spring IoC容器配置
9 @Override
10 protected Class

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值