Spring-Boot

在 Docker Compose 中运行 PostgreSQL 和 Spring Boot

1、概览 本文将带你了解如何使用 Docker Compose 来运行 Spring Boot 和 PostgreSQL。 2、创建 Spring Boot 应用 从 Spring Initializer 创建 Spring Boot 项目,添加 PostgreSQL 驱动和 Spring Data JPA 依赖。下载生成的 ZIP 文件并解压到文件夹后,就可以运行应用了: ./mvnw spring-boot:run 应用启动失败,因为连接数据库失败: *************************** APPLICATION FAILED TO START *************************** Description: Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class 3、Dockerfile 在使用 Docker Compose 启动 PostgreSQL 之前,需要将 Spring Boot 应用转化为 Docker 镜像。第一步是将应用打包为 JAR 文件:

Spring Boot Actuator

1、概览 本文将带你了解 Spring Boot Actuator,以及如何在 Spring Boot 和 WebFlux 中使用、配置和扩展这个监控工具,充分利用响应式编程模型。 2、Actuator 是啥? 从本质上讲,Actuator 为应用带来了生产就绪的功能。 有了 Actuator 后,监控应用程序、收集指标、了解流量或数据库状态就变得易如反掌。 这个库的主要好处是,可以获得生产级工具,而无需自己实际实现这些功能。 Actuator 主要公开应用的运行信息 - 健康状况、指标、信息、转储(dump)、环境等。它使用 HTTP 端点或 JMX Bean 与客户端进行交互。 一旦在 classpath 中添加了该依赖,多个端点就已经开箱即用。与大多数 Spring 模块一样,可以通过多种方式轻松配置或扩展它。 3、入门 首先,在 Spring Boot 项目中添加 spring-boot-actuator 依赖,以启用 Spring Boot Actuator。 Mave: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> 该依赖的版本号已经在 spring-boot-starter-parent 中声明了,所以只要你继承了 Parent 项目,不需要手动声明版本号。 Actuator 与技术无关,Actuator 将其模型定义为可插拔和可扩展的,而不依赖 MVC。因此,可以利用 MVC 和 WebFlux 作为底层 Web 实现,还可以通过实现正确的适配器来添加新的实现。也支持 JMX,无需任何额外代码即可暴露端点。 4、端点配置 4.2、默认端点和安全配置 Actuator 禁用了大部分端点。因此,默认情况下只有 /health 和 /info 这两个端点可用。

Spring Boot 最全面的入门教程

1、概览 Spring Boot 是一个基于 Spring 的框架,旨在简化 Spring 应用的配置和开发过程,通过自动配置和约定大于配置的原则,使开发者能够快速搭建独立、生产级别的应用程序。 本文将带你了解 Spring Boot 的核心内容,从基本的项目创建开始,内容包括了:应用配置、Thymeleaf 视图配置、Spring Security 配置、持久层配置、Web 层 Controller 配置以及异常处理和测试。 2、设置 首先,使用 Spring Initializr 生成基础项目。 生成的项目依赖于 Spring Boot Parent 项目: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <relativePath /> </parent> 初始依赖非常简单: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency> 3、应用配置 创建 Main Application 类: @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 这里使用的是 @SpringBootApplication 注解,这相当于同时使用了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 注解。

Spring 整合 Thymeleaf 模板引擎

1、概览 Thymeleaf 是一个 Java 模板引擎,用于处理和创建 HTML、XML、JavaScript、CSS 和文本。 本文将带你了解如何在 Spring 和 Spring Boot 应用中整合、使用 Thymeleaf。 该库具有极高的可扩展性,其天然的模板功能可以确保在没有后端的情况下制作模板原型。与其他流行的模板引擎(如 JSP)相比,这使得开发速度非常快。 2、Spring 整合 Thymeleaf 首先,来看看与 Spring 整合所需的配置。这需要使用 thymeleaf-spring 库。 在 Maven POM 文件中添加以下依赖: <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf</artifactId> <version>3.1.2.RELEASE</version> </dependency> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring5</artifactId> <version>3.1.2.RELEASE</version> </dependency> 注意,对于 Spring 4,必须使用 thymeleaf-spring4,而不是 thymeleaf-spring5。 通过 SpringTemplateEngine 类执行所有配置步骤。 可以在 Java 配置中将该类配置为 bean: @Bean @Description("Thymeleaf Template Resolver") public ServletContextTemplateResolver templateResolver() { ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(); templateResolver.setPrefix("/WEB-INF/views/"); templateResolver.setSuffix(".html"); templateResolver.setTemplateMode("HTML5"); return templateResolver; } @Bean @Description("Thymeleaf Template Engine") public SpringTemplateEngine templateEngine() { SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.

Spring Boot 对 CRaC(Coordinated Restore at Checkpoint)的支持

上周 发布 的 Spring 6.1 和 SpringBoot 3.2 都全面支持 CRaC(Coordinated Restore at Checkpoint)。 CRaC(Coordinated Restore at Checkpoint),翻译过来应该是 “检查点协调恢复”,如果你想了解有关 CRaC 的更多信息,请参阅 这里。 CRaC 是一个 OpenJDK 项目,可以对运行中的 JVM(Java 虚拟机)进行 “快照”,并将其状态(包括应用)存储到磁盘中。然后,在另一个时间点,可以将 JVM 从保存的检查点恢复到内存中。借助这个功能,你可以启动应用、预热并创建检查点(Checkpoint)。从保存的检查点恢复到内存主要依靠磁盘 I/O,这意味着恢复速度非常快(在毫秒级范围内)。 本文使用 SpringBoot Petclinic 项目来测试 SpringBoot 3.2 对 CRaC 的支持。 前提条件 要在 SpringBoot 3.2 中使用 CRaC,需要具备以下三个条件 支持 CRaC 的 JVM org.crac 的依赖 存放检查点的文件夹 使用的 JDK(Java 开发包)是 Azul Zulu 21.0.1 + CRaC,可从 此处 获取。该 JDK 适用于 x64 和 aarch64 CPU 架构,以及 JDK 17 和 JDK 21。

在 Spring Boot 中修改请求

1、概览 本文将带你了解如何在 HTTP 请求到达 Spring Boot 应用的 Controller 之前对其进行修改。Web 应用和 RESTful Web 服务经常使用这种方式来解决常见问题,例如在传入的 HTTP 请求到达实际 Controller 之前对其进行转换或过滤。这促进了松散耦合,大大减少了开发工作量。 2、使用 Filter 通常,应用需要执行一些通用的操作,如身份认证、日志记录、转义 HTML 字符等。Filter 是解决在任何 Servlet 容器中运行的应用的这些通用问题的最佳选择。 Filter 工作方式如下: 在 Spring Boot 应用中,以固定顺序注册 Filter,以实现以下目的: 修改请求 记录请求日志 检查请求是否经过认证或是否存在恶意脚本 决定拒绝或将请求转发给下一个 Filter 或 Controller 假设我们要转义 HTTP 请求体中的所有 HTML 字符,以防止 XSS 攻击。 首先定义 Filter: @Component @Order(1) public class EscapeHtmlFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { filterChain.doFilter(new HtmlEscapeRequestWrapper((HttpServletRequest) servletRequest), servletResponse); } } @Order 注解中的 value 值 1 表示所有 HTTP 请求首先通过 EscapeHtmlFilter Filter。还可以在 Spring Boot 配置类中定义 FilterRegistrationBean Bean 来注册 Filter,这可以为 Filter 定义 URL 模式。

Spring Boot 整合 Spring Batch

1、概览 Spring Batch 是一个强大的批处理框架,可用于开发健壮的批处理应用。 上一篇教程 介绍了 Spring Batch,本文将在此基础上带你了解如何使用 Spring Boot 设置和创建一个基本的批处理驱动应用。 2、Maven 依赖 首先,在 pom.xml 中添加 spring-boot-starter-batch 和 h2 依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>2.1.214</version> <scope>runtime</scope> </dependency> 3、定义简单的 Spring Batch Job 创建一个 Job,从 CSV 文件导入 coffee 清单,使用自定义 Processor 对其进行转换,并将最终结果存储到内存数据库中。 3.1、开始 首先,程序入口: @SpringBootApplication public class SpringBootBatchProcessingApplication { public static void main(String[] args) { SpringApplication.run(SpringBootBatchProcessingApplication.class, args); } } 可以看到,这是一个标准的 Spring Boot 应用。为了简单,一切配置都是使用默认值。 在 src/main/resources/application.properties 文件中定义如下属性: file.input=coffee-list.csv 该属性包含输入 coffee 列表的位置。每一行都包含 coffee 的品牌、产地和一些特征:

Spring Boot 动态修改 Logger 的日志级别

在 Spring Boot 应用中,默认使用 Logback 来记录日志。可以在 application.yaml 或者是 logback-spring.xml 中配置 Logger 的日志级别。 有以下几个常见的日志级别(从低到高): TRACE(跟踪):最低级别的日志,用于输出详细的调试信息,通常用于追踪代码的执行路径。 DEBUG(调试):用于输出调试信息,帮助开发人员调试应用程序。 INFO(信息):用于输出一般性的信息,例如应用程序的启动信息、重要事件等。 WARN(警告):用于输出警告信息,表示潜在的问题或不符合预期的情况,但不会影响应用程序的正常运行。 ERROR(错误):最高级别的日志,用于输出错误信息,表示发生了一个错误或异常情况,可能会影响应用程序的正常运行。 级别越低,包含的信息越详细,级别越高,包含的信息越严重和重要。当设置日志级别时,只有达到或高于该级别的日志才会被记录和输出,而低于该级别的日志将被忽略。如:如果将日志级别设置为 INFO,则会记录和输出 INFO、WARN 和 ERROR 级别的日志,而 DEBUG 和 TRACE 级别的日志将被忽略。这有助于控制日志的详细程度和输出量,以适应特定的调试或生产环境要求。 Log4j 建议只使用 ERROR、WARN、INFO、DEBUG 四个级别。 以 ROOT Logger 的配置为例 在 application.yaml 中配置 logging: level: ROOT: DEBUG 在 logback-spring.xml 中配置 首先,需要在 application.yaml 中配置 logback-spring.xml 配置文件的位置: logging: config: classpath:logback-spring.xml 然后,在 logback-spring.xml 中配置 ROOT Logger 的日志级别: <configuration> <!-- 继承 Spring 预定义的 Logback 配置 --> <include resource="org/springframework/boot/logging/logback/base.xml"/> <!

Spring Boot 定时推送 Websocket 消息

1、概览 本文将带你了解如何在 Spring Boot 中实现定时地往浏览器推送 WebSockets 消息。 另一种方法是使用服务器发送事件 (SSE),但本文不涉及这一点。 Spring 提供了多种调度方式。如 @Scheduled 注解,以及 Project Reactor 提供的 Flux::interval 方法,对于 Webflux 应用来说,该方法开箱即用,它还可以作为独立库用于任何 Java 项目。 此外,还有一些更专业的三方调度框架,如 Quartz Scheduler,但这不在本文范畴。 2、简单的聊天应用 在 上一篇文章 中,使用 WebSockets 构建了一个聊天应用。现在让我们用一项新功能来扩展它:聊天机器人。聊天机器人是向浏览器推送预定消息的服务器端组件。 2.1、Maven 依赖 先在 Maven 中添加必要依赖, pom.xml 如下: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-core</artifactId> </dependency> <dependency> <groupId>com.github.javafaker</groupId> <artifactId>javafaker</artifactId> <version>1.0.2</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> </dependency> 2.2、JavaFaker 使用 JavaFaker 库生成机器人信息。该库通常用于生成测试数据。在这里,用于为聊天室添加一位名为 “Chuck Norris” 的访客。 代码如下: Faker faker = new Faker(); ChuckNorris chuckNorris = faker.

Spring Boot 自定义 Jackson ObjectMapper

1、概览 Spring Boot 默认使用 Jackson ObjectMapper 实例来序列化和反序列化 JSON 格式的响应与请求。 本文将带你了解如何在 Spring Boot 中自定义 Jackson ObjectMapper 选项,以及配置序列化和反序列化选项的最常用方法。 2、默认配置 默认情况下,Spring Boot 禁用了以下功能: MapperFeature.DEFAULT_VIEW_INCLUSION DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES SerializationFeature.WRITE_DATES_AS_TIMESTAMPS 从一个简单的例子开始: 客户端向 /coffee?name=Lavazza 端点发送 GET 请求。 Controller 返回一个新的 Coffee 对象。 Spring 使用 ObjectMapper 将 POJO 序列化为 JSON。 使用 String 和 LocalDateTime 对象来演示自定义选项: public class Coffee { private String name; private String brand; private LocalDateTime date; // get / set 省略 } 定义一个简单的 REST Controller 来演示序列化: @GetMapping("/coffee") public Coffee getCoffee( @RequestParam(required = false) String brand, @RequestParam(required = false) String name) { return new Coffee() .