1.1.2 Spring Boot 精要
Spring Boot 将很多魔法带入了 Spring 应用程序的开发之中,其中最重要的是以下四个核心。
- 自动配置 :针对很多 Spring 应用程序常见的应用功能,Spring Boot 能自动提供相关配置。
- 起步依赖 :告诉 Spring Boot 需要什么功能,它就能引入需要的库。
- 命令行界面 :这是 Spring Boot 的可选特性,借此你只需写代码就能完成完整的应用程序,无需传统项目构建。
- Actuator :让你能够深入运行中的 Spring Boot 应用程序,一探究竟。
每一个特性都在通过自己的方式简化 Spring 应用程序的开发。本书会探寻如何将它们发挥到极致,但就目前而言,先简单看看它们都提供了哪些功能吧。
1. 自动配置
在任何 Spring 应用程序的源代码里,你都会找到 Java 配置或 XML 配置(抑或两者皆有),它们为应用程序开启了特定的特性和功能。举个例子,如果你写过用 JDBC 访问关系型数据库的应用程序,那你一定在 Spring 应用程序上下文里配置过 JdbcTemplate
这个 Bean。我打赌那段配置看起来是这样的:
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
这段非常简单的 Bean 声明创建了一个 JdbcTemplate
的实例,注入了一个 DataSource
依赖。当然,这意味着你还需要配置一个 DataSource
的 Bean,这样才能满足依赖。假设你将配置一个嵌入式 H2 数据库作为 DataSource
Bean,完成这个配置场景的代码大概是这样的:
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScripts('schema.sql', 'data.sql')
.build();
}
这个 Bean 配置方法创建了一个嵌入式数据库,并指定在该数据库上执行两段 SQL 脚本。 build()
方法返回了一个指向该数据库的引用。
这两个 Bean 配置方法都不复杂,也不是很长,但它们只是典型 Spring 应用程序配置的一小部分。除此之外,还有无数 Spring 应用程序有着完全相同的方法。所有需要用到嵌入式数据库和 JdbcTemplate
的应用程序都会用到那些方法。简而言之,这就是一个样板配置。
既然它如此常见,那为什么还要你去写呢?
Spring Boot 会为这些常见配置场景进行自动配置。如果 Spring Boot 在应用程序的 Classpath 里发现 H2 数据库的库,那么它就自动配置一个嵌入式 H2 数据库。如果在 Classpath 里发现 JdbcTemplate
,那么它还会为你配置一个 JdbcTemplate
的 Bean。你无需操心那些 Bean 的配置,Spring Boot 会做好准备,随时都能将其注入到你的 Bean 里。
Spring Boot 的自动配置远不止嵌入式数据库和 JdbcTemplate
,它有大把的办法帮你减轻配置负担,这些自动配置涉及 Java 持久化 API(Java Persistence API,JPA)、Thymeleaf 模板、安全和 Spring MVC。第 2 章会深入讨论自动配置这个话题。
2. 起步依赖
向项目中添加依赖是件富有挑战的事。你需要什么库?它的 Group 和 Artifact 是什么?你需要哪个版本?哪个版本不会和项目中的其他依赖发生冲突?
Spring Boot 通过起步依赖为项目的依赖管理提供帮助。起步依赖其实就是特殊的 Maven 依赖和 Gradle 依赖,利用了传递依赖解析,把常用库聚合在一起,组成了几个为特定功能而定制的依赖。
举个例子,假设你正在用 Spring MVC 构造一个 REST API,并将 JSON(JavaScript Object Notation)作为资源表述。此外,你还想运用遵循 JSR-303 规范的声明式校验,并使用嵌入式的 Tomcat 服务器来提供服务。要实现以上目标,你在 Maven 或 Gradle 里至少需要以下 8 个依赖:
org.springframework:spring-core
org.springframework:spring-web
org.springframework:spring-webmvc
com.fasterxml.jackson.core:jackson-databind
org.hibernate:hibernate-validator
org.apache.tomcat.embed:tomcat-embed-core
org.apache.tomcat.embed:tomcat-embed-el
org.apache.tomcat.embed:tomcat-embed-logging-juli
不过,如果打算利用 Spring Boot 的起步依赖,你只需添加 Spring Boot 的 Web 起步依赖( org.springframework.boot:spring-boot-starter-web
)1 ,仅此一个。它会根据依赖传递把其他所需依赖引入项目里,你都不用考虑它们。
1 Spring Boot 起步依赖基本都以 spring-boot-starter
打头,随后是直接代表其功能的名字,比如 web
、 test
,下文出现起步依赖的名字时,可能就直接用其前缀后的单词来表示了。 - 译者注
比起减少依赖数量,起步依赖还引入了一些微妙的变化。向项目中添加了 Web 起步依赖,实际上指定了应用程序所需的一类功能。因为应用是个 Web 应用程序,所以加入了 Web 起步依赖。与之类似,如果应用程序要用到 JPA 持久化,那么就可以加入 jpa 起步依赖。如果需要安全功能,那就加入 security 起步依赖。简而言之,你不再需要考虑支持某种功能要用什么库了,引入相关起步依赖就行。
此外,Spring Boot 的起步依赖还把你从“需要这些库的哪些版本”这个问题里解放了出来。起步依赖引入的库的版本都是经过测试的,因此你可以完全放心,它们之间不会出现不兼容的情况。
和自动配置一样,第 2 章就会深入讨论起步依赖。
3. 命令行界面
除了自动配置和起步依赖,Spring Boot 还提供了一种很有意思的新方法,可以快速开发 Spring 应用程序。正如之前在 1.1 节里看到的那样,Spring Boot CLI 让只写代码即可实现应用程序成为可能。
Spring Boot CLI 利用了起步依赖和自动配置,让你专注于代码本身。不仅如此,你是否注意到代码清单 1-1 里没有 import
?CLI 如何知道 RequestMapping
和 RestController
来自哪个包呢?说到这个问题,那些类最终又是怎么跑到 Classpath 里的呢?
说得简单一点,CLI 能检测到你使用了哪些类,它知道要向 Classpath 中添加哪些起步依赖才能让它运转起来。一旦那些依赖出现在 Classpath 中,一系列自动配置就会接踵而来,确保启用 DispatcherServlet
和 Spring MVC,这样控制器就能响应 HTTP 请求了。
Spring Boot CLI 是 Spring Boot 的非必要组成部分。虽然它为 Spring 带来了惊人的力量,大大简化了开发,但也引入了一套不太常规的开发模型。要是这种开发模型与你的口味相去甚远,那也没关系,抛开 CLI,你还是可以利用 Spring Boot 提供的其他东西。不过如果喜欢 CLI,你一定想看看第 5 章,其中深入探讨了 Spring Boot CLI。
4. Actuator
Spring Boot 的最后一块“拼图”是 Actuator,其他几个部分旨在简化 Spring 开发,而 Actuator 则要提供在运行时检视应用程序内部情况的能力。安装了 Actuator 就能窥探应用程序的内部情况了,包括如下细节:
Spring 应用程序上下文里配置的 Bean
Spring Boot 的自动配置做的决策
应用程序取到的环境变量、系统属性、配置属性和命令行参数
应用程序里线程的当前状态
应用程序最近处理过的 HTTP 请求的追踪情况
各种和内存用量、垃圾回收、Web 请求以及数据源用量相关的指标
Actuator 通过 Web 端点和 shell 界面向外界提供信息。如果要借助 shell 界面,你可以打开 SSH(Secure Shell),登入运行中的应用程序,发送指令查看它的情况。
第 7 章会详细探索 Actuator 的功能。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论