译者注:
国内对于Spring Boot的介绍也有不少了.那我为何还要专门再翻译这么一篇文章呢?因为这篇文章中,对于Spring Boot与Spring的关系,描述的比较生动.
几个月之前,我在Barcelona参加了 Spring IO 2015.这里有很多关于Spring生态系统的新东西,比如新版本的Spring, Spring Cloud,微服务架构,WebSockets等.让我最感兴趣的是,几乎所有的演示程序,都是用一种叫做Spring Boot的工具写的.
在Spring Boot出现之前,创建一个基于Spring的应用,对那些刚开始使用Spring的人(即使是Spring老鸟)来说,由于其配置的复杂性,过程是极其痛苦的.现在,使用Spring Boot,我们可以很轻易的就构建一个能够用于生产环境的Spring应用.而这,都是由于Spring Boot约定优先的特性.Spring Boot会自己配置一个Spring应用,然后让我们能够开箱即用.
现在,创建一个Spring应用,你只需要用浏览器打开Spring Boot的初始化器页面,输入项目的元数据,选择项目的依赖,然后点击”Generate Project”.
上面的步骤,会为你生成一个新的项目.你可以将它保存到机器上,然后用你喜欢的IDE打开,构建并运行,而不需要任何配置.如果你在新建项目时,选择的是”Jar”模式,它会在里面自动为你嵌入一个Tomcat,这样,你就可以直接运行了.当然,你也可以选择”War”模式,然后手动将它部署到你喜欢的服务器上.
但是,在Spring IO上,Josh Long建议你最好选择Jar模式,而不是War模式.为什么呢?因为Jar模式让你能够更加方便的构建一个微服务.我们可以想象一下,假如你有50个微服务,每个都需要你手动部署到服务器上.那是有多么麻烦啊!
你也可以使用你最喜欢的IDE来创建应用,如果它集成了Spring Initializer的话.这种IDE有IntelliJ, Eclipse和NetBeans.
除此之外,你还可以使用Spring提供的CLI,从命令行里创建项目.使用这种方式,在创建项目时,可以配置的选项就相对较少了.
必须要说明的是,Spring Boot并不是用于代码生成的.它是用来启动项目的,使用它默认的配置.你可以在属性文件或者类中重写这些属性.Spring Boot完全可以做到无需XML来进行配置,当然,如果你喜欢用的话,还是可以用的.
前些日子,我看到Phil Webb发了一篇博文,说Spring Boot是一个封装了Spring的框架(这个观点实际上是对的).同时,他还发了几张图片,用来解释Spring Boot的核心概念非常好:
我觉得这个比喻特别恰当.当使用Spring框架时,你有很多配料,来自己做一个好吃的蛋糕(或者Spring应用).但是,当使用Spring Boot时,实际上是已经根据你选的配料给你生成了一个蛋糕.如果你想改变这个蛋糕的口味,颜色和形状,做就是,Spring Boot将会给你一个新的蛋糕.
Spring Boot的自动配置,是通过starters和conditional annotations实现的.
Starter把一堆相关依赖给封装成了一个,然后我们在项目中只需要导入这一个starter就行,而不需要像以前那样,导入很多依赖.这让我们简化了我们的依赖配置文件.例如,如果你想要创建一个web应用,现在你只需要在pom.xml文件中,添加这个starter即可:
这个starter会自动为你添加那些创建一个Spring Web应用需要的依赖.
那Conditional annotations是干嘛的呢?它们会根据classpath中的类的注解,属性文件,来实现自动配置.比如,我们可以通过注解来配置一个beans.用这种方式,Spring Boot能够为我们自动配置一个默认数据库,JMS队列,属性等,而不需要我们明确的进行配置.用于实现这些行为的注解有:
Class conditions: @ConditionalOnClass and @ConditionalOnMissingClass.
Bean conditions: @ConditionalOnBean and @ConditionalOnMissingBean.
Property condition: @ConditionalOnProperty.
Resource condition: @ConditionalOnResource.
Web application conditions: @ConditionalOnWebApplication and @ConditionalOnNotWebApplication.
SpEL expression condition: @ConditionalOnExpression.
将Starter和Conditional annotation组合起来使用,你也可以创建你自己的可以自动配置的start.这种功能在有的情景中很有用.比如,你的公司想要创建共享库或者大量配置基本相同的项目.
你可以从附录上的链接中,看到Spring提供给我们的starters的完整列表,以及如何创建你自己的auto configuration.
Spring Boot不止可以自动配置并启动Spring应用.它还有很多其他的特色.比如,如果你在你的POM文件中添加spring-boot-starter-actuator这个starter,或者在Initializer页面中,选择”Actuator”,你会为你的Spring应用添加几个用于监控的接口.下面是从Spring文档中截取的可用的接口:
/autoconfig: Displays an auto-configuration report showing all auto-configuration candidates and the reason why they ‘were’ or ‘were not’
/beans: Displays a complete list of all the Spring beans in your application.
/configprops: Displays a collated list of all @ConfigurationProperties.
/dump: Performs a thread dump.
/env: Exposes properties from Spring’s ConfigurableEnvironment.
/health: Shows application health information (a simple ‘status’ when accessed over an unauthenticated connection or full message details when authenticated).
/info: Displays arbitrary application info.
/metrics: Shows ‘metrics’ information for the current application.
/mappings: Displays a collated list of all @RequestMapping paths.
/shutdown: Allows the application to be gracefully shutdown (not enabled by default).
/trace: Displays trace information (by default the last few HTTP requests).
这些接口都会返回JSON数据,你可以抓取这些数据,并做一些有用的工作.比如,监控应用.你也可以通过在Spring Boot中集成JMX,来检查这些接口.
监控我们的Spring Boot应用的另一种方式是通过集成一个叫做CRaSH的远程Shell.要在你的应用中集成它,你必须在你的POM文件中,添加spring-boot-starter-remote-shell这个starter.加上这个starter之后,你就可以通过在terminal中输入ssh -p 2000 user@localhost以及在启动应用时在日志中看到的密码来连接到你的应用了:
连接上之后,你就可以输入help来查看所有可以执行的命令.你会看到跟你可以通过命令来查看上面的接口中可以查看的东西.
你也可以通过Groovy或者Java语言来创建命令.更多细节请查看CRaSH文档.
通过上面的介绍,我们可以看到,Spring Boot是一个非常有用的框架,它能让我们迅速的搭建一个生产级的应用,而不需要在复杂的配置上花费很多时间.而且,通过一个starter,我们就能导入之前需要写很多依赖项的一系列相关的依赖.我们还能通过监控应用.Spring Boot让我们能够启动和监控应用!
参考链接
Spring Boot Starters list:
https://github.com/spring-projects/spring-boot/tree/master/spring-boot-starters
Spring Boot Create Own Auto-configuration:
Spring-Boot-Reference-Guide中文版:
https://www.gitbook.com/book/qbgbook/spring-boot-reference-guide-zh/details
使用 Spring Boot 快速构建 Spring 框架应用:
https://www.ibm.com/developerworks/cn/java/j-lo-spring-boot/