SpringBoot这玩意儿当然不能更好了!
前言
迪士尼相信大家都不陌生,在1964年的纽约世界博览会上,沃特·迪士尼向世界介绍了三件有开创意义的东西:“小小世界”(it’s a small world)、“与林肯先生共度的伟大时刻”(Great Moments with Mr. Lincoln)以及“文明演进之旋转木马”(Carousel of Progress)。你今天仍能看见它们。其中,我最喜欢的是“文明演进之旋转木马”,这也是沃特·迪士尼的最爱之一。在每幕表演中,父亲(也是演出的叙述者)都会讲述最新的发明,并带上一句“这玩意儿不能更好了”,到头来却发现随着技术的进步,它的确变得更好了。它满足了人们不断追求新奇、刺激的求新求异心理。乐园不断建造的游乐设施,推陈出新,不仅满足孩子们的求新欲望。
Spring的历史相对要短的多,但是对于Spring给我的感受和“演进老爹”(Progress Dad)对20世纪的体会相似。似乎每个Spring应用程序都让开发者的生活更上一个台阶,让我们来看看Spring历史中的一些演化历程。
- Spring 1.0的出现彻底改变了我们开发企业级Java应用程序的方式。Spring的依赖注入与声明式事务意味着组件之间再也不存在紧耦合,再也不用重量级的EJB了。这玩意儿不能更好了。
- 到了Spring 2.0,我们可以在配置里使用自定义的XML命名空间,更小、更简单易懂的配置文件让Spring本身更便于使用。这玩意儿不能更好了。
- Spring 2.5让我们有了更优雅的面向注解的依赖注入模型(即@Component和@Autowired注解),以及面向注解的Spring MVC编程模型。不用再去显式地声明应用程序组件了,也不再需要去继承某个基础的控制器类了。这玩意儿不能更好了。
- 到了Spring 3.0,我们有了一套基于Java的全新配置,它能够取代XML。在Spring 3.1里,一系列以@Enable开头的注解进一步完善了这一特性。终于,我们第一次可以写出一个没有任何XML配置的Spring应用程序了。这玩意儿不能更好了。
- Spring 4.0对条件化配置提供了支持,根据应用程序的Classpath、环境和其他因素,运行时决策将决定使用哪些配置,忽略哪些配置。那些决策不需要在构建时通过编写脚本确定了;以前会把选好的配置放在部署的包里,现在情况不同了。这玩意儿不能更好了。
尽管如此,我们依旧没能逃脱配置的魔爪。开启某些Spring特性时,比如事务管理和Spring MVC,还是需要用XML或Java进行显式配置。启用第三方库时也需要显式配置,比如配置Servlet和过滤器(比如Spring的DispatcherServlet)同样需要在web.xml或Servlet初始化代码里进行显式配置。组件扫描减少了配置量,Java配置让它看上去简洁不少,但Spring还是需要不少配置。所有这些配置都代表了开发时的损耗。因为在思考Spring特性配置和解决业务问题之间需要进行思维切换,所以写配置挤占了写应用程序逻辑的时间。和所有框架一样,Spring实用,但与此同时它要求的回报也不少。除此之外,项目的依赖管理也是件吃力不讨好的事情。决定项目里要用哪些库就已经够让人头痛的了,你还要知道这些库的哪个版本和其他库不会有冲突,这难题实在太棘手。并且,依赖管理也是一种损耗,添加依赖不是写应用程序代码。一旦选错了依赖的版本,随之而来的不兼容问题毫无疑问会是生产力杀手。
现在轮到Spring Boot了。虽然Spring的每个版本都让我们觉得一切都不能更好了,但Spring Boot还是向我们证明了Spring仍然有巨大的潜力。事实上,我相信Spring Boot是长久以来Java开发历程里最意义深刻、激动人心的东西。Spring Boot让这一切成为了过去。
基本特性
Spring Boot将很多魔法带入了Spring应用程序的开发之中,其中最重要的是以下四个核心。
-
自动配置:针对很多Spring应用程序常见的应用功能,Spring Boot能自动提供相关配置。
-
起步依赖:告诉Spring Boot需要什么功能,它就能引入需要的库。
-
命令行界面:这是Spring Boot的可选特性,借此你只需写代码就能完成完整的应用程序,无需传统项目构建。
-
Actuator:让你能够深入运行中的Spring Boot应用程序,一探究竟。
Spring Boot就是Spring
因为Spring Boot实在是太惊艳了,所以过去一年多的时间里有不少和它相关的言论。
首先,Spring Boot不是应用服务器。这个误解是这样产生的:Spring Boot可以把Web应用程序变为可自执行的JAR文件,不用部署到传统Java应用服务器里就能在命令行里运行。Spring Boot在应用程序里嵌入了一个Servlet容器(Tomcat、Jetty或Undertow),以此实现这一功能。但这是内嵌的Servlet容器提供的功能,不是Spring Boot实现的。
与之类似,Spring Boot也没有实现诸如JPA或JMS(Java Message Service,Java消息服务)之类的企业级Java规范。它的确支持不少企业级Java规范,但是要在Spring里自动配置支持那些特性的Bean。例如,Spring Boot没有实现JPA,不过它自动配置了某个JPA实现(比如Hibernate)的Bean,以此支持JPA。最后,Spring Boot没有引入任何形式的代码生成,而是利用了Spring 4的条件化配置特性,以及Maven和Gradle提供的传递依赖解析,以此实现Spring应用程序上下文里的自动配置。
简而言之,从本质上来说,Spring Boot就是Spring,它做了那些没有它你自己也会去做的Spring Bean配置。你不用再写这些样板配置了,可以专注于应用程序的逻辑,这些才是应用程序独一无二的东西。
初始化 Spring Boot 项目
万事开头难,你需要设置一个目录结构存放各种项目内容,创建构建文件,并在其中加入各种依赖。我们看一下初始化的几种用法:
- 通过Web界面使用。
这是最直接的办法,就是用浏览器打开http://start.spring.io,你想用Maven还是Gradle来构建项目,以及使用Spring Boot的哪个版本。程序默认生成Maven项目,并使用Spring Boot的最新版本(非里程碑和快照版本),但你也可以自由选择其他选项。
- 通过Spring Tool Suite使用。
长久以来,Spring Tool Suite①一直都是开发Spring应用程序的不二之选。从3.4.0版本开始,它就集成了Spring Initializr,这让它成为开始上手Spring Boot的好方法。要在Spring Tool Suite里创建新的Spring Boot应用程序,在File菜单里选中New > Spring Starter Project菜单项,按对话框提示进行初始化即可。
注意,Spring Tool Suite是通过REST API与Initializr交互的,因此只有连上Initializr它才能正常工作。如果你的开发机离线,或者Initializr被防火墙阻断了,那么Spring Tool Suite的Spring Starter Project向导是无法使用的。
- 通过IntelliJ IDEA使用。
IntelliJ IDEA是非常流行的IDE,IntelliJ IDEA 14.1已经支持Spring Boot了!要在IntelliJ IDEA里创建新的Spring Boot应用程序,在File菜单里选择New > Project。在左侧项目选择里选中Spring Initializr,问的问题和Initializr的Web应用程序以及Spring Tool Suite类似。
- 使用Spring Boot CLI使用。
如果你想仅仅写代码就完成Spring应用程序的开发,那么Spring Boot CLI是个不错的选择。然而,Spring Boot CLI的功能还不限于此,它有一些命令可以帮你使用Initializr,通过它上手开发更传统的Java项目。
本篇文章只是简单说明一下初始化的几种方法,具体操作步骤后续会单独讲解。
总结
纵观Spring十多年来的发展,一直受Java开发者的追捧,是因为它根据技术的发展,不断进步和改善,并坚持最初的目标:简化企业级Java开发。Spring Boot为Spring应用程序的开发提供了一种激动人心的新方式,框架本身带来的阻力很小。Spring Boot从无数知名企业的实践中吸取经验,总结并落实到框架中。如果说Spring Framework的目标是帮助开发者写出好的系统,那Spring Boot的目标就是帮助开发者用更少的代码,更快地写出好的生产系统。好了,接下来让我们一起探索和交流Spring的plus版 —— SpringBoot 吧!
最后的最后
为初学者提供学习指南,为从业者提供参考价值。我坚信码农也具有产生洞见的能力。扫描下图二维码关注,学习和交流!