教程:探索 Spring 支持功能
本教程在 教程:创建您的第一个 Spring 应用程序 基础上进行了扩展,展示了 IntelliJ IDEA 如何帮助您编写代码、分析 Spring 应用程序并在运行时进行管理。 本教程假设您从一个使用 Spring Initializr 生成的简单 Spring Boot Maven 项目开始。 它应该已经有用于构建 Web 应用程序的 Spring Boot Starter Web 依赖项。
本教程引导您完成以下步骤:
为 JPA 和 H2 添加依赖项,使您的 Spring 应用程序能够存储和检索关系数据
编写并检查您的代码
运行您的应用程序并执行 HTTP 请求
添加 Spring Boot Actuator 以进行高级健康监测和端点分析
添加 Spring Boot Developer Tools 以加快应用程序更新
为 JPA 和 H2 添加依赖
Spring Data JPA 模块提供了使用 Java Persistence API (JPA) 进行数据访问的支持。
H2 是用 Java 编写的快速内存中 SQL 数据库。
在项目根目录中打开 pom.xml 文件。

在编辑器中打开 pom.xml 文件后,按 Alt+Insert 并选择 添加启动器。
在打开的窗口中,选择 Spring Data JPA 和 H2 数据库 依赖项。
org.springframework.boot:spring-boot-starter-data-jpacom.h2database:h2
或者,您可以手动将这些依赖项添加到 pom.xml :
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency>在弹出窗口中点击
或按 Ctrl+Shift+O 以同步更新的项目结构。
创建一个将存储在数据库中的 JPA 实体
要为您的 Spring 应用程序定义数据模型,请创建一个 JPA 实体。 该应用程序将创建并存储具有 ID、名字和姓氏的 Customer 对象。
请在 Customer.java 文件夹下创建 src/main/java/com/example/springboottutorial 文件。
在 项目 工具窗口中,选择 src/main/java/com/example/springboottutorial 目录,然后从主菜单中选择 (或按下 Alt+Insert 并选择 Java 类)。 选择 类 并输入类的名称:
Customer。修改默认模板或将其替换为以下 Java 代码:
package com.example.springboottutorial; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; @Entity public class Customer { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; private String firstName; private String lastName; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }@Entity注解表示Customer类是一个 JPA 实体,应转换为数据库中的相应表。 IntelliJ IDEA 在装订区域用指定它。
@Id注解表明id字段是对象的 ID。 IntelliJ IDEA 在装订区域用指定它。 JPA 用
@GeneratedValue告诉 ID 应该自动生成。所有其他实体属性(
firstName和lastName在我们的示例中)都在装订区域用指定。 您可以用它在 持久性视图中快速打开该属性。
创建一个存储库接口
Spring Data JPA 会在运行时根据此接口创建一个存储库实现。
请在 CustomerRepository.java 文件夹下创建 src/main/java/com/example/springboottutorial 文件。
在 项目 工具窗口中,选择 src/main/java/com/example/springboottutorial 目录,然后从主菜单中选择 (或按下 Alt+Insert 并选择 Java 类)。 选择 接口 并输入接口名称:
CustomerRepository。修改默认模板或将其替换为以下 Java 代码:
package com.example.springboottutorial; import org.springframework.data.repository.CrudRepository; public interface CustomerRepository extends CrudRepository<Customer, Integer> { Customer findCustomerById(Integer id); }此存储库适用于
Customer实体和IntegerIDs。 它还声明了findCustomerById()方法。 Spring Data JPA 将基于此方法的签名派生出一个查询,该查询将为指定的 ID 选择Customer对象。 您可以尝试添加其他方法,以查看 IntelliJ IDEA 如何根据可用的 JPA 实体(在本例中为Customer类)提供完成建议。
创建一个 Web 控制器
控制器处理您的 Spring 应用程序的 HTTP 请求。 该应用程序将使用 /add 端点将 Customer 对象添加到数据库,使用 /list 端点从数据库获取所有 Customer 对象,并使用 /find/{id} 端点查找具有指定 ID 的客户。
请在 DemoController.java 文件夹下创建 /src/main/java/com/example/springboottutorial/ 文件。
在 项目 工具窗口中,选择 /src/main/java/com/example/springboottutorial/ 目录,然后从主菜单中选择 (或按下 Alt+Insert 并选择 Java 类)。 选择 类 并输入类的名称:
DemoController。修改默认模板或将其替换为以下 Java 代码:
package com.example.springboottutorial; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController public class DemoController { @Autowired private CustomerRepository customerRepository; @PostMapping("/add") public String addCustomer(@RequestParam String first, @RequestParam String last) { Customer customer = new Customer(); customer.setFirstName(first); customer.setLastName(last); customerRepository.save(customer); return "Added new customer to repo!"; } @GetMapping("/list") public Iterable<Customer> getCustomers() { return customerRepository.findAll(); } @GetMapping("/find/{id}") public Customer findCustomerById(@PathVariable Integer id) { return customerRepository.findCustomerById(id); } }以下是每个 Spring 注解的含义:
@RestController注解标记DemoController类为请求处理程序(一个 REST 控制器)。 IntelliJ IDEA 在装订区域用指示,您可以点击它以导航到相应的 Spring bean 声明。
@Autowired注解告诉 Spring 注入customerRepositorybean,它是从 repository 接口 实现的。 IntelliJ IDEA 会在注释栏中用标记,您可以点击它来导航到相应的 autowired 依赖。
@PostMapping("/add")注释将addCustomer()方法映射到/add的 POST 请求。@RequestParam注解将方法参数映射到相应的 Web 请求参数。@GetMapping("/list")注释将getCustomers()方法映射到/list的 GET 请求。@GetMapping("/find/{id}")注释将findCustomerById()方法映射到/find/{id}的 GET 请求。@PathVariable注解将 URL 中id变量的值映射到相应的方法参数。
IntelliJ IDEA 表示带有
的 Web 请求方法,您可以点击来在内置 HTTP 客户端 中执行相应请求。
运行您的应用程序并执行请求
按 Shift+F10 或使用
图标在 SpringBootTutorialApplication.java 文件的装订区域来运行您的应用程序。
默认情况下,IntelliJ IDEA 会在 运行工具窗口中显示您正在运行的 Spring Boot 应用程序。

控制台 选项卡显示 Spring 日志消息的输出。 默认情况下,内置的 Apache Tomcat 服务器正在监听 8080 端口。
打开网页浏览器并前往 http://localhost:8080/list。 您应该看到您的应用程序返回一个空列表
[ ],因为您在数据库中没有任何客户。若要添加客户,您需要向
/add端点发送一个 POST 请求,并指定请求参数中的名字和姓氏。 IntelliJ IDEA 内置了一个 HTTP 客户端 ,可以用来撰写和执行 HTTP 请求。打开 DemoController.java 并在
addCustomer()方法旁边的边栏中点击。
在请求文件中,编写如下 POST 请求:
### POST http://localhost:8080/add?first=Homer&last=Simpson点击
在装订线上执行请求。
IntelliJ IDEA 打开 运行 工具窗口并打印请求和响应:
POST http://localhost:8080/add?first=Homer&last=Simpson HTTP/1.1 200 Content-Type: text/plain;charset=UTF-8 Content-Length: 19 Date: Thu, 28 May 2020 08:10:30 GMT Keep-Alive: timeout=60 Connection: keep-alive Added new customer to repo! Response code: 200; Time: 217ms; Content length: 19 bytes再打开 HTTP 请求 文件并编写一个 GET 请求以获取所有客户:
### GET http://localhost:8080/listIntelliJ IDEA 提供请求方法和主体、位置及可用端点的完成建议。

执行 GET 请求以检索所有客户:
GET http://localhost:8080/list HTTP/1.1 200 Content-Type: application/json Transfer-Encoding: chunked Date: Thu, 28 May 2020 08:23:05 GMT Keep-Alive: timeout=60 Connection: keep-alive [ { "id": 1, "firstName": "Homer", "lastName": "Simpson" } ] Response code: 200; Time: 171ms; Content length: 51 bytes
尝试运行更多 POST 请求以添加其他客户。 每个都会获得一个唯一的 ID。 然后构建并执行 GET 请求以返回具有特定 ID 的客户。 例如:
添加 Spring Boot Actuator
Spring Boot Actuator 添加了多个端点,帮助您监控和管理应用程序。 这使 IntelliJ IDEA 能够在运行时公开应用程序的健康信息和所有请求映射。
在项目根目录中打开 pom.xml 文件。
在编辑器中打开 pom.xml 文件后,按 Alt+Insert 并选择 添加启动器。
在打开的 添加启动器 窗口中,选择 Spring Boot Actuator 依赖项。

或者,您可以手动添加依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>在弹出窗口中点击
或按 Ctrl+Shift+O 以同步更新的项目结构。
使用
或 Ctrl+F5 重新启动您的 Spring 应用程序。
打开 运行状况 选项卡以监控您的应用程序状态。

打开 映射 选项卡以与 request mapping 端点进行交互。

要显示由库(例如 Spring Boot Actuator 本身)提供的端点,请点击
。 点击端点路径直接运行相应的请求,在 HTTP 请求文件中生成并打开以便您在需要时修改和执行,或者如果是 GET 请求,则在 web 浏览器中打开端点 URL。
打开 环境 选项卡以查看 Spring Environment。 此信息来源于
/actuator/env端点,包括来自各种配置源(如应用程序属性和环境变量)的所有可用属性。
有关更多信息,请参见 环境。
添加 Spring Boot Developer Tools
当您对代码进行更改时,您需要重新运行整个项目:关闭具有所有依赖项的应用程序,重建代码,使用新代码启动应用程序。 IntelliJ IDEA 提供了一种重新启动您的 Spring 应用上下文而不必重新启动所有外部库上下文的方法。 在有大量依赖项的大型项目中,这可以节省时间,特别是在调试和调整代码时。 您还可以在正在运行的应用程序中更新静态和模板资源。
此功能基于 spring-boot-devtools 模块。
在项目根目录中打开 pom.xml 文件。
在编辑器中打开 pom.xml 文件后,按 Alt+Insert 并选择 添加启动器。
在打开的 添加启动器 窗口中,选择 Spring Boot DevTools 依赖项。
或者,您可以手动添加依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>在弹出窗口中点击
或按 Ctrl+Shift+O 以同步更新的项目结构。
在主菜单中,转到 并选择 SpringBootTutorialApplication 配置。
在 修改选项(M) 下,将 执行“更新”操作时(U) 和 切换出IDE 时(F) 选项都设置为 更新类和资源 ,然后点击 确定(O) 以应用更改。
请重启您的 Spring 应用程序。
您的应用程序将会正常运行,但现在每当您更改源代码或资源时,您可以触发更新。 要么从主菜单中选择 Ctrl+F10 ,要么将焦点从 IntelliJ IDEA 切换到另一个应用程序,例如网络浏览器。 这将更新您应用程序的所有类和资源,并在必要时重新启动应用程序。
更改主页
为了演示应用程序更新的工作原理,让我们在主页上公开 /add 和 /list HTTP 端点。 有关添加首页的更多信息,请参阅 添加主页。
打开 /src/main/resources/static/index.html 文件,修改它或替换为以下 HTML 代码:
<!DOCTYPE HTML> <html> <head> <title>You first Spring application</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <form action="/add" method="POST"> <p>Let's add a customer.</p> <div> <label for="firstName">First name:</label> <input name="first" id="firstName" value="Homer"> </div> <div> <label for="lastName">Last name:</label> <input name="last" id="lastName" value="Simpson"> </div> <div> <button>Add customer</button> </div> </form> <form action="/list" method="GET"> <button>List customers</button> </form> </body> </html>请打开您的网络浏览器并前往 http://localhost:8080/。 如果有必要,请刷新页面以查看新的主页。

添加一些客户并列出他们。 您也可以尝试发送 HTTP 请求到 http://localhost:8080/find/2 以查找 ID 为 2 的客户。
您可以更改 index.html 中的 HTML 代码,然后切换到网络浏览器并在刷新页面后查看更改。
您可以更进一步,安装 LiveReload ,这样浏览器将自动刷新。
效率提示
快速注入 bean
IntelliJ IDEA 提供了多种方式快速注入 bean,从而避免了您手动输入注解与字段或构造函数。
在 Spring 组件中,开始输入 bean 名称。
您可以通过以下方式获取所需的 bean:
按 Alt+Enter 并选择 添加名称匹配“bean name”的依赖项。
开始输入一个 bean 名称,然后按
.autowire来调用 后缀补全模板。 例如,输入custom.autowire以查找以custom开头的 bean。
如果输入的名称与 bean 的名称完全匹配,它将立即被注入。 如果它只匹配名称的一部分,您可以从打开的 选择 Bean 窗口中选择所需的 bean。

如果一个类有标注了 @Autowire 的字段,这将添加一个新的 @Autowire 字段。 否则,它将把相应的参数添加到类构造函数中。
或者,您可以按 Alt+Insert 并从 生成 上下文菜单中选择注入类型: @Autowired 依赖项、 构造函数依赖项 或 Setter 依赖项。 与上述方法不同,这种方法允许您选择一种方式来注入 bean,而不会过滤这些 bean,因此您可以预览所有 bean。
导航到安全的 URL
如果您使用 Spring Security ,则可能会有安全规则,例如仅允许经过身份验证的用户或具有特定角色的用户访问 URL。 IntelliJ IDEA 提供从 security matchers 到 Spring controllers 以及从 controllers 到 security matchers 的导航。
要从 Spring security 匹配器导航到控制器方法,请点击匹配器旁的
(例如 Spring Security 5.8 之前的
antMatchers、mvcMatchers、requestMatchers,或 Spring Security 5.8 及更高版本中的securityMatcher,或 XML URL 模式)。若要检查控制器的安全配置(并在该配置可用时导航至此配置),请点击
紧邻控制器URL并选择 显示 URL 的安全配置。

快速创建与数据库的连接
使用 数据库工具与 SQL 插件,IntelliJ IDEA 使您能够创建和管理 数据库连接。
在一个 Spring Boot 项目中,您可以从应用程序属性文件中立即创建它。
打开一个 application.properties 或 application.yml 文件。 如果它包含与 datasource 相关的属性(例如,
spring.datasource.url),datasource 图标将显示在护栏中。
点击
。 这将打开数据源创建表单,数据源参数(如 URL、用户名或数据库名称)将根据您配置文件中的数据进行填充。
如果数据源已配置,则会显示数据源图标
。 点击它以在 数据库 工具窗口中打开数据源。

以下是此操作可用的数据库列表:
Amazon Redshift
Apache Cassandra
Apache Derby
Couchbase
H2
HSQLDB
IBM Db2
MariaDB
Microsoft SQL 服务器
MongoDB
MySQL
Oracle 数据库
PostgreSQL
Redis
SQLite
Sybase
有关数据源参数的详细信息,请参阅 数据源。
未来计划?
这涵盖 IntelliJ IDEA 为 Spring 开发提供的所有基本功能。 您还可以查看 Spring 图 ,了解 Spring 应用程序中的依赖项概述,并阅读有关所涵盖 Spring Boot 功能的更多具体信息。