[TOC]
应用配置,在官方文档也称为配置外部化,意思就是在不同的环境中使用相同的程序代码,也就是将代码和配置进行分离。
Spring Boot支持多种外部配置源,包括 Java 属性文件、YAML 文件、环境变量和命令行参数。配置的属性值可以通过使用 @Value 注释直接注入到你的 bean 中,通过 Spring 的 Environment 抽象访问; 也可以通过 @ConfigurationProperties 绑定到结构化对象。
## 属性配置的优先级
Spring Boot 使用了一个非常特殊的 PropertySource 顺序,该顺序旨在允许合理地覆盖值。 属性按以下顺序考虑(后面的覆盖前面的):
1. 默认配置: 使用 `SpringApplication.setDefaultProperties` 指定
2. @Configuration 类上的 @PropertySource 注释。 请注意,在刷新应用程序上下文之前,此类属性源不会添加到环境中。 配置某些属性(例如 logging.* 和 spring.main.* 在刷新开始之前读取)就晚了。
3. 在application.properties 等配置文件的配置数据
4. 在random.*. 中的属性。 RandomValuePropertySource
5. OS环境变量
6. Java系统变量 (System.getProperties())
7. 在java:comp/env 中的JNDI属性
8. ServletContext 中的参数
9. ServletConfig 中的参数
10. SPRING_APPLICATION_JSON 的属性(嵌入在环境变量或系统属性中的内联 JSON)
11. 命令行参数
12. 测试的属性。 在@SpringBootTest 和测试注解上可用,用于测试应用程序的特定部分。
13. 测试上的@TestPropertySource
14. 当 devtools 处于活动状态时,$HOME/.config/spring-boot 目录中的 Devtools 全局设置属性。
配置数据文件按以下顺序考虑:
1. 打包在 jar 中的应用程序属性(application.properties 和 YAML 变体)。
2. 打包在 jar 中的特定于配置文件的应用程序属性(application-{profile}.properties 和 YAML 变体)。
3. 打包 jar 之外的应用程序属性(application.properties 和 YAML 变体)。
4. 打包 jar 之外的特定于配置文件的应用程序属性(application-{profile}.properties 和 YAML 变体)。
注意: 配置文件支持 .properties 和 .yml 两种格式, 如果两种格式的文件都有,则优先以 .properties 为准。
举例来看, 假设开发了一个使用 name 属性的 @Component,如以下所示:
```
@Component
public class MyBean {
@Value("${name}")
private String name;
// ...
}
```
在应用程序类路径上(例如,在 jar 中)您可以拥有一个 application.properties 文件,该文件为 name 提供了一个合理的默认属性值。 在新环境中运行时,可以在 jar 之外提供一个 application.properties 文件来覆盖名称。 对于一次性测试,可以使用特定的命令行开关启动(例如,java -jar app.jar --name="Spring")。在命令行参数可以覆盖这个配置 `java -jar app.jar --name="Spring"`
提示: env 和 configprops 端点可用于确定属性为何具有特定值。 您可以使用这两个端点来诊断意外的属性值。
## 1. 获取命令行属性
默认情况下,SpringApplication 将任何命令行选项参数(即以 -- 开头的参数,例如 `--server.port=9000`)转换为属性并将它们添加到 Spring Environment。 如前所述,命令行属性始终优先于基于文件的属性源。
如果不希望将命令行属性添加到环境中,可以使用`SpringApplication.setAddCommandLineProperties(false)`禁用。
## 2. JSON格式应用属性
环境变量和系统属性通常有限制,这意味着某些属性名称不能使用。 为了解决这个问题,Spring Boot 允许将一组属性编码为JSON 格式。
应用程序启动时,任何 spring.application.json 或 SPRING_APPLICATION_JSON 属性都将被解析并添加到环境中。
举例来看, SPRING_APPLICATION_JSON 属性可以在 UN*X shell 的命令行中作为环境变量提供:
`.$ SPRING_APPLICATION_JSON='{"my":{"name":"test"}}' java -jar myapp.jar`
将JSON作为系统属性
`java -Dspring.application.json='{"my":{"name":"test"}}' -jar myapp.jar`
将JSON作为命令行参数:
`$ java -jar myapp.jar --spring.application.json='{"my":{"name":"test"}}'`
如果您要部署到经典应用程序服务器,配置JNDI 变量
`java:comp/env/spring.application.json`
注意:
PropertySourcesPropertyResolver 将null 作为缺省值,所以null 值无法进行覆盖。
## 3. 外部应用程序属性
应用程序启动时,Spring Boot 会自动从以下位置查找并加载 application.properties 和 application.yaml 文件:
1. 从类路径
- 类根路径
-类路径 `/conifg` 目录
2. 从当前路径
- 当前路径
-当前路径 /config 子目录
- /config 子目录的直接子目录
该列表按优先级排序(较低项目的值覆盖较早的项目)。 来自加载文件的文档作为 PropertySource 添加到 Spring Environment。
如果不喜欢 application 作为配置文件名,可以通过指定 spring.config.name 环境属性来切换到另一个文件名。 例如,要查找 myproject.properties 和 myproject.yaml 文件,可以按如下方式运行应用程序:
`java -jar myproject.jar --spring.config.name=myproject`
还可以使用 spring.config.location 环境属性来引用显式位置。 此属性接受一个或多个要检查的位置的逗号分隔列表。
以下示例显示了如何指定两个不同的文件:
```
java -jar myproject.jar --spring.config.location=\
optional:classpath:/default.properties,\
optional:classpath:/override.properties
```
提示:使用前缀optional:如果位置是可选的并且不介意它们不存在。
特别注意: spring.config.name、spring.config.location 和 spring.config.additional-location 很早就用于确定必须加载哪些文件。 它们必须定义为环境属性(通常是操作系统环境变量、系统属性或命令行参数)。
如果 spring.config.location 包含目录(而不是文件),它们应该以 / 结尾。 在运行时,它们将在加载之前附加从 spring.config.name 生成的名称。 spring.config.location 中指定的文件是直接导入的。
注意: 目录和文件位置值也被扩展以检查特定于配置文件的文件。 例如,如果有一个 spring.config.location 的 classpath:myconfig.properties,您还会发现加载了相应的 classpath:myconfig-<profile>.properties 文件。
大多数情况下,添加的每个 spring.config.location 项都将引用单个文件或目录。 位置按照定义的顺序进行处理,后面的位置可以覆盖前面位置的值。
如果位置设置的比较复杂,并且使用特定profile的配置文件,可以进行位置分组。 位置组是所有被视为同一级别的位置的集合。 例如,对所有类路径位置进行分组,然后对所有外部位置进行分组。 位置组中的项目应以 ; 分隔。 有关更多详细信息,请参阅“特定Profile的文件”部分。
使用 spring.config.location 配置的位置替换默认位置。 例如,如果使用值 optional:classpath:/custom-config/,optional:file:./custom-config/ 配置 spring.config.location,则考虑的完整位置集是:
1. `optional:classpath:custom-config/`
2. `optional:file:./custom-config/`
如果需要添加其他位置,而不是替换它们,可以使用 spring.config.additional-location。 从其他位置加载的属性可以覆盖默认位置中的属性。 例如,如果 spring.config.additional-location 配置了值 optional:classpath:/custom-config/,optional:file:./custom-config/,则考虑的完整位置集是:
1. `optional:classpath:/;optional:classpath:/config/`
2. `optional:file:./;optional:file:./config/;optional:file:./config/*/`
3. `optional:classpath:custom-config/`
4. `optional:file:./custom-config/`
这种搜索顺序允许在一个配置文件中指定默认值,然后在另一个配置文件中选择性地覆盖这些值。 可以在默认位置之一的 application.properties(或您使用 spring.config.name 选择的任何其他基本名称)中为应用程序提供默认值。 然后可以在运行时使用位于自定义位置之一的不同文件覆盖这些默认值。
注意: 如果使用环境变量而不是系统属性,大多数操作系统不允许使用句点分隔的键名,但可以使用下划线代替(例如,SPRING_CONFIG_NAME 而不是 spring.config.name)。 有关详细信息,请参阅从环境变量绑定。
注意:如果应用程序在 servlet 容器或应用程序服务器中运行,则可以使用 JNDI 属性(在 java:comp/env 中)或 servlet 上下文初始化参数来代替或同时使用环境变量或系统属性。
#### 1. 可选位置 optional
默认情况下,当指定的配置数据位置不存在时,Spring Boot 将抛出 ConfigDataLocationNotFoundException 并且应用程序不会启动。
使用 `optional:` 前缀指定的配置路径, 则该路径的文件不存在也可以启动, 该前缀可以和spring.config.location spring.config.additional-location 以及 spring.config.import 一起使用。
举例来看:
spring.config.import 的值指定为 `optional:file:./myconfig.properties`, 则myconfig.properties文件不存在也可以启动。
使用spring.config.on-not-found 属性可以设置忽略所有 ConfigDataLocationNotFoundExceptions 异常, 使应用一直可以启动。 设置方式是通过 `SpringApplication.setDefaultProperties(…)` 或者系统/环境变量设置这个属性的值为 `ignore ` 。
#### 2. 通配符位置
如果配置文件位置包含最后一个路径段的 * 字符,则将其视为通配符位置。 加载配置时会扩展通配符,以便还检查直接子目录。 当有多个配置属性源时,通配符位置在 Kubernetes 等环境中特别有用。
例如,如果有一些 Redis 配置和一些 MySQL 配置,希望将这两个配置分开,同时要求它们都存在于 application.properties 文件中。 这可能会导致两个单独的 application.properties 文件挂载在不同的位置,例如 /config/redis/application.properties 和 /config/mysql/application.properties。 在这种情况下,通配符位置 config/*/ 将导致两个文件都被处理。
比如 Redis 配置文件 `/config/redis/application.properties`
MySQL的配置文件 `/config/mysql/application.properties`。
使用 `spring.config.location ` 或` spring.config.additional-location` 配置 `config/*/` 。
默认情况下,Spring Boot 在默认搜索位置包含 config/*/ 。 这意味着将搜索 jar 之外的 /config 目录的所有子目录。
可以自己使用带有 spring.config.location 和 spring.config.additional-location 属性的通配符位置。
注意: 通配符位置必须仅包含一个 * 并以 */ 结尾,表示搜索位置为目录,或以 */<filename> 结尾,表示搜索位置为文件。 带有通配符的位置根据文件名的绝对路径按字母顺序排序。
提示:通配符路径仅在外部路径,不能在 `classpath` 路径中使用。
#### 3 特定环境的配置文件
除了应用程序属性文件,Spring Boot 还将尝试使用命名约定 application-{profile} 加载特定于配置文件的文件。 例如,如果应用程序激活名为 prod 的配置文件并使用 YAML 文件,则 application.yml 和 application-prod.yml 都将被考虑。
特定于配置文件的属性从与标准 application.properties 相同的位置加载,特定于配置文件的文件始终覆盖非特定文件。 如果指定了多个配置文件,则采用最后获胜的策略。 例如,如果配置文件 prod,live 由 spring.profiles.active 属性指定,则 application-prod.properties 中的值可以被 application-live.properties 中的值覆盖。
注意:
最后获胜策略适用于位置组级别。 classpath:/cfg/,classpath:/ext/ 的 spring.config.location 不会与 classpath:/cfg/;classpath:/ext/ 具有相同的覆盖规则。
例如,继续上面的 prod,live 示例,可能有以下文件:
~~~
/cfg
application-live.properties
/ext
application-live.properties
application-prod.properties
~~~
当有 classpath:/cfg/,classpath:/ext/ 的 spring.config.location 时,在所有 /ext 文件之前处理所有 /cfg 文件:
1. `/cfg/application-live.properties`
2. `/ext/application-prod.properties`
3. `/ext/application-live.properties`
当使用 classpath:/cfg/;classpath:/ext/ 代替(使用 ; 分隔符)时,在同一级别处理 /cfg 和 /ext:
1. `/ext/application-prod.properties`
2. `/cfg/application-live.properties`
3. `/ext/application-live.properties`
环境有一组默认配置文件(默认情况下使用[default]),如果没有设置活动配置文件,则使用这些配置文件。 换句话说,如果没有明确激活配置文件,则考虑来自 application-default 的属性。
注意:属性文件只加载一次。 如果已经直接导入了配置文件特定的属性文件,则不会再次导入。
#### 4. 导入附加数据
应用程序属性可以使用 spring.config.import 属性从其他位置导入更多配置数据。 进口在被发现时进行处理,并被视为附加文件,紧接在声明进口的文件之下。
例如, application.properties 文件中可能包含以下内容:
```
spring:
application:
name: "myapp"
config:
import: "optional:file:./dev.properties"
```
这将触发在当前目录中导入 dev.properties 文件(如果存在这样的文件)。 导入的 dev.properties 中的值将优先于触发导入的文件。 在上面的示例中, dev.properties 可以将 spring.application.name 重新定义为不同的值。
一个导入无论声明多少次都只会被导入一次。 在 properties/yaml 文件中的单个文档中定义导入的顺序无关紧要。 例如,下面的两个示例产生相同的结果:
```
spring:
config:
import: my.properties
my:
property: value
```
```
my:
property: value
spring:
config:
import: my.properties
```
在上述两个示例中,来自 my.properties 文件的值将优先于触发其导入的文件。
可以在单个 spring.config.import 键下指定多个位置。 位置将按照定义的顺序进行处理,以后的导入优先。
注意:还考虑导入特定于配置文件的变体。 上面的示例将同时导入 my.properties 以及任何 my-<profile>.properties 变体。
提示: Spring Boot 包含可插入的 API,允许支持各种不同的位置地址。 默认情况下,您可以导入 Java 属性、YAML 和“配置树”。第三方 jar 可以提供对其他技术的支持(不要求文件是本地的)。 例如,您可以想象配置数据来自外部存储,例如 Consul、Apache ZooKeeper 或 Netflix Archaius。如果想支持自己的位置,请参阅 org.springframework.boot.context.config 包中的 ConfigDataLocationResolver 和 ConfigDataLoader 类。
#### 5. 导入无扩展名的文件
某些云平台无法为卷挂载文件添加文件扩展名。 要导入这些无扩展名的文件,需要给 Spring Boot 一个提示,以便它知道如何加载它们。 可以通过将扩展提示放在方括号中来做到这一点。
例如,假设有一个 /etc/config/myconfig 文件希望作为 yaml 导入。 可以使用以下命令从 application.properties 导入它:
```
spring:
config:
import: "file:/etc/config/myconfig[.yaml]"
```
#### 6. 使用配置树
在云平台上(比如Kubernetes) 直接配置会不安全。
许多云平台允许从数据卷中读取配置, 比如Kubernetes 可以批量挂载 ConfigMaps 和Secrets。
有两种常见的卷安装模式:
1. 单个文件包含一组完整的属性(通常编写为 YAML)。
2. 多个文件被写入目录树,文件名成为“键”,内容成为“值”。
第一种方式可以使用spring.config.import.导入其他文件,对于第二种情况,使用 configtree: 前缀,以便 Spring Boot 知道它需要将所有文件公开为属性。
举例来说, 文件结构:
```
etc/
config/
myapp/
username
password
```
文件username存储用户名, password是加密的内容。
要导入这些属性,可以将以下内容添加到 application.properties 或 application.yaml 文件中:导入如下:
```
spring:
config:
import: "optional:configtree:/etc/config/"
```
然后,您可以以通常的方式从环境中访问或注入 myapp.username 和 myapp.password 属性。
注意: 带有点符号的文件名也被正确映射。 例如,在上面的示例中,/etc/config 中名为 myapp.username 的文件将导致环境中的 myapp.username 属性。
提示: 配置树值可以绑定到字符串 String 和 byte[] 类型。
如果有多个配置树要从同一个父文件夹导入,可以使用通配符快捷方式。 任何以 /*/ 结尾的 configtree: location 将导入所有直接子项作为配置树。
例如:
```
etc/
config/
dbconfig/
db/
username
password
mqconfig/
mq/
username
password
```
可以使用 configtree:/etc/config/*/ 作为导入位置:
```
spring:
config:
import: "optional:configtree:/etc/config/*/"
```
注意: 使用通配符加载的目录按字母顺序排序。 如果您需要不同的顺序,那么您应该将每个位置作为单独的导入列出
配置树也可用于 Docker secrets。 当 Docker swarm 服务被授予访问机密的权限时,机密会被挂载到容器中。 例如,如果名为 db.password 的secret挂在到位置 /run/secrets/,您可以使用以下命令使 db.password 可用于 Spring 环境:
```
spring:
config:
import: "optional:configtree:/run/secrets/"
```
#### 7. 属性占位符
application.properties 和 application.yml 中的值在使用时会根据环境进行过滤,因此可以参考以前定义的值(例如,来自系统属性)。 标准的 ${name} 属性占位符语法可以在值内的任何地方使用。
例如,以下文件会将 app.description 设置为“MyApp is a Spring Boot application”:
```
app:
name: "MyApp"
description: "${app.name} is a Spring Boot application"
```
提示:可以使用此技术创建现有 Spring Boot 属性的“短”变体。 有关详细信息,请参阅“4. 使用“Short”(短)命令行参数”。
#### 8. 多文档文件的处理
Spring Boot 允许将单个物理文件拆分为多个独立添加的逻辑文档。 文档按顺序处理,从上到下。 后面的文档可以覆盖在前面的文档中定义的属性
对于 application.yml 文件,使用标准的 YAML 多文档语法。 三个连续的连字符代表一个文档的结束和下一个文档的开始。
例如下面的文件有两个逻辑文档:
```
spring:
application:
name: MyApp
---
spring:
application:
name: MyCloudApp
config:
activate:
on-cloud-platform: kubernetes
```
对于 application.properties 文件,使用` #---` 注释用于标记文档拆分, 比如:
```
spring.application.name=MyApp
#---
spring.application.name=MyCloudApp
spring.config.activate.on-cloud-platform=kubernetes
```
![](https://img.kancloud.cn/ba/34/ba34faf0cc82fdb5c99e4d51cea57b29_106x30.png)注意: 属性文件分隔符不能有任何前导空格,并且必须正好有三个连字符。 分隔符前后的行不能是注释。
![](https://img.kancloud.cn/b1/2a/b12adb9ce1e7765f0ea5e264e56b8707_90x33.png)提示: 多文档属性文件通常与 spring.config.activate.on-profile 等激活属性结合使用。
![](https://img.kancloud.cn/8c/8b/8c8b191b86c066271d62c24f554d68fc_143x30.png)警告:使用 @PropertySource 或 @TestPropertySource注解的多文档属性文件无法加载。
#### 9. 属性的激活
有时仅在满足某些条件时激活给定的属性 很有用。 例如,仅在特定配置文件处于活动状态时才相关的属性。
可以使用 spring.config.activate.* 有条件地激活属性文档。
激活属性可以使用:
| 属性 | 说明 |
| --- | --- |
| on-profile | 与文档匹配的Profile表达式会被激活|
| on-cloud-platform | 要使文档处于活动状态,必须检测到的 CloudPlatform。 |
例如,以下指定第二个文档仅在 Kubernetes 上运行时才处于活动状态,并且仅当“prod”或“staging”配置文件处于活动状态时:
```
myprop:
always-set
---
spring:
config:
activate:
on-cloud-platform: "kubernetes"
on-profile: "prod | staging"
myotherprop: sometimes-set
```
## 4. 加密属性
Spring Boot 不提供任何对加密属性值的内置支持,但是,它提供了修改 Spring Environment 中包含的值所需的钩子。 EnvironmentPostProcessor 接口允许您在应用程序启动之前操作环境。 详细参考[https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto.application.customize-the-environment-or-application-context。](https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto.application.customize-the-environment-or-application-context。)
如果寻找一种安全的方式来存储凭证和密码,Spring Cloud Vault 项目提供了在 HashiCorp Vault 中存储外部化配置的支持。
## 5. YAML的使用
YAML 是 JSON 的超集,是一种用于指定分层配置数据的便捷格式。 只要在类路径上有 SnakeYAML 库,SpringApplication 类就会自动支持 YAML 作为属性的替代方案
注意: 如果使用启动器,则 SnakeYAML 由 spring-boot-starter 自动提供。
#### 1. 将 YAML 映射到属性
YAML 文档需要从其分层格式转换为可与 Spring Environment 一起使用的平面结构。 例如,考虑以下 YAML 文档:
```
environments:
dev:
url: https://dev.example.com
name: Developer Setup
prod:
url: https://another.example.com
name: My Cool App
```
为了从 Environment 访问这些属性,它们将被展平如下:
```
environments.dev.url=https://dev.example.com
environments.dev.name=Developer Setup
environments.prod.url=https://another.example.com
environments.prod.name=My Cool App
```
同样,YAML 列表也需要扁平化。 它们表示为带有 [index] 解引用器的属性键。 例如,考虑以下 YAML:
```
my:
servers:
- dev.example.com
- another.example.com
```
前面的示例将转换为以下属性:
```
my.servers[0]=dev.example.com
my.servers[1]=another.example.com
```
提示:使用 [index] 表示法的属性可以使用 Spring Boot 的 Binder 类绑定到 Java List 或 Set 对象。 有关更多详细信息,请参阅下面的“类型安全配置属性”部分。
警告: 无法使用 @PropertySource 或 @TestPropertySource 批注加载 YAML 文件。 因此,如果需要以这种方式加载值,则需要使用属性文件。
#### 2. 直接加载 YAML
Spring Framework 提供了两个方便的类,可用于加载 YAML 文档。 YamlPropertiesFactoryBean 将 YAML 作为属性加载,而 YamlMapFactoryBean 将 YAML 作为 Map 加载。
如果要将 YAML 作为 Spring PropertySource 加载,也可以使用 YamlPropertySourceLoader 类
## 6. 配置随机值
RandomValuePropertySource 可用于注入随机值(例如,注入机密或测试用例)。 它可以生成整数、长整数、uuid 或字符串,如以下示例所示:
```
my:
secret: "${random.value}"
number: "${random.int}"
bignumber: "${random.long}"
uuid: "${random.uuid}"
number-less-than-ten: "${random.int(10)}"
number-in-range: "${random.int[1024,65536]}"
```
random.int* 语法是 OPEN value (,max) CLOSE,其中 OPEN,CLOSE 是任何字符,value,max 是整数。 如果提供了 max,则 value 是最小值,max 是最大值(不包括在内)。
## 7. 配置系统环境变量
Spring Boot 支持为环境属性设置前缀。 如果系统环境由具有不同配置要求的多个 Spring Boot 应用程序共享,这将非常有用。 系统环境属性的前缀可以直接在 SpringApplication 上设置。
使用场景: 多个不同配置需求的Spring Boot 应用共享系统环境变量。
比如设置前缀为input,那么remote.timeout等属性在系统环境中也会解析为input.remote.timeout。
- 前言
- 1. 基础篇
- Spring Boot 介绍
- 如何创建Spring Boot项目
- Spring Boot基本使用
- 1. 系统构建
- 2. 代码结构和开发
- 项目配置
- 配置文件
- pom.xml 配置说明
- 测试
- 测试介绍
- 测试注解
- 常见问题及解决
- Spring Boot测试示例
- Spring Boot Test 进行JPA 测试保存数据到数据库
- 常见开发类
- Web
- HttpEntity
- CommandLineRunner
- 开发IDE
- Eclipse开发设置
- 开发知识点
- 项目相关路径与资源获取
- 2. 数据篇
- Spring操作数据库的方式汇总
- Spring Data JPA
- Spring Boot操作数据库的方式
- Spring Boot+JPA CriteriaBuilder查询
- Spring Boot+JPA 有查询条件的查询
- CriteriaBuilder转sql语句
- DAO
- Spring Boot+JPA 查询数据方式与代码演示
- Spring JPA 接口和类
- CrudRepository
- JPA Native Query(原生查询)的缓存问题
- Eclipse下安装EclipseLink进行JPA开发
- Eclipse Link or Hibernate
- 配置参考
- Spring Boot多数据源配置
- 错误解决
- ORA-00932: inconsistent datatypes: expected - got CLOB
- hibernate in 的list 大小不能超过1000
- java.lang.IllegalArgumentException: Cannot create TypedQuery for query with more than one return using requested result type
- ava.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate class [XXX]
- JPA 基础
- Spring Jdbc 实现 Clob/Blob 类型字段的插入
- JPA Native Query(本地查询)及查询结果转换
- JPA如何查询部分字段
- JPA 主键策略
- JPA+EclipseLink+Oralce 通过GenerationType.AUTO 实现自增长字段
- JPA的persist() 和 merge() 方法的区别
- 关联
- 批量更新
- JPA重要知识点
- JPA中实体的状态
- 数据库操作技术
- JPA二级缓存
- JPA3
- 分页查询
- Spring Boot+JPA 事务
- Spring Boot 数据源
- Spring Boot 3 整合 H2 快速示例
- Spring Boot+JPA+Oralce 配置
- Spring Boot+JPA不同类型数据库的多数据源配置
- Spring Data JPA + Oracle
- Spring Boot + Oracle 处理Blob/Clob类型字段实例
- Spring Boot+JPA+Oracle Clob 类型字段查询处理
- Spring Boot + JPA + Oracle 自增长字段实现示例
- 内存数据库H2+Spring Boot
- 3. 实战篇
- 项目创建和管理
- 基于Maven创建多模块的Spring Boot项目
- 最佳实践
- REST —Java对象的字符串属性值转换为JSON对象的布尔类型值
- Spring Boot 项目中Java对象的字符串类型属性值转换为JSON对象的布尔类型键值的解决方法及过程
- [在线API]Spring Boot+springfox-swagger2 之RESTful API自动生成和测试
- Spring Boot与JWT整合实现前后端分离的用户认证之一
- 前后端分离的用户验证原理及Spring Boot + JWT的框架搭建(附完整的框架代码)之一
- 前后端分离的用户验证原理及Spring Boot + JWT的框架搭建(附完整的框架代码)之二
- SpringBoot应用中JSP的角色及整合
- Spring Boot项目中使用JSP实例
- Spring Boot 文件上传功能实现与简单示例
- Spring Boot+CKEditor 实现编辑器中的图片上传
- 开发注意事项
- 部署与维护
- SpringBoot项目在Gitee的控管步骤
- JSP如何获取Spring Boot的配置属性
- 错误页面处理
- JPA相关
- Spring Boot + JPA 表和类的对应处理
- Spring Boot + JPA +MySQL 数据操作及示例环境搭建(手动建表)
- Spring Boot + JPA +MySQL 数据操作及示例环境搭建(自动建表)
- 基于Spring Boot + JPA +MySQL的JPA关联查询ManyToOne示例
- JPA的单向一对多关联(oneToMany)实现示例(基于Spring Boot + JPA +MySQL,表自动维护)
- JPA的双向一对多关联(oneToMany)实现示例(基于Spring Boot + JPA +MySQL,表自动维护)
- JPA的双向一对一关联实现示例(基于Spring Boot + JPA +MySQL,表自动维护)
- 一次使用JUnit + JPA 实现数据Migrate的实例介绍
- Spring Boot整合H2内存数据库配置及常见问题处理
- Spring Boot + Spring Data JPA 实现数据库操作的标准示例
- REST
- Spring Boot 访问HTTPS的url
- Spring Boot集成Log4j2
- Spring Boot + Ext JS 安全
- Spring Boot Web
- 内置服务器
- Spring Boot 中Filter的定义方式
- 开发工具
- Spring 开发利器之——Spring Tools 4
- Spring OAuth2+Basic
- Spring 缓存
- 快速实例
- Spring Security实战
- Spring Boot OAuth2 快速入门示例
- Spring Boot 项目使用Spring Security防护CSRF攻击实战
- Spring Boot OAuth2 认证服务器搭建及授权码认证演示
- 基于Spring OAuth2 之客户端凭证模式演示
- 基于Spring OAuth2 之简化模式演示
- 密码模式
- 客户端凭证
- 设置JWT Claim
- Client 数据库配置
- Spring Boot+Security 实现Basic认证
- Spring Boot + WebLogic 12c 之Basic认证
- spring-security-oauth2-authorization-server
- 4. 专题篇
- 项目与属性配置
- 外部化程序的配置
- 服务配置
- 不使用spring-boot-starter-parent作为Parent
- 数据库配置
- Spring Boot 2.7.14+Oracle 11+WebLogic
- Spring Boot+Vaadin
- Spring Boot+Vaadin 14项目初始化
- Vaadin 导入JS和添加JS代码段
- 常见及疑难问题解决
- Could not find artifact org.vaadin.artur:a-vaadin-helper:jar:1.6.2
- Spring Boot+Activiti
- Spring Boot + Activiti 工作流框架搭建
- Activiti 知识
- Spring Boot+Activiti开发注意点
- Activiti 代码
- Spring Boot缓存
- Spring Boot Cache
- Spring Boot整合Redis快速入门实例
- 配置 JSON 序列器
- 错误解决篇
- Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to localhost:6379
- Spring Root+Cache+Redis 实战
- Spring Boot+Redis 实现分布式缓存
- Spring Cloud + Redis 配置
- 主要类和方法
- 使用方式
- 缓存配置
- Redis Cache
- 缓存注解
- 类配置
- Spring Cloud
- 微服务架构
- 快速了解Spring Cloud
- Spring Cloud Eureka 最简入门示例
- Spring Cloud Ribbon 负载均衡客户端调用示例
- Spring Cloud Eureka注册服务器集群配置
- Spring Cloud常见问题及解决
- Spring Cloud Eureka Server的部署与启动
- 配置中心
- Spring Boot+HATEOAS
- HATEOAS概念
- Spring Boot+HATEOAS快速介绍与示例
- 开发说明
- Spring 安全
- Spring 框架RCE 安全漏洞
- Spring RCE 漏洞 CVE-2022-22965 的终极解决方案
- Spring Boot 跨域访问实现方式
- 轻量级网关-反向代理
- Spring Security
- 基本使用
- 主要问题
- securityChain
- UserDetailsService
- 忽略请求URL
- 安全
- Spring Boot项目CSRF (跨站请求伪造)攻击演示与防御
- Spring Boot CSRF 防御+Coverity
- 认证管理器-AuthenticationManager
- Spring Security开发介绍
- Spring Security 快速入门
- Spring Security 依赖导入
- Spring Security 用户认证
- Spring CSRF 实现机制
- 实战示例
- 入门示例
- Spring Security 常见问题
- Caused by: java.lang.IllegalArgumentException: realmName must be specified
- 总是报403错误
- Spring访问http/https
- Spring RestTemplate 访问https站点
- Spring Boot RestTemplate 忽略证书访问https
- Spring Boot OAuth2 Client -客户端模式 client credentials 获取token
- OAuth2RestTemplate
- Spring Security OAuth 访问OAuth2.0 的https站点
- Spring RestTemplate 忽略证书访问https的OAuth2 认证站点
- Spring OAuth 2.0
- 授权服务器和资源服务器
- Spring 对 OAuth2.0的解决方案
- OAuth2 认证服务器
- jjwt+oauth
- Spring OAuth2 的认证
- Spring Boot实现访问接口的Basic认证
- CORS
- Access-Control-Allow-Credentials
- Java JWT
- JWT
- 声明-subject
- 安全基本知识
- BCrypt
- Spring LDAP
- Spring Boot LDAP 认证
- LDAP问题与解决
- javax.naming.PartialResultException: Unprocessed Continuation Reference(s);
- Spring IO
- 接口和类
- Resource
- 性能
- Web缓存
- Spring Web
- 如何添加Filter
- OncePerRequestFilter
- 得到请求地址和参数
- 应用上下文路径
- 5. 开发参考
- 注解
- WebMvcAutoConfiguration
- JPA
- 如何加载 jar 中的注解类
- 1
- @EnableAsync
- 6. 常见问题
- bean named 'entityManagerFactory' that could not be found错误及解决
- invalid LOC header错误及解决
- No identifier specified for entity:
- Optional int parameter 'id' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.
- Could not resolve view with name 'xxxx' in servlet with name 'dispatcherServlet'
- JSON parse error: Unrecognized field
- multipart/form-data;boundary=----WebKitFormBoundaryRAYPKeHKTYSNdzc1;charset=UTF-8' not supported
- 跨域 Access to XMLHttpRequest at ' xxxxx' from origin 'null' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
- maven 下载问题
- Maven 无法下载Oracle 驱动解决
- Spring Boot常见面试题
- Spring Boot 访问JSP主页面出现下载页面
- Spring Boot 面试题大全
- Spring Cloud相关问题
- java.lang.IllegalStateException: Request URI does not contain a valid hostname: http://eurekaclient_service/
- Spring JPA
- Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set。
- 同时排序和分页查询的数据不对
- No EntityManager with actual transaction available for current thread
- should be mapped with insert="false" update="false"
- java.lang.IllegalArgumentException: Not a managed type:XX
- java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: XX is not mapped
- org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only
- Transaction rolled back because it has been marked as rollback-only
- org.hibernate.LazyInitializationException: could not initialize proxy xxx - no Session
- [EclipseLink]The attribute [xxx] of class [xxx] is mapped to a primary key column in the database. Updates are not allowed.
- cannot simultaneously fetch multiple bags
- Spring Boot + Hibernate java.lang.IllegalArgumentException: Not an entity: class
- mvn spring-boot class file for javax.interceptor.InterceptorBinding not found
- sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
- Spring Boot返回的数据格式是XML 而不是JSON之原因探求的和解决
- Failed to parse multipart servlet request; nested exception is javax.servlet.ServletException: The request content-type is not a multipart/form-data
- WebSecurityConfigurerAdapter 过时及替代写法
- consider increasing the maximum size of the cache
- java.lang.ClassCastException: org.springframework.context.annotation.AnnotationConfigApplicationContext cannot be cast to org.springframework.web.context.WebApplicationContext
- org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet
- Caused by: org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet
- Spring Boot测试无法运行问题解决(注入的组件为空)
- web.xml is missing and <failOnMissingWebXml> is set to true
- no main manifest attribute
- Refused to display 'http://localhost:8080/' in a frame because it set 'X-Frame-Options' to 'deny'.
- 问题模板
- Spring Security问题
- WebSecurityConfigurerAdapter过期了
- @EnableAuthorizationServer 已经废弃
- com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve subtype of [map type; class java.util.Map, [simple type, class java.lang.String] -> [simple type, class java.lang.Object]]: missing type id property '@class'
- Spring Web问题
- I/O error while reading input message; nested exception is java.io.IOException: Stream closed
- Filter读取JSON参数之后, Spring无法自动封装
- 部署到 WebLogic的问题
- 如何导入其他jar 的组件
- 类型转换
- JSON 格式转换
- Spring开发问题之org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class
- 7. 官方文档翻译篇
- Spring Framework参考文档-V6.0.8
- 总览
- 核心
- 测试-
- 数据访问
- Web Servlet
- Web Reactive
- 整合
- 1. REST 客户端
- 2.JMS(Java消息服务)
- 3. JMX
- 4. 邮件
- 5. 任务执行与排程
- 6. 缓存抽象
- 7. 监控支持
- 语言
- Spring Boot核心功能
- 1. SpringApplication 启动引导类
- 2. 属性配置
- 2.8 类型安全的属性配置
- 3. Profile
- 4. 日志
- 5. 国际化
- 6. JSON
- 7. 任务执行和计划
- 8. 测试
- 8.1 测试范围依赖
- 8.2 测试Spring应用
- 8.3 测试Spring Boot应用
- 8.3.1 侦测Web应用的类型
- 8.3.2 侦测测试配置
- 8.3.3 排除测试配置
- 8.3.4 使用应用的参数
- 8.3.5 使用模拟环境测试
- 8.3.6 使用服务器进行测试
- 8.3.7 自定义WebTestClient
- 8.3.8 使用JMX
- 8.3.9 使用Metrics
- 8.3.10 模拟和窥探Beans
- 8.3.11 自动配置的测试
- 8.3.12 自动配置的JSON测试
- 8.3.13 Spring MVC测试的自动配置
- 8.3.14 Spring WebFlux 测试的自动配置
- 8.3.15 Cassandra 测试的自动配置
- 8.3.16 数据 JPA 测试的自动配置
- 8.4 测试工具类
- 9. 定制属于你的自动配置
- 9.1 了解自动配置的Beans
- 9.2 定位自动配置的候选者
- 9.3 条件注释
- 10. Kotlin 支持
- Spring Boot 其他功能
- 7. Web 应用的开发
- Spring MVC 框架
- Spring WebFlux 框架
- JAX-RS 和Jersey
- 内置 Servlet 容器支持
- 内置响应式服务器支持
- 响应式服务器资源配置
- 8. 优雅关闭
- 9. RSocket
- 10. 安全
- 11. 使用SQL 数据库
- 11.2 JdbcTemplate 的使用
- 12. NoSQL技术
- 13. 缓存
- 14. 消息
- 15. 使用RestTemplate调用REST服务
- 16. 使用WebClient调用REST服务
- 17. 验证
- 18. 发送邮件
- 19. 使用JTA实现分布式事务
- 20. 分布式内存-Hazelcast
- 21. 定时器Quartz Scheduler
- 22. 任务执行和计划
- 23. Spring 整合
- 24. Spring 会话
- 25. 使用JMX 监控和管理
- 26. Testing 测试
- 27. WebSockets
- 28. Web Services
- 29. 创建自动配置
- 30. 对Kotlin 的支持
- 31. 容器
- Spring Boot开发指南 V3.1
- 入门
- Spring Boot应用升级
- 如何使用Spring Boot进行开发
- 核心功能
- Web-
- Data-数据
- IO
- 缓存
- 消息
- 容器
- 生产就绪功能
- 部署
- GraalVM Native Image Support
- Spring Boot命令行
- 构建工具插件
- 1. Spring Boot 应用
- 1.1 自定义错误分析器
- 1.2 自动配置的故障排除
- 1.3 启动之前自定义环境(Environment)和应用上下文(ApplicationContext)
- Spring Data Redis -Version 3.0.5
- 前言
- Spring Redis 开发参考文档
- 响应式 Redis 支持
- Redis集群
- Redis存储库
- Spring Security
- 参考
- Spring Authorization Server-0.4.2
- 概括
- 帮助
- Spring认证服务入门
- Spring Authorization Server-0.4.3
- 协议端点(Protocol Endpoints)
- OAuth2 授权端点
- 核心模型组件
- OAuth2TokenCustomizer
- 关联知识
- JWK Set
- 默认端点
- JWT JWK
- OpenID Connect 1.0
- OAuth2
- 问题
- [invalid_request] OAuth 2.0 Parameter: redirect_uri
- [invalid_request] OAuth 2.0 Parameter: state
- There is no PasswordEncoder mapped for the id "null"
- 实际开发
- 8. 补充篇
- Jackson
- 资源
- 配置大全
- Spring Boot 与 Java 版本对应
- Java Web
- 如何在Filter中读取JSON 类型的参数