Spring Boot 注解 通过注解学习 Spring Boot 我们为什么关注 Spring 注解 Spring 注解概述 主类注解 REST 端点注解 周期性任务注解 Bean 注解 依赖注入速记 Spring 托管组件注解 持久化注解 杂项注解 测试注解 总结

2025-06-10

Spring Boot 注解通过注解学习 Spring Boot

为什么我们关心 Spring 注解

Spring 注解概述

主类注释

REST 端点注解

周期性任务注释

Bean 注解

关于依赖注入的简要说明

Spring 管理组件的注解

持久性注解

杂项注释

测试注解

概括

本博客将通过介绍 Spring Boot 中可用的注解,教你Spring Boot 的基础知识。Spring Apps 中的许多神奇功能都是通过诸如 、 和 之类的注解来实现@Bean@RestController@Component

蓝山

为什么我们关心 Spring 注解

Spring 有一些强大的概念,例如依赖注入 (DI),这得益于 Spring 管理的组件。所有带有 注释的类都是@ComponentDI 的候选对象,可以被其他类使用,而无需显式实例化。Spring 提供了一个名为“控制反转容器”的功能,它将在后台完成所有必要的注入,所有神奇的事情都无需开发人员进行任何操作😊 这是一个通过研究注释来学习 Spring 的绝佳示例:给定类的 Java 代码可能看起来完全正常,但当我们考虑这些元数据时,可以实现更丰富的功能(例如 DI)。许多这样的注释显著地增加了 Spring 独有的功能。

我敢说,学习 Spring 的一个好方法是理解最常见的注解。在本文的其余部分,我们将介绍不同的注解(来自 Spring 以及 javax.persistence),描述它们的用途,并展示一些代码示例。我还创建了一个包含所有描述的注解的 Java Spring Boot 应用程序,因此如果您想查看一个完整的示例,请查看我的Github 仓库

Spring 注解概述

首先,让我们概述一下我认为最重要的 Spring 注解。需要说明的是,我的选择面向对RESTful Web 服务感兴趣的人。对于其他人来说,最佳选择可能会略有不同。除了 Spring 注解之外,我们还将介绍 Javax Persistence API 中的元数据标签。这样做的原因是:我们几乎总是在后端使用数据库,而这是 Javax 支持的功能,而不是 Spring 支持的功能,所以我决定在这里介绍它。

以下是我们将介绍的注释列表:

注释列表

如上表所示,本博客涵盖了相当多的注解,因此我决定将它们按功能分组。让我们先从 Main 类中使用的语法元数据开始:

主类注释

本节涵盖:

  • @SpringBootApplication

值得庆幸的是,在 Spring 应用中,我们的 Main 方法无需执行太多操作:我们无需编写任何逻辑来组装服务组件并启动它。相反,我们只需在 Main 类上添加 @SpringBootApplication 注解即可。这主要会触发两件事:首先,Spring Boot 将应用默认配置,例如套接字读取超时。其次,Spring 将搜索所有 Spring 管理的组件,例如带有 @RestController 注解的类。

我们的主类看起来是这样的:



@SpringBootApplication
public class SpringBootAnnotationsApplication {
  public static void main(final String[] args) {
    SpringApplication.run(SpringBootAnnotationsApplication.class, args);
  }
}


Enter fullscreen mode Exit fullscreen mode

可以在我的 Github 仓库中的 SpringBootAnnotationsApplication.java 中找到一个完整工作的示例。

REST 端点注解

本节涵盖:

  • @RestController
  • @RequestMapping
  • @PathVariable
  • @RequestBody

假设我们的 Web 服务需要能够响应多个 REST 请求。为了实现这一点,我们只需要一个带有 @RestController 注解的类,该类包含带有 @RequestMapping 注解的方法。每个方法代表一个 REST 端点。

当 REST 请求到达时,Spring 会自动搜索相应的方法,反序列化传入的请求,并将所有传入数据放入方法参数中,这样我们就可以执行自己的业务逻辑了。最终,我们的结果(一个 Java 对象)将被 Spring 序列化并通过 HTTP 返回。我们只需要关注方法的正确封装,它应该包含以下内容:URI、URI 路径参数、URI 查询参数、HTTP 请求正文和 HTTP 应答正文。



@RequestMapping(method = RequestMethod.PATCH, path = "/api/account/{accountId}")
public ResponseEntity<AccountRJ> activateAccount(
    @PathVariable(value = "accountId") Integer accountId,
    @RequestBody Integer startBalance) {
  // implement method ...
}


Enter fullscreen mode Exit fullscreen mode

以下是相应 REST 请求的示例:



PATCH https://www.../api/account/5
Request Body: "10"


Enter fullscreen mode Exit fullscreen mode

在我们的代码片段中,accountId应该是 5,startBalance应该是 10。REST 答案应该是 类型的对象AccountRJ。更具体地说,方法返回值应该是 类型ResponseEntity<T>。这是一个 Spring 类,包含所有 HTTP 回复数据,例如状态码、正文、标头等。

可以在我的 Github 仓库的 WeatherRestController.java 中找到一个完整工作的示例。

周期性任务注释

本节涵盖:

  • @Scheduled
  • @EnableScheduling

一些 Web 服务需要在后台执行定期工作,例如归档旧数据、汇总数据以创建统计数据等。Spring 使定期任务的实现变得如此简单:



@Configuration
@EnableScheduling
public class TaskConfig {
  @Scheduled(cron = "* * * * * ?")
  public void doTask() {
    System.out.println("hello world");
  }
}


Enter fullscreen mode Exit fullscreen mode

如你所见,我们需要的只是一个用 注释的类@EnableScheduling和一个用 注释的方法@Scheduled(cron=...)。此方法将根据我们的cron 表达式在后台运行,例如每 10 分钟或每小时运行一次。

可以在我的 Github 仓库的 WeatherStatsTask.java 中找到一个完整工作的示例。

Bean 注解

本节涵盖:

为了让你的应用快速启动并运行,Spring Boot 提供了许多合理的默认配置,例如 REST 配置(例如读取超时、连接超时)。我们可以通过定义自己的Bean来覆盖默认配置



@Configuration
public class RestConfig {
  @Bean public RestTemplate restTemplate(final RestTemplateBuilder builder) {
    return builder
        .setConnectTimeout(Duration.parse("PT5s"))
        .setReadTimeout(Duration.parse("PT10s"))
        .build();
  }
}


Enter fullscreen mode Exit fullscreen mode

如上所示,我们的 Bean 被放在一个@Configuration类中,并且方法带有 注释@Bean。返回类型在这里至关重要:每当 Spring 需要使用 时RestTemplate,它都会根据我们的规范进行配置。

可以在我的 Github repo 中的 JpaConfig.java 中找到一个完整工作的示例。

关于依赖注入的简要说明

让我们快速了解一下依赖注入的概念,因为这对于理解 Spring 管理的组件至关重要。

Spring 提供了一个控制反转(IoC)容器:Spring 无需手动初始化对象的所有成员,而是会注入所有必要的依赖项。在下图中,你可以看到一个类需要另一个类的对象:

亲子依赖关系

该类Parent包含一个Child对象:



public class Parent {
  private final Child child;
  public Parent(Child child) { this.child = child; }
}


Enter fullscreen mode Exit fullscreen mode

@Component现在我们可以用如下方式注释依赖关系:



@Component
public class Child {  }


Enter fullscreen mode Exit fullscreen mode

现在,当 Spring IoC 必须创建一个 Parent 类型的对象时,它将自动创建一个 Child 的对象,然后将该对象作为参数传递给 Parent 构造函数,从而创建一个初始化所有依赖项的对象。

请注意,复杂应用程序中的实际依赖链可能包含多个层次。Spring IoC 也适用于复杂的情况,例如一个类依赖另一个类,而另一个类又依赖第三个类,依此类推。此外,Spring IoC 甚至适用于接口依赖关系:当一个类需要某个接口类型的对象时,Spring 会搜索实现该接口的类并将其注入。

Spring 管理组件的注解

本节涵盖:

  • @成分
  • @服务
  • @Repository

现在您已经了解了依赖注入的概念,让我们关注指定 Spring 管理组件的三个不同注释:

  • @Component:此类在 Spring-ApplicationContext 中注册并成为依赖注入的候选。
  • @Service:与@Component含义相同,但用于应用程序的服务层(具有业务逻辑)。
  • @Repository:与@Component相同,但用于执行数据库访问的类。标准数据库异常将被Spring自动捕获并进行适当处理。

请注意,所有这些注释都将在类级别应用。

完整工作示例可在我的 Github repo 中找到:

  • @Components->AnnotationsAppProperties.java
  • @Service->WeatherService.java
  • @Repository->WeatherRepository.java

持久性注解

本节涵盖:

  • @实体
  • @ ID
  • @GeneratedValue
  • @EnableJpaRepositories
  • @EnableTransactionManagement

与前面几节类似,注解对于数据持久化非常有用:我们只需要正确的注解!以下示例仅关注 SQL 用例,并使用Spring Data Jpa。要进行ORM 映射,我们需要一个@Entity 类,如下所示:



@Entity
public class WeatherPO {
  @Id
  @GeneratedValue(strategy=GeneratorionType.IDENTITY)
  private Long id;
  private Integer temperature;
}


Enter fullscreen mode Exit fullscreen mode

在上面的代码中,WeatherPO 类保存了我们想要从关系数据库中表示的所有数据元素。第一个成员也带有注解,@Id表明这是主键。此外,我们定义了一个生成新主键的策略,同样使用了注解!

现在我们准备定义一个 JpaRepository,我们可以用它从数据库中获取 WeatherPO 对象:



@Repository
public interface WeatherRepository extends JpaRepository<WeatherPO, Long> {}


Enter fullscreen mode Exit fullscreen mode

当 Spring 看到该@Repository注解时,它会自动创建一个实现类来访问数据库。我们可以通过依赖注入来使用 Repository:



@Service
public class WeatherService {
  private final WeatherRepository repo;
  public WeatherService(WeatherRepository repo) { this.repo = repo; }

  public WeatherPO find(Long id) {
    return repo.getOne(id);
  }
}


Enter fullscreen mode Exit fullscreen mode

有关所有 JpaRepository 函数的完整列表(如getOne()上面的代码中使用),请查看此处的官方文档。

到目前为止,我们已经介绍了访问数据库所需的所有 Java 代码。为了使一切正常工作,我们还需要正确的 Maven 依赖项:Spring 的spring-boot-starter-data-jpa。SQL 数据库种类繁多,如果我们选择使用简单的 H2 数据库,则还需要一个 Maven 依赖项:com.h2database.h2

可选地,我们可以配置数据库(用户名、密码、URL 等)。需要注意的是,H2 数据库开箱即用,但对于其他数据库(例如 Oracle 数据库),则需要进行额外的配置。也就是说,您可以使用注解强制搜索存储库@EnableJpaRepositories,并创建自己的数据库相关 Bean @EnableTransactionManagement

完整工作示例可在我的 Github repo 中找到:

  • @Entity、@Id、@GeneratedValue->WeatherPO.java
  • @Repository->WeatherRepository.java
  • @EnableJpaRepositories,@EnableTransactionManagement-> JpaConfig.java

杂项注释

本节涵盖:

  • @Autowired
  • @ConfigurationProperties

@ConfigurationProperties可以用来自动从配置文件中获取配置值.properties.yaml并将它们以相同的数据结构放入我们的 Java 类中。这使我们能够在配置文件中设置配置值,以便以后轻松修改。

@Autowired强制依赖注入。我们需要在依赖链的根节点启动依赖注入机制。当我们要求 Spring 初始化顶层对象时,这将触发依赖链中所有对象的初始化和注入。@Autowired 注解可用于此目的,并将其放置在顶层对象之前。

完整工作示例可在我的 Github repo 中找到:

  • @ConfigurationProperties->AnnotationsAppProperties.java
  • @Autowired->WeatherIntegrationTest.java

测试注解

本节涵盖:

  • @SpringBootTest
  • @AutoConfigureMockMvc

Spring 提供了专门用于测试的注解,这是一个非常棒的功能,可以简化你的集成测试!由于这篇文章已经比原计划的要长一些,我就不多说了,建议你参考 WeatherIntegrationTest.java 中的完整示例。

概括

恭喜,你终于读完了这篇(相当长)的文章😊 希望这篇文章能帮助你理解 Spring 中最重要的注解。如果你想了解更多细节,我建议你看看我的Github 仓库,里面有一个完整运行的 Spring Boot 服务,使用了本文提到的所有注解。

此外,如果您有一个您认为必不可少的 Spring 注释,而它没有在这里介绍,请留下评论,我会尝试扩展这篇文章或创建一个包含您的注释的新文章。

最后,如果觉得有用的话请记得点赞❤️这篇文章哦!

鏂囩珷鏉ユ簮锛�https://dev.to/pmgysel/learn-spring-boot-by-annotations-1h0i
PREV
创建你的编程学习计划
NEXT
寻找最佳 React 表单库?它可能就在这个列表中