Spring-Boot

使用 Arthas 在 Spring 运行时获取配置值和配置来源

背景 众所周之,Spring / Spring Boot 应用的配置注入方式非常多: System Properties / System Env application.properties / application.yaml Spring Profile Spring Cloud Config 还有很多配置注入的方式你可以参阅 中文文档,可谓是令人眼花缭乱。 获取运行时具体配置 对于开发人员来说,在运行时怎样确定某个配置是否生效?它的具体值是什么? 通过 Arthas,只要一行命令就可以获取到。 例如,获取 server.port 的具体值: vmtool --action getInstances --className org.springframework.context.ConfigurableApplicationContext --express 'instances[0].getEnvironment().getProperty("server.port")'@String[7001] 获取具体的配置来源 但是这个配置是从哪里来的? 对于 spring boot 应用,可以打开一个新的 terminal 窗口,执行 telnet 127.0.0.1 3658 连接上Arthas。 直接 watch 下面的函数。 在原来窗口用上面的 vmtool 命令来获取 server.port 的值。 从 watch 返回结果中可以看到,server.port 值来源于 application.yml: watch org.springframework.boot.context.properties.source.ConfigurationPropertySourcesPropertySource findConfigurationPropertyPress Q or Ctrl+C to abort.Affect(class count: 1 , method count: 2) cost in 217 ms, listenerId: 5method=org.

在 Spring Boot 中嵌入 Keycloak 服务器

1、概览 Keycloak 是由 Red Hat 管理和在 Java 中由 JBoss 开发的开源身份和访问管理解决方案。 本文将带你了解如何在 在 Spring Boot 中嵌入 Keycloak 服务器,这样就能轻松启动预配置的 Keycloak 服务器。 Keycloak 也可以作为 独立服务器 运行,但需要下载并通过管理控制台进行设置。 2、Keycloak 预配置 服务器包含一组 Realm,每个 Realm 都是用户管理的独立单元。要对其进行预配置,我们需要指定一个 JSON 格式的 Realm 定义文件。 使用 Keycloak Admin 控制台 配置的所有内容都以 JSON 格式进行持久化。 我们的授权服务器将使用名为 baeldung-realm.json 的 JSON 文件进行预配置。文件中的几个相关配置如下: users:默认用户是 john@test.com 和 mike@other.com;对应的凭证也在这里。 clients:定义一个 ID 为 newClient 的客户端 standardFlowEnabled:设置为 true,激活 newClient 的授权码(Authorization Code)授权模式。 redirectUris:newClient 在成功验证后将重定向到的服务器 URL webOrigins:置为 +,为所有 redirectUris 的 URL 提供 CORS 支持 Keycloak 服务器会默认签发 JWT Token,因此无需为此进行单独配置。接下来看看 Maven 的配置。

Spring Boot 整合 Keycloak

1、概览 本文将带你了解如何设置 Keycloak 服务器,以及如何使用 Spring Security OAuth2.0 将 Spring Boot 应用连接到 Keycloak 服务器。 2、Keycloak 是什么? Keycloak 是针对现代应用和服务的开源身份和访问管理解决方案。 Keycloak 提供了诸如单点登录(SSO)、身份代理和社交登录、用户联盟、客户端适配器、管理控制台和账户管理等功能。 本文使用 Keycloak 的管理控制台,使用 Spring Security OAuth2.0 设置和连接 Spring Boot。 3、设置 Keycloak 服务器 设置和配置 Keycloak 服务器。 3.1、下载和安装 Keycloak 有多种发行版可供选择,本文使 Keycloak-22.0.3 独立服务器发行版。点击 这里 从官方下载。 下载完后,解压缩并从终端启动 Keycloak: unzip keycloak-22.0.3.zip cd keycloak-22.0.3 bin/kc.sh start-dev 运行这些命令后,Keycloak 会启动服务。如果你看到一行类似于 Keycloak 22.0.3 [...] started 的内容,就表示服务器启动成功。 打开浏览器,访问 http://localhost:8080,会被重定向到 http://localhost:8080/auth 以创建管理员进行登录: 创建一个名为 initial1 的初始管理员用户,密码为 zaq1!QAZ。点击 “Create”后,可以看到 “User Created” 的提示信息。 现在进入管理控制台。在登录页面,输入 initial 管理员用户凭证:

Spring Boot 整合 QueryDSL 及常见用法

QueryDSL 是一个用于构建类型安全查询的开源 Java ORM 框架。它提供了一种 Fluent 风格的 API 来构建和执行数据库查询,并提供了编译时类型检查,以避免常见的查询错误。QueryDSL 支持多种数据库,包括关系型数据库和 NoSQL 数据库,可以与多个持久化框架(如 JPA、Hibernate 等)整合使用。它简化了查询的编写过程,使得查询代码更易于理解、维护和重用。 QueryDSL 在 Spring Boot 中通常配合 Spring Data JPA 使用,它会根据定义的 JPA Entity 类自动生成对应的查询类。通过查询类,除了可以快速地进行基本的 CRUD 操作外还支持 JOIN、GROUP、子查询等复杂的检索。而这一切都无需编写任何 SQL 语句,代码即 SQL。 本文将会带你了解如何在 Spring Boot 中整合 QueryDSL + Spring Data JPA,以及 QueryDSL 的常见用法。 示例项目 本文使用到的软件版本: Java:21 Spring Boot:3.2.0 MySQL:8.0.26 添加依赖 创建 Spring Boot 应用,完整的 pom.xml 如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.0</version> <relativePath /> <!

Spring Boot 创建非 Web 应用

1、简介 Spring Boot 是一个出色、流行的框架,可以快速创建适用于各种用例的 Java 应用。其中最常见用法之一是使用嵌入式 Servlet 容器来作为 Web 服务器。 Spring Boot 也可以用于许多不需要 Web 服务器的应用,如:命令行应用、作业调度、批处理或流处理应用等。 本文将带你了解在没有 Web 服务器的情况下使用 Spring Boot 的几种不同方式。 2、依赖 防止 Spring Boot 应用启动嵌入式 Web 服务器的最简单方法就是不在依赖中包含 Web Server Starter。 这意味着在 Maven POM 或 Gradle build 文件中都不会包含 spring-boot-starter-web 依赖。相反,使用更基本的 spring-boot-starter 依赖来替代它。 注意,Tomcat 依赖有可能作为传递依赖包含在应用中。在这种情况下,可能需要将 Tomcat 从包含它的依赖中排除。 3、修改 Spring Application 另一种禁用 Spring Boot 内嵌 Web 服务器的方法是使用代码。 使用 SpringApplicationBuilder: new SpringApplicationBuilder(MainApplication.class) .web(WebApplicationType.NONE) .run(args); 或者,可以使用 SpringApplication: SpringApplication application = new SpringApplication(MainApplication.class); application.setWebApplicationType(WebApplicationType.NONE); application.run(args); 无论哪种方式,都可以在 classpath 上保留可用的 Servlet 和容器 API。这意味着仍然可以在不启动 Web 服务器的情况下使用 Web 服务器库。例如,使用它们来编写测试或在自己的代码中使用它们的 API,这就非常有用。

Spring Boot 中的 CharacterEncodingFilter

1、概览 本文将会带你了解 Spring Boot 中 CharacterEncodingFilter 的作用及其用法。 2、CharacterEncodingFilter CharacterEncodingFilter 是一个 Servlet Filter,可帮助我们为请求(Request)和响应(Response)指定字符编码。当浏览器未设置字符编码或我们希望对请求和响应进行特定处理时,该过滤器就非常有用。 3、实现 来看看如何在 Spring Boot 应用中配置该过 Filter。 首先,创建 CharacterEncodingFilter: CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); filter.setForceEncoding(true); 在本例中,将编码设置为了 UTF-8,你也可以根据需要设置其他编码。 这里还使用了 forceEncoding 属性,无论浏览器请求中是否存在编码,都强制执行指定的编码。由于该标志设置为 true,提供的编码也将应用于响应的编码。 最后,使用 FilterRegistrationBean 注册 Filter,它提供了配置来将 Filter 实例注册为过滤器链(Filter Chain)的一部分: FilterRegistrationBean registrationBean = new FilterRegistrationBean(); registrationBean.setFilter(filter); registrationBean.addUrlPatterns("/*"); return registrationBean; 在非 Spring Boot 的应用中,可以在 web.xml 文件中添加该 Filter,以获得相同的效果。 4、总结 本文介绍了 Spring 中 CharacterEncodingFilter 的作用以及配置方法。 Ref:https://www.baeldung.com/spring-boot-characterencodingfilter

在 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:

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.

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 配置示例: