Spring 中 applicationContext.xml 与 spring-servlet.xml 的区别

1、简介 所有 Java Web 框架都建立在 Servlet Api 的基础之上。在基于 Spring 开发的 Java Web 应用中,有三个文件起着至关重要的作用。通常,按以下顺序将它们串联起来:web.xml -> applicationContext.xml -> spring-servlet.xml。 本文将带你了解 applicationContext.xml 和 spring-servlet.xml 之间的区别。 2、applicationContext.xml 反转控制(IoC)是 Spring 的核心。在使用 IoC 的框架中,通常由容器负责实例化、创建和删除对象。在 Spring 中,applicationContext 就扮演着 IoC 容器的角色。 在开发标准 J2EE 应用时,会在 web.xml 文件中声明 ContextLoaderListener。此外,还定义了一个 contextConfigLocation 来指定 XML 配置文件。 <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext*.xml</param-value> </context-param> 应用启动时,Spring 会加载该配置文件,并使用它创建 WebApplicationContext 对象。如果没有 contextConfigLocation,默认情况下,系统将查找 /WEB-INF/applicationContext.xml 来加载。 简而言之,applicationContext 是 Spring 的核心接口。它为应用提供配置信息。 在该文件中,提供了与应用相关的配置。通常,这些配置包括基本数据源、属性占位符文件(Property Place Holder)和用于项目本地化的消息源(Message Source),以及其他增强功能。 示例如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c" xmlns:p="http://www.

使用 Spring 和 Hibernate 进行表分区

简介 本文将带你了解如何使用 Spring 和 Hibernate 实现表分区。 表分区的目标是将一个大型表分割为多个较小的分区表,以便关联的表和索引记录可以放入内存缓冲池,从而实现更高效的查找或扫描操作。 使用 PostgreSQL 进行表分区 PostgreSQL 为 表分区 提供了三种策略: 列表分区(List Partitioning) 范围分区(Range Partitioning) Hash 分区(Hash Partitioning) 本例使用列表分区,按大洲来划分数据表。 例如,users 分区如下: CREATE TABLE users ( id bigint NOT NULL, first_name varchar(255), last_name varchar(255), registered_on timestamp(6), partition_key varchar(255), PRIMARY KEY (id, partition_key) ) PARTITION BY LIST (partition_key) CREATE TABLE users_asia PARTITION OF users FOR VALUES IN ('Asia') CREATE TABLE users_africa PARTITION OF users FOR VALUES IN ('Africa') CREATE TABLE users_north_america PARTITION OF users FOR VALUES IN ('North America') CREATE TABLE users_south_america PARTITION OF users FOR VALUES IN ('South America') CREATE TABLE users_europe PARTITION OF users FOR VALUES IN ('Europe') CREATE TABLE users_australia PARTITION OF users FOR VALUES IN ('Australia') posts 表分区如下:

在 Spring Boot 应用中使用 Filewatch 监控目录的变化

概览 有时我们需要在应用中监控本地磁盘上的某个目录,在目录中的文件发生变化时(创建、编辑、删除)进行相应的处理。 在 Java 中有好几种方式可以实现监控目录。 Java WatchService API:在 Java 7 中引入,属于低级 API。 Apache commons io:提供了一个用于监控文件系统事件的组件。 Spring Integration 的文件支持:这是 Spring integration 项目的一部分,该项目支持多种企业集成模式。 Spring Boot Developer Tools 中的 Filewatch: 它可以观察本地文件系统的变化。 本文将带你了解如何通过 Spring Boot Developer Tools 中的 Filewatch 来监控系统目录。它本身就是基于 Spring 构建,所以可以和 Spring Boot 无缝集成。 用例 我们希望通过将 csv 文件复制到特定位置(目录)来在应用中创建新的客户。一旦文件完全传输完成,就对其进行读取。然后,对 csv 文件进行验证、处理并移动到目标目录。以下是csv文件的示例: name, email, dob, info, vip James Hart,james.hart@gmail.com,12/05/2002,Information for James,No Will Avery,will.avery@gmail.com,23/10/1991,Information for Will,Yes Anne Williams,anne.williams@gmail.com,12/05/1975,Information for Anne,No Julia Norton,julia.norton@gmail.com,23/10/1984,Information for Julia,Yes csv 文件始终包含标题行和按特定顺序排列的 5 列。

Spring Boot + jOOQ 教程 - 5:多对多关系检索

上一教程 介绍了如何使用 jOOQ 检索一对多关系的记录。本文将带你了解如何使用 jOOQ 检索多对多关系的记录。 你可以通过 Github 获取到完整的源码。 在示例数据库中,有 bookmarks(书签)表和 tags(标签)表。每个书签可以关联多个标签,反之亦然,因此 bookmarks 表和 tags 表之间存在多对多的关系。 让我们看看如何获取书签列表以及与之关联的标签 首先,创建 BookmarkWithTags record。 package com.sivalabs.bookmarks.models; import java.util.List; public record BookmarkWithTags(Long id, String title, String url, List<TagInfo> tags) { public record TagInfo (Long id, String name){} } 使用 MULTISET Value 构造器获取多对多关系 使用 jOOQ 的 MULTISET Value Constructor 来获取书签列表和标签。 实现获取书签和标签,如下: package com.sivalabs.bookmarks.repositories; import com.sivalabs.bookmarks.models.BookmarkWithTags; import org.jooq.DSLContext; import org.springframework.stereotype.Repository; import java.util.List; import static com.sivalabs.bookmarks.jooq.Tables.BOOKMARK_TAG; import static com.

Spring Boot + jOOQ 教程 - 4:一对多关系检索

上一教程 中介绍了如何使用 jOOQ 检索一对一(*One-to-One)关系的记录。本文将带你了解如何使用 jOOQ 检索一对多(One-to-Many)关系的记录。 你可以在 Github 获取完整的源码。 在示例数据库中,有 users(用户)表和 bookmarks(书签)表。每个用户可以创建多个书签,因此 users 表和 bookmarks 表之间是一对多的关系。 让我们看看如何获取用户详细信息以及用户创建的书签。 首先,创建 UserWithBookmarks Record。 package com.sivalabs.bookmarks.models; import java.util.List; public record UserWithBookmarks(Long id, String name, String email, List<BookmarkInfo> bookmarks) { public record BookmarkInfo (Long id, String title, String url){} } 使用 MULTISET Value 构造器获取一对多关系 使用 jOOQ 的 MULTISET Value 构造函数来获取用户创建的书签列表。有关 MULTISET Value 构造函数的更多详情,请访问:https://www.jooq.org/doc/latest/manual/sql-building/column-expressions/multiset-value-constructor/。 此外,强烈推荐你阅读《jOOQ 3.15 的新 Multiset Operator 将如何改变你对 SQL 的看法》一文。 实现获取用户详细信息以及该用户创建的书签。 @Repository public class UserRepository { .

Spring Boot + jOOQ 教程 - 3:一对一关系检索

上一教程 介绍了如何使用 jOOQ 实现基本的 CRUD 操作。本文将带你了解如何使用 jOOQ 检索一对一(One-to-One)关系的记录。 你可以在 Github 上找到完整的源码。 一般来说,在显示记录列表时,只会显示记录的最基本的信息,当点击记录时,才会显示记录的完整信息。 在本示例应用中,用户列表只显示 id、name 和 email 基本信息。当点击详情时,才显示包含用户偏好(Preferences)的完整信息。 更新 findUserById() 方法,以获取用户偏好设置。 首先,创建 UserPreferences record。 public record UserPreferences(Long id, String theme, String language) { } 更新 User 类,使其包含 UserPreferences。 package com.sivalabs.bookmarks.models; public record User ( Long id, String name, String email, String password, UserPreferences preferences ) { public User(Long id, String name, String email, String password) { this(id, name, email, password, null); } public static User create(Long id, String name, String email, String password) { return new User(id, name, email, password, null); } } 在 SQL 中,可以使用 LEFT OUTER JOIN 查询获取关联数据,如下所示:

Spring Boot + jOOQ 教程 - 2:实现 CRUD 操作

在 上一教程 中,介绍了如何使用 testcontainers-jooq-codegen-maven-plugin 生成 jOOQ 代码,以及如何使用 jOOQ DSL 执行 SQL 查询。 本文将带你了解如何使用 jOOQ 对 USERS 表执行基本的 CRUD(创建、读取、更新、删除)操作。 你可以在 Github 上获取到完整的源码。 findAllUsers() 首先,从 USERS 表中获取所有用户。假设只检索 USERS 表中的 id、name、email 和 password 列。 创建 User record,如下: package com.sivalabs.bookmarks.models; public record User(Long id, String name, String email, String password) { } 在 UserRepository 类中实现 findAllUsers() 方法,如下: package com.sivalabs.bookmarks.repositories; import com.sivalabs.bookmarks.models.User; import org.jooq.DSLContext; import org.jooq.impl.SQLDataType; import org.springframework.stereotype.Repository; import java.util.List; import static com.sivalabs.bookmarks.jooq.tables.Users.USERS; import static org.

Spring Boot + jOOQ 教程 - 1:入门

jOOQ 是一个 Java 持久库,提供用于编写类型安全 SQL 查询的 SQL DSL。它支持大多数流行的数据库,如 MySQL、PostgreSQL、Oracle、SQL Server 等。 本文将带你了解如何在 Spring Boot 中使用 jOOQ 实现持久层。JOOQ 也可以在 Kotlin、Scala 等其他基于 JVM 的语言中使用。 本系列教程中,将带你学习如何在 Spring Boot 中使用 JOOQ 实现: 基本的 CRUD 操作 一对一关系检索 一对多关系检索 多对多关系检索 你可以在 Github 获取完整的源码。 前提条件 安装 JDK 17 或更高版本 安装任何容器运行时,如 Docker Desktop、OrbStack 等。 注意:jOOQ 不需要 Docker。只是使用 Testcontainers 进行 jOOQ 代码生成和测试需要一个容器运行时。 示例数据库 本教程使用下列示例数据库。 创建 Spring Boot 应用 使用 Spring Initializr 创建一个 Spring Boot 项目。选择 JOOQ Access Layer、Flyway Migration、PostgreSQL Driver 和 Testcontainers。

在 Spring Boot 微服务中使用 JWT Token 进行认证

Spring Boot 微服务需要对用户进行身份认证,其中一种方式是使用 JSON Web Token (JWT)。JWT 是一种开放标准(RFC 7519),它定义了一种紧凑的机制,用于在各方之间安全地传输信息。 本文将会带你了解如何在 Spring Boot 微服务项目中使用 JWT 进行身份认证。 JWT Token 概览 JWT 的体积相对较小。因此,它可以通过 URL 发送: POST 参数 HTTP 请求头 通过 HTTP Header 发送 Token 是最常见的方式。 JWT Token 包含一个实体(可以是用户或服务)的所有必要信息。 下图显示了使用 JWT 进行身份认证的典型用例。 示例应用 创建两个服务: AuthenticatorService:负责验证用户名和密码。验证成功后,该服务会生成并返回一个 JWT Token。 BlogService:受保护的服务。该服务包含一个 Filter,用于验证客户端发送的 JWT Token。验证成功后,该服务会返回业务数据。 下图显示了客户端与上述服务之间的交互。 AuthenticatorService Maven 依赖 添加 jjwt 依赖,用于生成 JWT Token。 <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> <!-- 其他依赖忽略 --> 实体 AuthenticatorService 包含一个 User 实体,用于表示用户凭证。如下: package com.

在 Spring 应用中使用 Fastjson2

Fastjson2 是 Fastjson 的一个重大升级版本。 以下摘自官方的介绍: FASTJSON 2是一个性能极致并且简单易用的Java JSON库。 FASTJSON 2是FASTJSON项目的重要升级,和FASTJSON 1相比,性能有非常大的提升,解决了autoType功能因为兼容和白名单的安全性问题。 性能极致,性能远超过其他流行 JSON 库,包括 jackson/gson/org.json,性能数据: https://github.com/alibaba/fastjson2/wiki/fastjson_benchmark 支持JDK新特性,包括JDK 11/JDK 17,针对compact string优化,支持Record,支持GraalVM Native-Image 完善的JSONPath支持,支持 SQL:2016 的 JSONPath 语法 支持Android 8+,客户端和服务器一套 API 支持Kotlin https://alibaba.github.io/fastjson2/kotlin_cn 支持JSON Schema https://alibaba.github.io/fastjson2/json_schema_cn 新增加支持二进制格式 JSONB https://alibaba.github.io/fastjson2/jsonb_format_cn 总得来说,提高了性能(拳打 Gson,脚踢 Jackson)和饱解决了饱受诟病的安全问题(因为 Fastjson 屡次爆出反序列化安全问题,在国内被戏称为 Bugjson)。 Fastjson2 确实一个款性能很高的 Json 库,API 也设计得比较简单、易用。本文将带你了解如何在 Spring 中使用 Fastjson2。 1、依赖 Fastjson2 采用 多模块 的结构设计,对 Spring 等框架的支持现独立在 extension 包中。 2.0.23 版本之后为了兼容 Spring 5.x / 6.x,将不同的版本独立出来了。 使用 Maven: <!-- Sring 5 --> <dependency> <groupId>com.