SpringBoot这玩意儿当然不能更好了!

数字追云人
• 阅读 759

前言

迪士尼相信大家都不陌生,在1964年的纽约世界博览会上,沃特·迪士尼向世界介绍了三件有开创意义的东西:“小小世界”(it’s a small world)、“与林肯先生共度的伟大时刻”(Great Moments with Mr. Lincoln)以及“文明演进之旋转木马”(Carousel of Progress)。你今天仍能看见它们。其中,我最喜欢的是“文明演进之旋转木马”,,这也是沃特·迪士尼的最爱之一。在每幕表演中,父亲(也是演出的叙述者)都会讲述最新的发明,并带上一句“这玩意儿不能更好了”,到头来却发现随着技术的进步,它的确变得更好了。它满足了人们不断追求新奇、刺激的求新求异心理。乐园不断建造的游乐设施,推陈出新,不仅满足孩子们的求新欲望。

Spring的历史相对要短的多,但是对于Spring给我的感受和“演进老爹”(Progress Dad)对20世纪的体会相似。似乎每个Spring应用程序都让开发者的生活更上一个台阶,仅从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菜单项,按对话框提示进行初始化即可。

  • 通过IntelliJ IDEA使用。

IntelliJ IDEA是非常流行的IDE,IntelliJ IDEA 14.1已经支持Spring Boot了!要在IntelliJ IDEA里创建新的Spring Boot应用程序,在File菜单里选择New > Project。按对话框提示进行初始化即可。

  • 使用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 吧!

最后的最后

为初学者提供学习指南,为从业者提供参考价值。我坚信码农也具有产生洞见的能力。扫描下图二维码关注,学习和交流!
SpringBoot这玩意儿当然不能更好了!

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这