2022就业季|Spring认证教你,如何使用 Spring 构建 REST 服务

简介: REST 已迅速成为在 Web 上构建 Web 服务的事实标准,因为它们易于构建且易于使用。

REST 已迅速成为在 Web 上构建 Web 服务的事实标准,因为它们易于构建且易于使用。

关于 REST 如何适应微服务世界还有一个更大的讨论,但是——对于本教程——让我们看看构建 RESTful 服务。

为什么是 REST?REST 包含 Web 的规则,包括其架构、优势和其他一切。这并不奇怪,因为它的作者 Roy Fielding 参与了十几个管理网络运行方式的规范。

有什么好处?Web 及其核心协议 HTTP 提供了一系列功能:

合适的行动 ( GET, POST, PUT, DELETE, ...)
缓存
重定向和转发
安全性(加密和身份验证)
这些都是构建弹性服务的关键因素。但这还不是全部。网络是由许多微小的规范构成的,因此它能够轻松发展,而不会陷入“标准战争”的泥潭。

开发人员能够利用 3rd 方工具包来实现这些不同的规范,并立即让客户端和服务器技术触手可及。

通过在 HTTP 之上构建,REST API 提供了构建方法:

向后兼容的 API
可演进的 API
可扩展的服务
安全的服务
一系列无状态服务到有状态服务
重要的是要意识到,无论多么普遍,REST本身并不是一种标准,而是一种方法、一种风格、一组对您的架构的约束,可以帮助您构建 Web 规模的系统。在本教程中,我们将使用 Spring 产品组合来构建 RESTful 服务,同时利用 REST 的无堆栈特性。

入门
在完成本教程时,我们将使用Spring Boot。转到Spring Initializr并将以下依赖项添加到项目中:

网络
JPA
H2
将名称更改为“工资单”,然后选择“生成项目”。A.zip会下载。解压它。在里面你会发现一个简单的、基于 Maven 的项目,包括一个pom.xml构建文件(注意:你可以使用 Gradle。本教程中的示例将基于 Maven。)

Spring Boot 可以与任何 IDE 一起使用。您可以使用 Eclipse、IntelliJ IDEA、Netbeans 等。Spring Tool Suite是一个开源的、基于 Eclipse 的 IDE 发行版,它提供了 Eclipse 的 Java EE 发行版的超集。它包括使使用 Spring 应用程序更加容易的功能。这绝不是必需的。但是,如果您想要为您的击键带来额外的魅力,请考虑一下。

到目前为止的故事……​
让我们从我们能构建的最简单的东西开始。事实上,为了尽可能简单,我们甚至可以省略 REST 的概念。(稍后,我们将添加 REST 以了解差异。)

大图:我们将创建一个简单的工资单服务来管理公司的员工。我们将员工对象存储在(H2 内存中)数据库中,并访问它们(通过称为JPA的东西)。然后我们将使用允许通过 Internet 访问的东西(称为 Spring MVC层)包装它。

以下代码在我们的系统中定义了一个 Employee。

nonrest/src/main/java/payroll/Employee.java

package payroll;

import java.util.Objects;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

@Entity

class Employee {

private @Id @GeneratedValue Long id;

private String name;

private String role;

Employee() {}

Employee(String name, String role) {

this.name = name;

this.role = role;

}

public Long getId() {

return this.id;

}

public String getName() {

return this.name;

}

public String getRole() {

return this.role;

}

public void setId(Long id) {

this.id = id;

}

public void setName(String name) {

this.name = name;

}

public void setRole(String role) {

this.role = role;

}

@Override

public boolean equals(Object o) {

if (this == o)

return true;

if (!(o instanceof Employee))

return false;

Employee employee = (Employee) o;

return Objects.equals(this.id, employee.id) && Objects.equals(this.name, employee.name)

&& Objects.equals(this.role, employee.role);

}

@Override

public int hashCode() {

return Objects.hash(this.id, this.name, this.role);

}

@Override

public String toString() {

return "Employee{" + "id=" + this.id + ", name='" + this.name + '\'' + ", role='" + this.role + '\'' + '}';

}

}

尽管很小,但这个 Java 类包含很多:

@Entity是一个 JPA 注释,用于使该对象准备好存储在基于 JPA 的数据存储中。
id, name, 和role是我们的 Employee域对象的属性。id用更多的 JPA 注释标记以指示它是主键并由 JPA 提供程序自动填充。
当我们需要创建一个新实例但还没有 id 时,会创建一个自定义构造函数。
有了这个域对象定义,我们现在可以转向Spring Data JPA来处理繁琐的数据库交互。

Spring Data JPA 存储库是与支持针对后端数据存储创建、读取、更新和删除记录的方法的接口。在适当的情况下,一些存储库还支持数据分页和排序。Spring Data 根据接口中方法命名中的约定来综合实现。

除了 JPA 之外,还有多个存储库实现。您可以使用 Spring Data MongoDB、Spring Data GemFire、Spring Data Cassandra 等。对于本教程,我们将坚持使用 JPA。

Spring 使访问数据变得容易。通过简单地声明以下EmployeeRepository接口,我们将能够自动

创建新员工
更新现有的
删除员工
查找员工(一个、全部或按简单或复杂属性搜索)
nonrest/src/main/java/payroll/EmployeeRepository.java

package payroll;

import org.springframework.data.jpa.repository.JpaRepository;

interface EmployeeRepository extends JpaRepository<Employee, Long> {

}

为了获得所有这些免费功能,我们所要做的就是声明一个扩展 Spring Data JPA 的接口,JpaRepository将域类型指定为Employeeid 类型Long。

Spring Data 的存储库解决方案可以回避数据存储细节,而是使用特定于域的术语解决大多数问题。

信不信由你,这足以启动应用程序!Spring Boot 应用程序至少是一个public static void main入口点和@SpringBootApplication注解。这告诉 Spring Boot 尽可能提供帮助。

nonrest/src/main/java/payroll/PayrollApplication.java

package payroll;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class PayrollApplication {

public static void main(String... args) {

SpringApplication.run(PayrollApplication.class, args);

}

}

@SpringBootApplication是一个引入组件扫描、自动配置和属性支持的元注释。在本教程中,我们不会深入探讨 Spring Boot 的细节,但本质上,它将启动一个 servlet 容器并提供我们的服务。

然而,没有数据的应用程序不是很有趣,所以让我们预加载它。Spring 将自动加载以下类:

nonrest/src/main/java/payroll/LoadDatabase.java

package payroll;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.boot.CommandLineRunner;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

class LoadDatabase {

private static final Logger log = LoggerFactory.getLogger(LoadDatabase.class);

@Bean

CommandLineRunner initDatabase(EmployeeRepository repository) {

return args -> {

log.info("Preloading " + repository.save(new Employee("Bilbo Baggins", "burglar")));

log.info("Preloading " + repository.save(new Employee("Frodo Baggins", "thief")));

};

}

}

加载时会发生什么?

CommandLineRunner加载应用程序上下文后,Spring Boot 将运行所有bean。
此运行程序将请求EmployeeRepository您刚刚创建的副本。
使用它,它将创建两个实体并存储它们。
右键单击并运行 PayRollApplication,这就是你得到的:

显示数据预加载的控制台输出片段

...2018-08-09 11:36:26.169 INFO 74611 --- [main] payroll.LoadDatabase:预加载员工(id=1,name=Bilbo Baggins,角色=窃贼)2018-08-09 11:36:26.174 INFO 74611 --- [main] payroll.LoadDatabase:预加载员工(id=2,name=Frodo Baggins,role=thief)...
这不是整个日志,而只是预加载数据的关键部分。(确实,检查整个控制台。这太棒了。)

.......未完待续......

以上就是今天关于Spring的一些讨论,对你有帮助吗?如果你有兴趣深入了解,欢迎到Spring中国教育管理中心留言交流!

相关文章
|
2月前
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
131 0
|
2月前
|
安全 前端开发 Java
随着企业应用复杂度提升,Java Spring框架以其强大与灵活特性简化开发流程,成为构建高效、可维护应用的理想选择
随着企业应用复杂度提升,Java Spring框架以其强大与灵活特性简化开发流程,成为构建高效、可维护应用的理想选择。依赖注入使对象管理交由Spring容器处理,实现低耦合高内聚;AOP则分离横切关注点如事务管理,增强代码模块化。Spring还提供MVC、Data、Security等模块满足多样需求,并通过Spring Boot简化配置与部署,加速微服务架构构建。掌握这些核心概念与工具,开发者能更从容应对挑战,打造卓越应用。
35 1
|
2月前
|
缓存 NoSQL Java
【Azure Redis 缓存】示例使用 redisson-spring-boot-starter 连接/使用 Azure Redis 服务
【Azure Redis 缓存】示例使用 redisson-spring-boot-starter 连接/使用 Azure Redis 服务
|
11天前
|
Java API 对象存储
微服务魔法启动!Spring Cloud与Netflix OSS联手,零基础也能创造服务奇迹!
这段内容介绍了如何使用Spring Cloud和Netflix OSS构建微服务架构。首先,基于Spring Boot创建项目并添加Spring Cloud依赖项。接着配置Eureka服务器实现服务发现,然后创建REST控制器作为API入口。为提高服务稳定性,利用Hystrix实现断路器模式。最后,在启动类中启用Eureka客户端功能。此外,还可集成其他Netflix OSS组件以增强系统功能。通过这些步骤,开发者可以更高效地构建稳定且可扩展的微服务系统。
28 1
|
1月前
|
前端开发 安全 Java
技术进阶:使用Spring MVC构建适应未来的响应式Web应用
【9月更文挑战第2天】随着移动设备的普及,响应式设计至关重要。Spring MVC作为强大的Java Web框架,助力开发者创建适应多屏的应用。本文推荐使用Thymeleaf整合视图,通过简洁的HTML代码提高前端灵活性;采用`@ResponseBody`与`Callable`实现异步处理,优化应用响应速度;运用`@ControllerAdvice`统一异常管理,保持代码整洁;借助Jackson简化JSON处理;利用Spring Security增强安全性;并强调测试的重要性。遵循这些实践,将大幅提升开发效率和应用质量。
54 7
|
1月前
|
缓存 Java 应用服务中间件
随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
58 2
|
2月前
|
Java Spring
【Azure Spring Cloud】Spring Cloud Azure 4.0 调用Key Vault遇见认证错误 AADSTS90002: Tenant not found.
【Azure Spring Cloud】Spring Cloud Azure 4.0 调用Key Vault遇见认证错误 AADSTS90002: Tenant not found.
|
2月前
|
Java 微服务 Spring
驾驭复杂性:Spring Cloud在微服务构建中的决胜法则
【8月更文挑战第31天】Spring Cloud是在Spring Framework基础上打造的微服务解决方案,提供服务发现、配置管理、消息路由等功能,适用于构建复杂的微服务架构。本文介绍如何利用Spring Cloud搭建微服务,包括Eureka服务发现、Config Server配置管理和Zuul API网关等组件的配置与使用。通过Spring Cloud,可实现快速开发、自动化配置,并提升系统的伸缩性和容错性,尽管仍需面对分布式事务等挑战,但其强大的社区支持有助于解决问题。
42 0
|
2月前
|
Java Spring 安全
Spring 框架邂逅 OAuth2:解锁现代应用安全认证的秘密武器,你准备好迎接变革了吗?
【8月更文挑战第31天】现代化应用的安全性至关重要,OAuth2 作为实现认证和授权的标准协议之一,被广泛采用。Spring 框架通过 Spring Security 提供了强大的 OAuth2 支持,简化了集成过程。本文将通过问答形式详细介绍如何在 Spring 应用中集成 OAuth2,包括 OAuth2 的基本概念、集成步骤及资源服务器保护方法。首先,需要在项目中添加 `spring-security-oauth2-client` 和 `spring-security-oauth2-resource-server` 依赖。
42 0
|
2月前
|
监控 Java API
Spring Boot中的异步革命:构建高性能的现代Web应用
【8月更文挑战第29天】Spring Boot 是一个简化 Spring 应用开发与部署的框架。异步任务处理通过后台线程执行耗时操作,提升用户体验和系统并发能力。要在 Spring Boot 中启用异步任务,需在配置类上添加 `@EnableAsync` 注解,并定义一个自定义的 `ThreadPoolTaskExecutor` 或使用默认线程池。通过 `@Async` 注解的方法将在异步线程中执行。异步任务适用于发送电子邮件、数据处理、外部 API 调用和定时任务等场景。最佳实践中应注意正确配置线程池、处理返回值和异常、以及监控任务状态,确保系统的稳定性和健壮性。
32 0
下一篇
无影云桌面