教程:探索Spring支持功能
最后修改时间:2023年9月7日所需插件:Spring和Spring Boot(捆绑)
本教程对教程:创建您的第一个 Spring 应用程序进行了扩展,以展示 IntelliJ IDEA 如何帮助您编写代码、分析 Spring 应用程序并在运行时管理它。本教程假设您从使用 Spring Initializr 生成的简单Spring Boot Maven 项目开始。它应该已经具有用于构建 Web 应用程序的 Spring Boot Starter Web 依赖项。
本教程将指导您完成以下主题内容的步骤:
添加 JPA 和 H2 的依赖项,使您的 Spring 应用程序能够存储和搜索数据关系
编写并检查您的代码
运行您的应用程序并执行 HTTP 请求
添加 Spring Boot Actuator 进行高级运行状况监控和端点分析
添加 Spring Boot 开发者工具以加快应用程序更新速度
添加 JPA 和 H2 的依赖项
Spring Data JPA模块使用 Java Persistence API (JPA) 提供对数据访问的支持。
H2是一个用Java编写的快速内存SQL数据库。
打开项目根目录中的pom.xml文件。
在编辑器中打开pom.xml文件后,转到代码|生成 然后选择Dependency。AltInsert
在“依赖项”工具窗口中,找到并添加需要的 Maven 依赖项:
org.springframework.boot:spring-boot-starter-data-jpa
com.h2database:h2
或者,您可以手动将这些依赖项添加到pom.xml中:
<依赖关系> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </依赖关系> <依赖关系> <groupId>com.h2database</groupId > <artifactId >h2</artifactId> </依赖项>
单击弹出窗口或单击加载更新的项目结构。CtrlShift0O
创建将存储在数据库中的 JPA 实体
要为 Spring 应用程序定义数据模型,请创建一个 JPA 实体。应用程序将创建并Customer
具有 ID、姓名和姓氏的对象。
在src/main/java/com/example/springboottutorial下创建Customer.java文件。
在“项目”工具窗口中,选择src/main/java/com/example/springboottutorial目录,然后选择“文件”|“新|主菜单中的Java类(或按并选择Java类)。选择类并输入类别名称:。AltInsert
Customer
修改默认模板或将其替换为以下Java代码:
包com.example.springboottutorial;导入jakarta.persistence.Entity;导入jakarta.persistence.GenerateValue;导入jakarta.persistence.GenerationType;导入jakarta.persistence.Id;@Entity public class Customer { @Id @GenerateValue(strategy = GenerationType.AUTO) private Integer id;白人字符串名字;黑人字符串姓氏;公共整数 getId() { 返回 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() { 返回姓氏; } public void setLastName(String lastName) { this.lastName = lastName; } }
该
@Entity
注释表明该类Customer
是一个 JPA 实体,应该转换为数据库中相应的表。IntelliJ IDEA 将其指定为in the gutter。注释
@Id
表明该id
字段是对象的 ID。IntelliJ IDEA 将其指定为in the gutter。告诉@GeneratedValue
JPA 应自动生成 ID。所有其他实体属性打开(
firstName
在我们的示例中)均在安装订线中lastName
指定为。您可以在持久性视图中快速使用它属性。
创建存储库接口
Spring Data JPA 将在运行时从该接口创建一个存储库实现。
在src/main/java/com/example/springboottutorial下创建CustomerRepository.java文件。
在“项目”工具窗口中,选择src/main/java/com/example/springboottutorial目录,然后选择“文件”|“新|主菜单中的Java类(或按并选择Java类)。选择接口并输入接口名称:。AltInsert
CustomerRepository
修改默认模板或将其替换为以下Java代码:
包com.example.springboottutorial;导入 org.springframework.data.repository.CrudRepository;公共接口 CustomerRepository 扩展 CrudRepository<Customer, Integer> { Customer findCustomerById(Integer id); } }
该存储库适用于
Customer
实体和Integer
ID。它还声明了该findCustomerById()
方法。Spring Data JPA 将根据该方法的签名派生一个查询,该查询将选择Customer
指定 ID 的对象。您可以尝试添加其他方法来查看 IntelliJ IDEA 如何根据可用的 JPA 实体(在本例中为类Customer
)提供了完整的建议。
创建网络控制器
控制器处理 Spring 应用程序的 HTTP 请求。应用程序将使用/add
端点将对象添加Customer
到数据库,使用端点从数据库/list
获取所有对象,并使用端点查找具有指定 ID 的客户。Customer
/find/{id}
在/src /main /java /com /example /springboottutorial/下创建DemoController.java文件。
在Project工具窗口中,选择/src /main /java /com /example /springboottutorial/目录,然后选择File | 新 | 主菜单中的Java 类(或按并选择Java 类)。选择类并输入类的名称:。
AltInsertDemoController
修改默认模板或将其替换为以下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 注入customerRepository
bean,该 bean 是从存储库接口实现的。IntelliJ IDEA在装订线中指定它,您可以单击它以导航到相应的自动装配依赖项。提示
您可以使用意图操作和后缀完成来快速查找和注入 bean。
该
@PostMapping("/add")
注释将该addCustomer()
方法映射到/add
.注释
@RequestParam
将方法参数映射到相应的 Web 请求参数。该
@GetMapping("/list")
注释将该getCustomers()
方法映射到 的 GET 请求/list
。该
@GetMapping("/find/{id}")
注释将该findCustomerById()
方法映射到 的 GET 请求/find/{id}
。该
@PathVariable
注释将代替id
变量的值从 URL 映射到相应的方法参数。
IntelliJ IDEA 在装订线中指定了 Web 请求方法,您可以单击该方法在内置HTTP 客户端中执行相应的请求。
运行您的应用程序并执行请求
按或使用SpringBootTutorialApplication.java文件装订线中的图标来运行您的应用程序。ShiftF10
默认情况下,IntelliJ IDEA 在运行工具窗口中显示正在运行的 Spring Boot 应用程序。
Console选项卡显示 Spring 日志消息的输出。默认情况下,内置 Apache Tomcat 服务器正在侦听端口 8080。
打开 Web 浏览器并转到http://localhost:8080/list。您应该看到您的应用程序响应一个空列表,
[ ]
因为数据库中没有任何客户。要添加客户,您需要向端点发送 POST 请求
/add
,并使用指定名字和姓氏的请求参数。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/list
IntelliJ 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 的客户。例如:
###
GET http://localhost:8080/find/1
添加 Spring Boot 执行器
Spring Boot Actuator添加了许多端点来帮助您监视和管理应用程序。这使得 IntelliJ IDEA 能够公开应用程序的运行状况信息以及运行时可用的所有请求映射。
打开项目根目录中的pom.xml文件。
转到代码| 生成 然后选择Dependency。AltInsert
在“依赖项”工具窗口中,找到并添加 Spring Boot Starter Actuator 依赖项:
org.springframework.boot:spring-boot-starter-actuator
或者,您可以手动添加依赖项:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
单击弹出窗口或按加载更新的项目结构。CtrlShift0O
使用或重新启动 Spring 应用程序,然后在运行工具窗口中打开Actuator选项卡。CtrlF5
打开“运行状况”选项卡以监控应用程序的状态。
打开“映射”选项卡以与请求映射端点进行交互。
默认情况下,它显示所有端点,包括库提供的端点,例如 Spring Boot Actuator 本身。单击端点路径可直接运行相应的请求,生成并在 HTTP 请求文件中打开,以便在需要时修改和执行,或者如果是 GET 请求,则在 Web 浏览器中打开端点 URL。
运行工具窗口中的执行器选项卡显示运行时可用的端点,不一定是代码中声明的所有请求映射。要查看代码中实际声明的端点,请使用端点工具窗口 ( View | Endpoints )。
添加 Spring Boot 开发者工具
当您对代码进行更改时,您需要重新运行整个项目:关闭应用程序及其所有依赖项,重建代码,使用新代码启动应用程序。IntelliJ IDEA 提供了一种仅重新启动 Spring 应用程序上下文的方法,而无需重新启动所有外部库上下文。这可以在具有大量依赖项的大型项目中节省时间,特别是在调试和调整代码时。您还可以更新正在运行的应用程序中的静态资源和模板资源。
此功能基于spring-boot-devtools模块。
打开项目根目录中的pom.xml文件。
转到代码| 生成 然后选择Dependency。AltInsert
在“依赖项”工具窗口中,找到并添加 Spring Boot Developer Tools 依赖项:
org.springframework.boot:spring-boot-devtools
或者,您可以手动添加依赖项:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
单击弹出窗口或按加载更新的项目结构。CtrlShift0O
转到“运行”| 编辑配置并选择SpringBootTutorialApplication配置。
在“修改选项”下,将“更新”操作时和框架停用选项设置为“更新类和资源”,然后单击“确定”应用更改。
重新启动您的 Spring 应用程序。
您的应用程序将同样工作,但现在每当您对源代码或资源进行更改时,您都可以触发更新。选择运行 | 调试操作| 从主菜单更新“SpringBootTutorialApplication”应用程序 或将焦点从 IntelliJ IDEA 更改为另一个应用程序,例如 Web 浏览器。这将更新您的应用程序的所有类和资源,并在必要时重新启动您的应用程序。CtrlF10
更改主页
为了演示应用程序更新的工作原理,让我们在主页上公开/add
和HTTP 端点。/list
有关添加主页的更多信息,请参阅添加主页。
打开/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://localhost:8080/find/2发送 HTTP 请求来查找 ID 为 2 的客户。
您可以更改index.html中的 HTML 代码,然后切换到 Web 浏览器并在刷新页面后查看更改。
您可以更进一步,安装LiveReload,这样浏览器就会自动刷新。
生产力技巧
快速注入豆子
IntelliJ IDEA 提供了多种快速注入 Bean 的方法,这使您无需手动键入注释和字段或构造函数。
在 Spring 组件中,开始输入 bean 名称。
使用以下方法之一获取所需的 bean:
按并选择添加名称匹配 'bean name' 的依赖项。AltEnter
开始输入 Bean 名称并输入
.autowire
以调用后缀完成模板。例如,输入custom.autowire
可查找以 开头的 beancustom
。
如果输入的名称与 bean 的名称完全匹配,它将立即注入。如果它只匹配名称的一部分,您可以从打开的“选择 Bean”窗口中选择所需的 Bean。
如果一个类具有用 注释的字段@Autowire
,这将添加一个新@Autowire
字段。否则,它会将相应的参数添加到类构造函数中。
或者,您可以按并从“生成”上下文菜单中选择注入类型:@Autowired Dependency、Constructor Dependency或Setter Dependency。与上面描述的方法不同,此方法允许您选择注入 Bean 的方式,并且不会过滤 Bean,因此您可以预览所有这些 Bean。AltInsert
导航到安全 URL
如果您使用Spring Security,您可能已经制定了安全规则,例如仅允许经过身份验证的用户或具有特定角色的用户访问 URL。IntelliJ IDEA 提供从安全匹配器到 Spring 控制器以及从控制器到安全匹配器的导航。
要从 Spring 安全匹配器导航到控制器方法,请单击匹配器旁边的(例如
antMatchers
,在 Spring Security 5.8 之前或在 Spring Security 5.8 及更高mvcMatchers
版本中,或在 XML URL 模式中)。requestMatchers
securityMatcher
要检查控制器的安全配置(如果可用,则导航到此配置),请单击控制器 URL 旁边的 并选择显示 URL 的安全配置。
笔记
要禁用嵌入提示图标,请按图标旁边的 并选择隐藏受保护的 URL 嵌入。要禁用嵌入提示图标,请按图标旁边的 并选择隐藏当前语言的 URL 路径嵌入。AltEnterAltEnter
要重新启用它们,请打开 IDE 设置 ( ),转至编辑器 | 嵌入提示,并在URL 路径下选择所需的复选框。CtrlAlt0S
下一步是什么?
本主题介绍了 IntelliJ IDEA 为 Spring 开发提供的所有基本功能。您还可以查看Spring 图,了解 Spring 应用程序中的依赖项概述,并阅读有关主题的Spring Boot功能的更多具体信息。
感谢您的反馈意见!