详细了解Spring Boot的特性

引言

在上一篇文章中,我们详细了解了"什么是 Spring Boot?",是时候讨论 Spring Boot 的特性细节了。毋庸置疑,Spring Boot 功能非常丰富,这就是为什么它现在被大多数 Java 项目使用的原因。在本文中,我们将详细讨论 Spring Boot 的特性细节。

如果您参加任何 Java/Spring Boot 面试,很可能您会被要求介绍 Spring Boot 的一些重要特性。

Spring Boot 提供了多种特性,可简化应用程序的开发、部署和管理。Spring Boot 围绕"约定优于配置"的理念,最大限度地减少了对样板代码的需求,使开发人员能够专注于构建强大且功能丰富的应用程序。在本文中,我们将讨论一些关键功能,这些功能让大部分Java 开发人员偏爱使用 Spring Boot 进行 Web 程序开发。从嵌入式 Web 服务器到自动配置和广泛的库生态系统,Spring Boot 简化了开发过程,并以最小的努力创建可用于生产的应用程序。让我们逐一深入了解 Spring Boot 的突出功能。

CommandLineRunner接口(启动初始化)

CommandLineRunner 是 Spring Boot 在测试功能时非常方便的功能之一,类似于 Core Java 中线程的 run() 方法。如果我们想在 Spring Boot 应用程序启动后运行某些特定代码,可以实现 CommandLineRunner 接口。此接口提供了一个 run() 方法,该方法在 SpringApplication.run() 完成之前被调用。同样,我们还可以使用 ApplicationRunner 接口。例如,以下代码演示了如何使用 CommandLineRunner 和 run() 方法:

java 复制代码
@Component 
public class MyCommandLineRunner implements CommandLineRunner {
    
    @Override 
    public void run(String... args) {
       // code that you want to run only once 
    } 
}

如果定义了多个 CommandLineRunner 或 ApplicationRunner bean,并且必须按特定顺序调用,那么您还可以使用 @Order 注释或实现 org.springframework.core.Ordered 接口。

注意:不要忘记在自定义运行器类的顶部应用 @Component 注释,否则您将不会在控制台上看到任何结果。许多开发人员都会犯这个错误,尤其是这个领域的初学者。

外部配置

Spring Boot 允许您将配置外部化,以便您可以在不同的环境中使用相同的应用程序代码。您可以使用各种外部配置源,包括 Java 属性文件、YAML 文件、环境变量和命令行参数。其中,.properties 和 .yml 是 Spring Boot 中最流行的两种格式。此外,建议在整个应用程序中坚持使用一种格式。如果在同一位置同时拥有 .properties 和 .yml 格式的配置文件,则 .properties 文件会优先被加载。

Profiles支持

Spring Profiles 提供了一种方法来分离应用程序配置的不同部分,并使其仅在特定环境中可用。我们可以在使用 @Component、@Configuration 或 @ConfigurationProperties 注解的类上添加 @Profile 注解,以限制它们在特定环境下的加载。例如,下面的代码演示了这一概念:

java 复制代码
@Profile("production") 
@Configuration 
public class ProductionConfig { 
        // ... 
}

在这个例子中,ProductionConfig 类只有在激活了 production 环境的情况下才会被加载。

此外,我们可以使用"spring.profiles.active"环境属性来描述哪些配置文件处于活动状态。例如,我们可以将其包含在"application.properties"中,如以下示例所示:

java 复制代码
spring.profiles.active=prod
Profiles组

有时我们可能需要创建多个配置文件来分隔工件。例如,我们可能有数据库配置文件和安全配置文件,分别用于启用数据库和安全功能。为了帮助解决这个问题,Spring Boot 为我们提供了定义配置文件组的功能。配置文件组允许我们为相关的配置文件组定义逻辑名称。例如,我们可以创建一个由 proddb 和 prodsecurity 配置文件组成的生产组。例如,我们需要在 application.properties 文件中输入以下条目。

java 复制代码
spring.profiles.group.production[0]=proddb 
spring.profiles.group.production[1]=prodsecurity

因此,现在可以使用'--spring.profiles.active=production'启动我们的应用程序,以一次性激活production、proddb 和 prodsecurity 配置文件。

JSON支持

Spring Boot 提供了与三个 JSON 映射库的集成:

  • Jackson
  • Gson
  • JSON-B

Jackson 是首选和默认库。Spring Boot 提供了 Jackson 的自动配置,它是 spring-boot-starter-json 的一部分。当 Jackson 位于类路径上时,会自动配置 ObjectMapper bean。同样,当 Gson 位于类路径上时,会自动配置 Gson bean,并提供了多个 spring.gson.* 配置属性用于自定义配置。此外,当 JSON-B API 和其实现在类路径上时,会自动配置 Jsonb bean。

Web 应用程序开发支持

Spring Web MVC 框架(通常称为"Spring MVC")是一个功能丰富的"模型-视图-控制器"Web 框架。Spring Boot 非常适合此类 Web 应用程序的开发。我们可以利用 Tomcat、Jetty、Undertow 等嵌入式服务器。为了开发 Web 应用程序,可以使用 spring-boot-starter-web 启动器快速启动并运行 Web 应用程序。此外,为了构建响应式 Web 应用程序,可以使用 spring-boot-starter-webflux 启动器。

如果您是 Spring Boot Web 应用程序的新手,可以按照 spring.io 文档中的"Hello World!"示例进行操作。spring.io/guides 上还有多篇涵盖 Spring MVC 的指南可供参考。

模板引擎支持

Spring MVC 支持多种模板技术,包括 Thymeleaf、FreeMarker 和 JSP。此外,许多其他模板引擎也包含了自己的 Spring MVC 集成。但是,Spring Boot 为以下模板引擎提供了自动配置支持:

  • Thymeleaf
  • FreeMarker
  • Groovy
  • Mustache

错误处理支持

默认情况下,Spring Boot 会提供一个 /error 映射,以实用的方式处理所有错误,并在 Servlet 容器中将其注册为"全局"错误页面。对于机器客户端,它会生成一个 JSON 响应,其中包含错误、HTTP 状态和异常消息的详细信息。对于浏览器客户端,有一个"whitelabel"错误视图,以 HTML 格式呈现相同的数据。但是,为了对其进行自定义,我们可以添加一个视图页面,该页面会解析为错误并显示相应的有意义消息。

为了完全替换默认行为,您可以实现 ErrorController 并注册该类型的 bean 定义,或者添加 ErrorAttributes 类型的 bean 以使用现有机制但替换内容。

Spring WebFlux支持

Spring WebFlux 是 Spring Framework 5.0 中引入的新反应式 Web 框架。与 Spring MVC 不同,它不需要 Servlet API。此外,它完全异步且无阻塞,并通过 Reactor 项目实现了反应式流规范。

Spring WebFlux 支持两种类型:函数式和基于注解的。基于注解的版本非常接近 Spring MVC 模型。

Spring Boot 支持以下嵌入式反应式 Web 服务器:Reactor Netty、Tomcat、Jetty 和 Undertow。但是,大多数开发人员通过使用适当的"Starter"来获得完全配置的实例。默认情况下,嵌入式服务器在端口 8080 上监听 HTTP 请求。

内置安全特性

默认情况下,如果 Spring Security 位于类路径中,Spring Boot 会在 Web 应用程序上提供最低级别的安全性。默认提供的基本安全功能包括:

  • 具有内存存储的 UserDetailsService(如果是 WebFlux 应用程序,则为 ReactiveUserDetailsService)bean 和一个带有生成密码的单个用户(有关用户的属性,请参阅 SecurityProperties.User)。
  • 整个应用程序(如果执行器位于类路径中,则包括执行器端点)的基于表单的登录或 HTTP Basic 安全性(取决于请求中的 Accept 标头)。
  • 用于发布身份验证事件的 DefaultAuthenticationEventPublisher。

对 SQL 数据库的支持

Spring 框架为使用 SQL 数据库提供了广泛支持,从使用 JdbcTemplate 的直接 JDBC 访问到完整的"对象关系映射"技术(如 Hibernate)。此外,Spring Data 还提供了额外的功能,例如直接从接口创建 Repository 实现,并使用约定从方法名称生成查询。

使用内存嵌入式数据库(如 H2、HSQL 和 Derby)开发应用程序通常更为便利。值得注意的是,内存数据库不提供持久存储。我们需要在应用程序启动时填充数据库,并准备好在应用程序结束时丢失数据。

Spring Boot 可以自动配置这些嵌入式数据库。我们只需要指定要使用的嵌入式数据库的构建依赖项,而不需要提供任何连接 URL。

JdbcTemplate

JdbcTemplate 和 NamedParameterJdbcTemplate 是 Spring 的自动配置类。事实上,我们可以通过 @Autowired 直接在我们的 bean 中使用它们。

JPA and Spring Data JPA

JPA(Java 持久性 API)是一种标准技术,它允许我们将对象"映射"到关系数据库。"starter-data-jpa"依赖项提供了一种快速入门方法。此外,您可以按照 spring.io 上的"使用 JPA 访问数据"指南并阅读 Spring Data JPA 和 Hibernate 参考文档。

Spring Data JDBC

Spring Data JDBC 为 JDBC 提供存储库支持,并将自动为 CrudRepository 上的方法生成 SQL。对于更高级的查询,提供了 @Query 注解。当所需依赖项位于类路径上时,Spring Boot 将自动配置 Spring Data 的 JDBC 存储库。我们可以通过提供单个依赖项 "starter-data-jdbc" 来添加到我们的项目中。有关 Spring Data JDBC 的完整详细信息,请参阅参考文档。

R2DBC

反应式关系数据库连接 (R2DBC) 项目将反应式编程 API 引入关系数据库。R2DBC 的 io.r2dbc.spi.Connection 提供了一种使用非阻塞数据库连接的标准方法。连接是通过 ConnectionFactory 提供的,类似于使用 JDBC 的 DataSource。ConnectionFactory 配置由 spring.r2dbc.* 中的外部配置属性控制。例如,您可以在 application.properties 中声明以下部分:

java 复制代码
spring.r2dbc.url=r2dbc:postgresql://localhost/test
spring.r2dbc.username=dbuser
spring.r2dbc.password=dbpass

对 NoSQL 数据库的支持

Spring Data 还提供了一些额外的项目,帮助我们访问各种 NoSQL 数据库,例如 MongoDB、Neo4J、ElasticSearch、Redis、GemFire 或 Geode、Cassandra、Couchbase、LDAP。实际上,Spring Boot 为 Redis、MongoDB、Neo4j、Solr、Elasticsearch、Cassandra、Couchbase、LDAP 和 InfluxDB 提供了自动配置。但是,我们可以使用其他项目,但必须自行配置。此外,请参阅 spring.io/projects/spring-data 上提供的相应参考文档。

MongoDB

MongoDB 是最流行的 NoSQL 数据库。它是一个开源 NoSQL 文档数据库。MongoDB 使用类似 JSON 的模式,而不是传统的基于表的关系数据。Spring Boot 提供了几种使用 MongoDB 的便捷方式,包括 "starter-data-mongodb" 和 "starter-data-mongodb-reactive" Starter。

对缓存的支持

只要通过 @EnableCaching 注解启用缓存支持,Spring Boot 就会自动配置缓存基础设施。简而言之,为了将缓存添加到服务的操作中,请将相关的注解添加到其方法中。例如,下面的代码演示了这个概念:

java 复制代码
@Component 
public class MyMathService {
    @Cacheable("piDecimals") 
    public int computePiDecimal(int precision) {
           ... 
    }
}

此示例演示了在可能代价高昂的操作中使用缓存。但是,在调用 computePiDecimal 之前,程序会在 piDecimals 缓存中查找与 i 参数匹配的条目。如果找到条目,则立即将缓存中的内容返回给调用者,并且不会调用该方法。否则,将调用该方法,并在返回值之前更新缓存。

消息传递支持

Spring 框架提供了与消息传递系统集成的广泛支持,通过使用 JmsTemplate 简化了 JMS API 的使用。但是,JMS API 是一个完整的异步接收消息的基础架构。Spring AMQP 为高级消息队列协议提供了类似的功能集。Spring Boot 还为 RabbitTemplate 和 RabbitMQ 提供了自动配置选项。此外,Spring Boot 还支持 Apache Kafka。

使用 RestTemplate 调用 REST 服务

当我们需要从应用程序调用远程 REST 服务时,可以使用 Spring 框架提供的 RestTemplate 类。由于 RestTemplate 的实例在使用前通常需要进行自定义,因此 Spring Boot 不提供任何单一的自动配置的 RestTemplate bean。但是,它会自动配置 RestTemplateBuilder,可用于在需要时创建 RestTemplate 实例。

使用 WebClient 调用 REST 服务

当我们进行响应式编程时,可以使用 WebClient 而不是 RestTemplate。与 RestTemplate 相比,WebClient 更加功能化并且完全响应式。简而言之,如果我们的类路径上有 Spring WebFlux,我们也可以选择使用 WebClient 来调用远程 REST 服务。

发送电子邮件

Spring 框架通过使用 JavaMailSender 接口提供了发送电子邮件的抽象。但是,Spring Boot 通过为其提供自动配置以及启动模块 starter-mail 进一步简化了该过程。此外,您可以访问参考文档以获取有关如何使用 JavaMailSender 的详细说明。

Spring Integration 支持

Spring Boot 提供了多种使用 Spring Integration 的便捷方式。它还包括 starter-integration Starter 用于此目的。此外,Spring Integration 还提供了对消息传递和其他传输(如 HTTP、TCP 等)的抽象。如果 Spring Integration 在您的类路径上可用,则通过 @EnableIntegration 注解进行初始化。

测试支持

Spring Boot 提供了许多实用程序和注解来帮助测试您的应用程序。测试支持由两个模块提供:"spring-boot-test"和"spring-boot-test-autoconfigure"。spring-boot-test 包含核心项目,而 spring-boot-test-autoconfigure 支持测试的自动配置。

Kotlin 支持

Spring Boot 通过利用其他 Spring 项目(如 Spring Framework、Spring Data 和 Reactor)中的支持来提供 Kotlin 支持。Kotlin 是一种针对 JVM(和其他平台)的静态类型语言,它允许编写简洁优雅的代码,同时提供与用 Java 编写的现有库的互操作性。此外,开始使用 Spring Boot 和 Kotlin 的最简单方法是遵循这个全面的教程。此外,您可以通过 start.spring.io 创建新的 Kotlin 项目。

容器镜像

显然,很容易将 Spring Boot fat jar 打包为 Docker 镜像。但是,在 Docker 镜像中复制和运行 fat jar 存在各种陷阱。为了更轻松地创建优化的 Docker 镜像,Spring Boot 支持向 jar 添加层索引文件。此外,它还提供了层列表以及应包含在其中的 jar 部分。

此外,可以使用 Dockerfiles 将 Spring Boot 应用程序容器化,或者使用 Cloud Native Buildpacks 创建可以在任何地方运行的兼容 Docker 的容器镜像。虽然只需在 Dockerfile 中写几行代码就可以将 Spring Boot fat jar 转换为 Docker 镜像。

尽管 Dockerfiles 只是构建 Docker 镜像的一种方式。构建 Docker 镜像的另一种方法是直接从 Maven 或 Gradle 插件使用 buildpacks。如果您曾经使用过 Cloud Foundry 或 Heroku 等应用程序平台,那么您可能使用过 buildpack。此外,您可以参考单个插件文档,了解如何将 buildpacks 与 Maven 和 Gradle 结合使用。

GraalVM 原生镜像支持

这是 Spring Boot 3.0 版本中引入的新功能。GraalVM 原生镜像提供了一种部署和运行 Java 应用程序的新方法,与 Java 虚拟机相比,它可以以更小的内存占用和更快的启动时间运行。

GraalVM 是一个高性能的 JDK,旨在加快用 Java 和其他 JVM 语言编写的应用程序的执行速度,同时还提供 JavaScript、Python 和许多其他流行语言的运行时。GraalVM 提供了两种运行 Java 应用程序的方法:在 HotSpot JVM 上使用 Graal 即时 (JIT) 编译器,或者作为提前 (AOT) 编译的原生可执行文件。

GraalVM 原生镜像是独立的可执行文件,可以通过提前编译处理 Java 应用程序来生成。原生镜像通常比 JVM 镜像占用的内存更小,启动速度更快。它们非常适合使用容器镜像部署的应用程序。GraalVM 原生镜像是一个完整的、特定于平台的可执行文件,我们不需要运送 Java 虚拟机来运行这些原生镜像。

相关推荐
V+zmm1013428 分钟前
基于微信小程序的乡村政务服务系统springboot+论文源码调试讲解
java·微信小程序·小程序·毕业设计·ssm
Oneforlove_twoforjob1 小时前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存
xmh-sxh-13141 小时前
常用的缓存技术都有哪些
java
搬码后生仔1 小时前
asp.net core webapi项目中 在生产环境中 进不去swagger
chrome·后端·asp.net
迷糊的『迷』1 小时前
vue-axios+springboot实现文件流下载
vue.js·spring boot
凡人的AI工具箱1 小时前
每天40分玩转Django:Django国际化
数据库·人工智能·后端·python·django·sqlite
AiFlutter1 小时前
Flutter-底部分享弹窗(showModalBottomSheet)
java·前端·flutter
J不A秃V头A2 小时前
IntelliJ IDEA中设置激活的profile
java·intellij-idea
DARLING Zero two♡2 小时前
【优选算法】Pointer-Slice:双指针的算法切片(下)
java·数据结构·c++·算法·leetcode
Lx3522 小时前
Pandas数据重命名:列名与索引为标题
后端·python·pandas