本文翻译自 7 Things to Know Getting Started With Spring Boot by Ranga Karanam
Spring Boot 是一个比较 tricky 的框架,所以也往往不容易理解。这篇教程将讲解 Spring Boot 的基本组成,包括 Starter 项目、自动配置和 Starter Parents 等,来帮助初学者能更好的理解和掌握 Spring Boot。
Spring Boot 包含这些了组成部分:
首先我们会先把 Spring Boot 跟 Spring、Spring MVC 做一个比较,来帮助理解 Spring Boot 到底带来了什么。一旦明白了 Spring Boot 能提供什么功能,也就能更好的使用 Spring Boot。
它们之间的关系,最重要的一点是:
Spring Boot 跟 Spring、Spring MVC 不是竞争关系,Spring Boot 是为了能更好的使用他们。
Spring 框架最重要的特性就是依赖注入(Dependency Injection),而所有 Spring 模块的核心就是依赖注入和控制反转(IOC - Inversion of Control)。
通过妥善的使用依赖注入和控制反转,我们可以较为容易地开发出松散耦合的应用,并且易于测试。
Spring MVC 提供了诸如 Dispatcher Servlet、ModelAndView 和 View Resolver 等,让编写松散耦合的 Web 应用变得很容易。
Spring、Spring MVC 的一个弊端就是配置很复杂:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/views/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> <mvc:resources mapping="/webjars/**" location="/webjars/"/>
而 Spring Boot 通过 自动配置 和 Starter Project 解决了这个问题。同时它也提供了很多特性,让构建 production-ready 的应用变得容易和迅速。
关于 Spring Boot 和 Spring、Spring MVC 更深层次的对比,请阅读: Spring Boot vs. Spring MVC vs. Spring - How do they compare?
Spring 和 Spring MVC 有非常多的 XMl 和 Java Bean 配置。 而 Spring Boot 通过一个新思路为我们解决了这个问题:
我们能不能让配置变得更智能?当应用里面增加了 Spring MVC 的 JAR 包,我们能不能自动地配置一些 Java Bean?
Spring Boot 自动配置的规则:
Spring Boot 首先会检查这两部分:一是 classpath 里面存在的框架;二是应用已经存在的配置。结合这两部分,Spring Boot 就可以提供这些框架所需的基本配置,这就是 Spring Boot 的自动配置。
关于自动配置的深层讲解,请阅读: What is Spring Boot Auto Configuration?
Spring Boot 文档里是这样描述 Starter 项目的:
Starter 项目是一系列方便的依赖描述,可以在我们的项目中引用。通过 starter 项目,我们能“一站式”得获得所有所需的 Spring 以及相关技术,而不用像以前一样去找各种事例代码,复制相关的依赖描述。例如:如果我们想使用 Spring 和 JPA 来链接数据库,我们只需要把 spring-boot-starter-data-jpa 引入到我们的项目中,项目就搭建完了。
下面通过 Spring Boot Starter Web 来举个例子:
如果我们想开发一个 Web 应用或者 RESTful 服务,我们就可以直接使用 Spring Boot Starter Web。
当把 Spring Boot Starter Web 加到我们的项目依赖中,我们就可以看到相关的很多其他依赖也被加到应用里面了,如截图:
这里面包含了很多开发一个 Web 应用所需的常用模块。通过 Spring Boot Starter Web,我们可以很容易的引入并使用它们:
几乎所有的 Web 应用都需要这些模块,Spring Boot Starter Web 已经打包好了这些依赖。而开发者就不需要去处理这些依赖,以及它们的版本兼容问题。
Spring Boot 提供了大量这类 starter 项目。而 Spring Initializr 也全都支持,其中就包括:
想更深入的了解 starter 项目,请阅读: Initializing Projects with Spring Boot Starters - Web and JPA
几乎所有 Spring Boot 项目的 pom.xml 配置中,都使用了 spring-boot-starter-parent 来作为 parent 配置:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> </parent>
parent POMs 让我们更好的管理多个子项目或者模块:
想更深入的了解 Spring Boot Starter Parent,请阅读: Introduction to Spring Boot Starter Parent
Spring Initializr 是一个非常好的初始化 Spring Boot 项目的工具。
它提供了一个很简单的 UI,通过它我们可以创建各种不同类型的 Spring 项目,如:
我们来体验一下怎么通过 Spring Initializr 来创建一个项目:
如上图所示,只需简单几步:
com.in28minutes.springboot
student-services
Web
Generate Project
按钮 intelliJ
或者 Eclipse
即可。 想更深入的了解 Spring Initializr,请阅读: Spring Initializr - Bootstrap Your Spring Boot Applications at F1 speed!
当我们创建了一个可部署的包之后,我们可以在部署包中嵌入一个服务器(如 Tomcat)。
例如,对于一个 Spring Boot 应用,我们可以构建一个 JAR 包,里面包含了一个内嵌的 Tomcat 服务器(Embedded Tomcat),然后我们就可以像执行一个普通的 Java 程序一样启动这个服务器。
一个内嵌的服务器意味着,在我们的部署包里面包含了服务器的二进制文件(如 tomcat.jar)
我们来看下 spring-boot-starter-web 的依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <version>2.0.0.M6</version> <scope>compile</scope> </dependency>
可以看到,默认情况下,Starter Web 已经包含了 Starter Tomcat 的依赖:
想更深入的了解内嵌服务器,请阅读: Spring Boot and Embedded Servers - Tomcat, Jetty, and Undertow