教程

在 Spring Boot 运行时获取监听的端口号

1、概览 Spring Boot 应用嵌入了一个 Web 服务器,有时候我们可能希望在运行时获取 HTTP 端口。 本文将带你了解如何在 Spring Boot 应用中以编程式的方式获取 HTTP 端口。 2、示例 2.1、Spring Boot 应用 创建一个简单的 Spring Boot 应用示例,演示如何在运行时获取 HTTP 端口: @SpringBootApplication public class GetServerPortApplication { public static void main(String[] args) { SpringApplication.run(GetServerPortApplication.class, args); } } 2.2、设置端口号的两种方式 通常,配置 Spring Boot 应用 HTTP 端口的最直接方法是在配置文件 application.properties 或 application.yml 中定义端口。 例如,在 application.properties 文件中,可以将 7777 设置为应用的运行端口: server.port=7777 另外,也可以不定义固定端口,而是通过将 server.port 属性值设置为 0,让 Spring Boot 应用在随机端口上运行: server.port=0 3、运行时获取固定端口 创建一个 properties 文件 application-fixedport.properties,并在其中定义固定端口 7777:

以 String 形式读取 HTTP 响应体

1、简介 本文介绍了以字符串形式读取 HTTP 响应体的几种方式。 2、HttpClient Java 11 中添加了 HttpClient,用于访问 Web 资源。与 HttpURLConnection 不同的是,HttpClient 除了支持 HTTP/1.1 和 HTTP/2 外,它还提供同步和异步请求类型。 HttpClient 提供了一个现代化的 API,具有很大的灵活性和强大的功能。该 API 由三个核心类组成:HttpClient、HttpRequest 和 HttpResponse。 HttpResponse 描述了 HttpRequest 调用的结果。HttpResponse 并非直接创建,而是在完全接收到正文(Body)后才可用。 首先创建 HttpClient 和 HttpRequest 对象: HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(DUMMY_URL)) .build(); 然后,使用 BodyHandlers 并调用 ofString() 方法返回 String 响应: HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); 3、HttpURLConnection HttpURLConnection 是一个轻量级 HTTP 客户端,用于通过 HTTP 或 HTTPS 协议访问资源,它允许创建一个 InputStream。获得 InputStream 后,就可以像读取普通本地文件一样读取它。 在 Java 中,可以用来访问互联网的主要类是 java.

Netflix Feign 与 OpenFeign

1、概览 本文将会带你了解 Spring Cloud Netflix Feign 与 Spring Cloud OpenFeign 之间的区别。 2、Feign 通过 Feign 提供的注解支持,我们只需要定义接口就可以实现 Web 客户端,非常简单。 最初,Feign 由 Netflix 创建并发布,是其 Netflix OSS 项目的一部分。如今,它已成为一个开源项目。 2.1、Spring Cloud Netflix Feign Spring Cloud Netflix 将 Netflix OSS 产品集成到 Spring Cloud 生态系统(全家桶)中。其中包括 Feign、Eureka、Ribbon 以及大量其他工具和实用程序。Feign 被单独定义在一个 Spring Cloud Starter 中,以便只使用 Feign。 2.2、OpenFeign 后来,Netflix 决定停止在内部使用 Feign 并停止其开发。根据这一决定,Netflix 将 Feign 完全转移到开源社区的一个名为 OpenFeign 的新项目中。 幸运的是,它继续得到开源社区的大力支持,并推出了许多新功能和更新。 2.3、Spring Cloud OpenFeign 同样,Spring Cloud OpenFeign 将 OpenFeign 项目集成到 Spring Cloud 生态系统中。 这种集成增加了对 Spring MVC 注解的支持,并提供相同的 HttpMessageConverter。

Spring Boot 中 @ComponentScan 与 @EnableAutoConfiguration 的区别

1、简介 本文将带你了解 Spring Boot 中 @ComponentScan 和 @EnableAutoConfiguration 注解的作用以及它们之间的区别。 2、Spring 注解 注解使 Spring 中依赖注入的配置变得更容易。可以在类和方法上使用 Spring Bean 注解来定义 Bean,而不是使用 XML 配置文件。之后,Spring IoC 容器会配置和管理 Bean。 本文主要关注如下注解: @ComponentScan:用于扫描带有注解的 Spring 组件。 @EnableAutoConfiguration:用于启用自动配置。 3、它们的区别 这俩注解的主要区别在于 @ComponentScan 会扫描 Spring 组件,而 @EnableAutoConfiguration 则用于自动配置 Spring Boot 应用中存在于 classpath 中的 Bean。 3.1、@ComponentScan 在开发应用时,需要告诉 Spring 框架如何查找受 Spring 管理的组件。@ComponentScan 使 Spring 能够扫描配置、Controller、Service 和我们定义的其他组件。 其中,@ComponentScan 注解与 @Configuration 注解一起使用,用于指定 Spring 扫描组件的包: @Configuration @ComponentScan public class EmployeeApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.

检测 Spring 事务是否处于活动状态

1、概览 本文将带你了解在代码中检测 Spring 事务的几种方法。 2、事务配置 要在 Spring 中运行事务,必须启用事务管理。如果使用的是Spring Boot 项目,并且依赖了 spring-data- 或 spring-tx,Spring 会默认启用事务管理。否则,必须手动启用事务并明确提供事务管理器(Transaction Manager)。 首先,需要在 @Configuration 类中添加 @EnableTransactionManagement 注解。这样,在项目中就可以使用 Spring 注解驱动的事务管理了。 接下来,必须提供 PlatformTransactionManager 或 ReactiveTransactionManager Bean。该 Bean 需要一个数据源。可以选择使用一些常用库,如 H2 或 MySQL 库。这不是本文的重点。 启用事务后,就可以使用 @Transactional 注解来开启事务。 3、TransactionSynchronizationManager Spring 提供了一个名为 TransactionSychronizationManager 的类。该类有一个名为 isActualTransactionActive() 的静态方法可以让我们知道自己是否处于事务。 测试如下,用 @Transactional 注解一个测试方法。在方法中断言 isActualTransactionActive() 返回 true: @Test @Transactional public void givenTransactional_whenCheckingForActiveTransaction_thenReceiveTrue() { assertTrue(TransactionSynchronizationManager.isActualTransactionActive()); } 同样,删除 @Transactional 注解时,测试应断言返回 false: @Test public void givenNoTransactional_whenCheckingForActiveTransaction_thenReceiveFalse() { assertFalse(TransactionSynchronizationManager.isActualTransactionActive()); } 4、Spring 事务日志 也许你并不需要以编程式的方式来检测事务,可能只是想在应用的日志中查看事务发生的时间,可以在 properties 文件中启用 Spring 的事务日志:

Spring 加载时织入(Load-Time Weaving)

简介 本文将带你了解 Spring 加载时织入(Load-Time Weaving)是如何工作的,以便在运行时应用 Hibernate 字节码增强机制。 一般来说,字节码增强机制是在使用 Maven 或 Gradle 插件构建项目时应用的。 Domain Model 假设有以下 Attachment 实体,如下: @Entity @Table(name = "attachment") public class Attachment { @Id private Long id; private String name; @Enumerated @Column(name = "media_type") private MediaType mediaType; @Lob @Column(columnDefinition="BLOB") @Basic(fetch = FetchType.LAZY) private byte[] content; // get、set 和其他方法省略 } content 属性使用的是 FetchType.LAZY 抓取策略,但在 POJO 实体上无法懒加载实体属性,因此需要 Hibernate 字节码增强机制来实现这一目标。 Hibernate 字节码增强机制 Hibernate 字节码增强机制允许我们更改 JPA 实体的字节码,这样就可以拦截 getter 和 setter 方法调用,从而达到以下目的 懒加载属性 记录实体的修改 如上所述,字节码增强机制是通过 Maven 或 Gradle 插件配置的,该插件会在项目构建时增强实体类。

Spring Cloud Azure 教程

本文将会带你了解如何使用 Spring Cloud 来简化 Spring Boot 应用与 Azure 服务之间的整合,以及如何利用 Azure Spring Apps 服务在 Azure 上部署、运行和管理应用。本文中的示例 Spring Boot 应用将数据存储在 Azure Cosmos DB 服务中,并在 Public URL 下公开一些 REST 端点。我们可以在本地运行它并连接远程服务,也可以将它部署到云上并在同一虚拟网络下连接这些内部服务。 如果你需要了解 Spring Cloud,可以参阅 “Spring Boot 3 整合 Spring Cloud 开发微服务应用”。也推荐看一看 Spring Cloud Azure 文档,以便对主要概念有一个基本的了解。 架构 我们的架构非常简单。如上所述,我们有一个在 Azure 上运行并连接 Cosmos DB 的 Spring Boot 应用(图中为 account-service)。它提供一些 REST 端点,用于添加、删除或搜索由 Cosmos DB 支持的账户。它还将所需的全部配置(如 Cosmos DB 地址和凭证)存储在 Azure App Configuration 服务中。该应用程序由 Azure Spring Apps 服务管理。架构图如下: 源码 如果你想自己尝试,可以克隆我的 GitHub 仓库。本文使用的 Spring Boot 应用位于 microservices/account-service 目录中。进入该目录后,只需按照说明操作即可。

Swagger UI 设置 JWT

1、简介 本文将带你了解如何在 Spring Boot 中配置 Swagger UI,使其在调用 API 时包含 JWT(JSON Web Token)。 2、Maven 依赖 本例使用 springdoc-openapi-ui 库,它包含了使用 Swagger 和 Swagger UI 所需的所有依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-ui</artifactId> <version>1.7.0</version> </dependency> 3、Swagger 配置 首先,需要配置 JWT SecurityScheme: private SecurityScheme createAPIKeyScheme() { return new SecurityScheme().type(SecurityScheme.Type.HTTP) .bearerFormat("JWT") .scheme("bearer"); } 然后,配置 OpenAPI Bean,包含 API Info 和 Security Scheme: @Bean public OpenAPI openAPI() { return new OpenAPI().addSecurityItem(new SecurityRequirement(). addList("Bearer Authentication")) .components(new Components().addSecuritySchemes ("Bearer Authentication", createAPIKeyScheme())) .

Spring Boot 中的 DispatcherServlet 和 web.xml

1、概览 DispatcherServlet 是 Spring Web 应用的前端控制器(Front Controller)。它用于在 Spring MVC 中创建 Web 应用和 REST 服务。在传统的 Spring Web 应用中,该 Servlet 是在 web.xml 文件中定义的。 本文将会带你了解如何在 Spring Boot 项目中配置 DispatcherServlet,以及如何配置 web.xml 中的 Filter、Servlet 和 Listener。 2、Maven 依赖 首先,在 pom.xml 文件中添加 spring-boot-starter-web Maven 依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> 3、DispatcherServlet DispatcherServlet 接收所有 HTTP 请求,并将其调度给 Controller 类。 在 Servlet 3.x 规范发布之前,DispatcherServlet 会在 Spring MVC 应用的 web.xml 文件中注册。自 Servlet 3.x 规范发布后,可以使用 ServletContainerInitializer 以编程方式注册 Servlet。 web.xml 文件中的 DispatcherServlet 配置示例:

start.spring.io 创建旧版本的 Spring Boot 项目

Spring Initializr(start.spring.io)是由 Spring Boot 官方提供的一个开源的 Spring Boot 项目初始化器。它提供了一个简单易用的界面来创建和配置 Spring 项目的初始代码。通过这个网站,开发者可以选择所需的 Spring Boot 版本、语言、构建工具(如 Maven 或 Gradle)、依赖和其他项目设置。 由于 Spring Boot 飞速发展,紧跟官方更新的 Spring Initializr 中可选择的 Spring Boot 版本、Java 版本也在随之迭代升级。所以,通过 Spring Initializr 可能无法选择旧版本的 Spring Boot。 截止撰稿时,start.spring.io 中最低的 Spring Boot 版本为 3.1.6,而目前大多数人用的仍然是 Spring Boot 2。 本文将会带你了解如何通过 start.spring.io 创建旧版本的 Spring Boot 项目。 手动修改版本号 你可以直接从 start.spring.io 创建任意 Spring Boot 和 Java 版本的 Spring Boot 项目,然后手动修改 pom.xml 或者 build.gradle 中的版本配置即可: 以 Maven 项目为例,只需要修改 pom.xml 中的 2 个配置元素即可: