【Springboot知识】Springboot配置加载机制深入解读

文章目录

    • 配置加载概述
      • **Spring Boot 配置加载机制详解**
        • **一、配置加载顺序(优先级由低到高)**
        • **二、关键配置机制说明**
          • **1. Profile 机制**
          • **2. 外部化配置**
          • **3. 配置属性绑定到 Bean**
          • **4. 动态覆盖配置**
        • **三、配置加载流程图**
          • **2. 配置导入(Spring Boot 2.4+)**
          • **3. 配置元数据(IDE 提示)**
        • **五、调试配置问题**
        • **六、总结**
    • Relaxed Binding(宽松绑定)​
      • **Spring Boot 的 Relaxed Binding(宽松绑定)**
        • **一、Relaxed Binding 支持的格式**
        • **二、使用场景示例**
          • **1. Java 类定义**
          • **2. 配置文件示例**
          • **3. 环境变量示例**
        • **三、规则详解**
        • **四、常见问题**
          • **1. 歧义问题**
          • **2. 集合类型绑定**
        • **五、最佳实践**
        • **六、调试技巧**
    • ​​PropertySource 抽象机制详解​
      • **PropertySource 抽象机制详解**
        • **一、PropertySource 核心概念**
          • **1. 接口定义**
          • **2. 内置实现类**
          • **3. 配置源的存储结构**
        • **二、PropertySource 在 Spring Boot 中的应用**
          • **1. 默认加载的 PropertySource**
          • **2. 查看所有生效的 PropertySource**
        • **三、自定义 PropertySource**
          • **1. 实现自定义配置源**
          • **2. 注册自定义配置源**
          • **3. 使用自定义配置**
        • **四、PropertySource 的高级用法**
          • **1. 动态刷新配置**
          • **2. 配置源优先级调整**
          • **3. 多文件配置合并**
        • **五、PropertySource 与 Relaxed Binding**
        • **六、总结**
    • **自定义配置加载工厂类及注解使用指南**
      • **一、创建自定义配置工厂类**
        • **1. 实现 `PropertySourceFactory`**
      • **二、通过注解加载配置**
          • **1. 使用 `@PropertySource` 指定工厂类**
        • **2. 加密配置文件示例**
      • **三、在代码中使用配置**
        • **1. 注入配置值**
        • **2. 启动类测试**
      • **四、高级功能扩展**
        • **1. 动态密钥管理**
        • **2. 多配置文件支持**
        • **3. 配置优先级控制**
      • **五、验证与调试**
        • **1. 查看所有配置源**
        • **2. 日志调试**
      • **六、注意事项**
    • 广子

配置加载概述

Spring Boot 配置加载机制详解

Spring Boot 的配置加载机制采用 层级化优先级策略,支持从多种来源(如配置文件、环境变量、命令行参数等)加载配置,并按 优先级从低到高 的顺序覆盖同名配置。以下是完整的配置加载流程及关键机制说明:

一、配置加载顺序(优先级由低到高)

Spring Boot 按以下顺序加载配置,后加载的配置会覆盖前面的同名属性

配置来源说明
1. @Configuration 类上的 @PropertySource通过注解显式指定配置文件(如 @PropertySource("classpath:custom.properties"))。
2. 应用默认属性(SpringApplication.setDefaultProperties通过代码设置的默认属性,优先级最低。
3. application.yml / application.yaml项目 resources 目录下的 YAML 格式配置文件(支持多环境 Profile)。
4. application.properties项目 resources 目录下的 Properties 格式配置文件。
5. Profile-specific 配置文件application-{profile}.ymlapplication-{profile}.properties
6. 外部化配置(Jar 包外部的配置文件)在 Jar 包同级目录下的配置文件(如 ./config/application.yml)。
7. 环境变量(Environment Variables)操作系统或容器设置的环境变量(如 SPRING_DATASOURCE_URL)。
8. 命令行参数(Command Line Args)通过 --key=value 传递的参数(如 java -jar app.jar --server.port=8081)。
二、关键配置机制说明
1. Profile 机制

Spring Boot 通过 Profile 实现多环境配置隔离。
激活 Profile 的方式
• 配置文件:spring.profiles.active=dev
• 命令行参数:--spring.profiles.active=prod
• 环境变量:export SPRING_PROFILES_ACTIVE=test

Profile-specific 配置文件
• 命名规则:application-{profile}.yml(如 application-dev.yml)。
• 优先级:当 Profile 激活时,同名配置会覆盖默认的 application.yml

示例:

# application.yml(默认配置)
server:port: 8080# application-dev.yml(开发环境)
server:port: 9090

激活开发环境后,端口变为 9090

2. 外部化配置

Spring Boot 支持从 Jar 包外部 加载配置文件,便于部署时动态调整配置。
默认外部路径优先级(从高到低):

  1. 当前目录的 /config 子目录:./config/application.yml
  2. 当前目录:./application.yml
  3. 类路径的 /config 包:classpath:/config/application.yml
  4. 类路径根目录:classpath:/application.yml

自定义外部路径
通过命令行或环境变量指定路径:

java -jar app.jar --spring.config.location=file:/opt/config/
3. 配置属性绑定到 Bean

Spring Boot 通过 @ConfigurationProperties 将配置自动绑定到 Java Bean。

示例:

@Configuration
@ConfigurationProperties(prefix = "app")
public class AppConfig {private String name;private List<String> servers;// Getter/Setter
}
# application.yml
app:name: "MyApp"servers:- "server1"- "server2"
4. 动态覆盖配置

通过 命令行参数环境变量 动态覆盖配置:

# 命令行覆盖端口
java -jar app.jar --server.port=8081# 环境变量覆盖数据库配置(注意大小写转换)
export SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/mydb
三、配置加载流程图
graph TD
A[启动应用] --> B[加载默认属性]
B --> C[加载@PropertySource指定的文件]
C --> D[加载application.yml/properties]
D --> E[加载Profile-specific配置]
E --> F[加载外部化配置]
F --> G[加载环境变量]
G --> H[加载命令行参数]
H --> I[最终合并配置]
``#### **四、高级特性**##### **1. 配置加密**
结合 **Spring Cloud Vault** 或 **Jasypt** 对敏感配置(如数据库密码)加密:  
```yaml
spring:datasource:password: ENC(加密后的字符串)
2. 配置导入(Spring Boot 2.4+)

通过 spring.config.import 导入其他配置:

# application.yml
spring:config:import:- "classpath:extra-config.yml"- "file:/opt/config/override.yml"
3. 配置元数据(IDE 提示)

src/main/resources/META-INF 下添加 spring-configuration-metadata.json,提供配置属性的 IDE 自动提示。

五、调试配置问题

查看生效的配置
访问 /actuator/env 端点,查看所有已加载的配置及其来源。
日志输出配置加载详情
application.yml 中启用调试日志:

logging:level:org.springframework.boot.context.properties: TRACE
六、总结

优先级策略:命令行参数 > 环境变量 > 外部化配置 > Profile-specific > 默认配置。
灵活扩展:支持多环境、外部化配置、动态覆盖和属性绑定。
最佳实践
• 使用 application.yml + Profile 管理多环境。
• 敏感信息通过外部化配置或加密工具管理。
• 避免在代码中硬编码配置,优先使用 @ConfigurationProperties

Relaxed Binding(宽松绑定)​

Spring Boot 的 Relaxed Binding(宽松绑定)

Relaxed Binding 是 Spring Boot 在配置属性绑定中的一种灵活机制,允许在 配置文件(如 application.yml)或 环境变量 中使用不同格式的命名方式,而代码中仍能正确绑定到对应的 Java 属性。这种机制极大简化了配置的兼容性处理。

一、Relaxed Binding 支持的格式

假设 Java 类中定义的属性为 myProject.myField,以下配置格式均能生效:

配置来源合法格式示例说明
配置文件(.ymlmy-project.my-field短横线命名(推荐标准写法)
配置文件(.ymlmyProject.myField驼峰命名(与代码字段名一致)
配置文件(.ymlmy_project.my_field下划线命名(常见于环境变量风格)
环境变量MYPROJECT_MYFIELD全大写+下划线(Linux 环境变量风格)
系统属性myproject.myfield全小写+点号(宽松匹配)
二、使用场景示例
1. Java 类定义
@Configuration
@ConfigurationProperties(prefix = "app")
public class AppConfig {private String projectName;  // 对应配置文件中的不同格式private int maxRetryCount;   // 例如 max-retry-count, maxRetryCount, MAX_RETRY_COUNT// Getter/Setter
}
2. 配置文件示例
# application.yml
app:project-name: "Spring Boot App"    # 短横线格式(推荐)max_retry_count: 3                # 下划线格式
3. 环境变量示例
# Linux/MacOS
export APP_PROJECTNAME="MyApp"
export APP_MAXRETRYCOUNT=5# Windows(命令行)
set APP_PROJECTNAME=MyApp
set APP_MAXRETRYCOUNT=5
三、规则详解
  1. 前缀(Prefix)处理
    prefix = "app" 可匹配以下形式:
    app.*(配置文件)
    APP_*(环境变量)
    app_*(下划线)

  2. 属性名匹配优先级
    当多个格式同时存在时,精确匹配优先于宽松匹配。例如:
    • 若同时存在 app.project-nameapp.projectName,优先使用 app.project-name

  3. 大小写不敏感
    配置中的键名不区分大小写。例如 app.PROJECTNAMEapp.projectname 是等价的。

四、常见问题
1. 歧义问题

如果不同格式的配置指向同一个字段,可能导致意外覆盖。例如:

app:project-name: "Name1"project_name: "Name2"

此时实际生效的值取决于配置加载顺序(后加载的覆盖先加载的)。

2. 集合类型绑定

对于 MapList 类型,建议在配置中使用短横线格式:

app:servers:- name: "server1"ip: "192.168.1.1"- name: "server2"ip: "192.168.1.2"
五、最佳实践
  1. 统一命名风格
    推荐使用短横线格式(如 max-retry-count),保持配置文件的简洁性和可读性。

  2. 避免混合格式
    同一项目中避免混用驼峰、下划线和短横线,防止维护混乱。

  3. 环境变量处理
    • 在 Kubernetes 或 Docker 中,环境变量需转换为全大写+下划线格式:

    # 例如:app.maxRetryCount -> APP_MAXRETRYCOUNT
    
  4. IDE 提示支持
    src/main/resources/META-INF 下添加 spring-configuration-metadata.json,为自定义属性提供 IDE 自动提示。

六、调试技巧
  1. 查看最终绑定的属性值
    访问 /actuator/configprops 端点,查看所有 @ConfigurationProperties 类的属性绑定结果。

  2. 启用调试日志
    application.yml 中启用日志,追踪属性绑定过程:

    logging:level:org.springframework.boot.context.properties: DEBUG
    

通过 Relaxed Binding,Spring Boot 实现了配置属性的高度灵活性,使得开发者无需关注格式细节,专注于业务逻辑。

​​PropertySource 抽象机制详解​

PropertySource 抽象机制详解

PropertySource 是 Spring 框架中用于抽象配置源的接口,它将不同来源的配置(如环境变量、配置文件、JVM 参数等)统一为键值对形式,使得应用可以透明地访问这些配置。Spring Boot 基于此机制实现了 多配置源的自动加载与优先级管理

一、PropertySource 核心概念
1. 接口定义

PropertySource 接口的核心方法:

public abstract class PropertySource<T> {public abstract String getName();      // 配置源名称(如 "systemProperties")public abstract Object getProperty(String name); // 根据 Key 获取 Value
}
2. 内置实现类

Spring 提供多种 PropertySource 实现类:

实现类说明
MapPropertySource基于 Map 的配置源(如从 .properties 文件加载的配置)。
SystemEnvironmentPropertySource操作系统环境变量(支持 Relaxed Binding,如 spring.datasource.url 对应 SPRING_DATASOURCE_URL)。
CommandLinePropertySource命令行参数(如 --server.port=8080)。
CompositePropertySource组合多个配置源,统一对外提供访问接口。
3. 配置源的存储结构

Spring 的 Environment 接口通过 MutablePropertySources 管理多个 PropertySource,形成 优先级链

public interface Environment extends PropertyResolver {MutablePropertySources getPropertySources();
}
二、PropertySource 在 Spring Boot 中的应用
1. 默认加载的 PropertySource

Spring Boot 启动时自动加载以下配置源(按优先级从低到高排序):

配置源示例
应用默认属性(SpringApplication.setDefaultPropertiesnew HashMap<>().put("key", "default")
@PropertySource 注解指定的文件@PropertySource("classpath:custom.properties")
配置文件(application.yml/application.propertiesapplication-dev.yml
随机值属性(RandomValuePropertySourcerandom.int, random.uuid
操作系统环境变量PATH, JAVA_HOME
JVM 系统属性-Dserver.port=8080
命令行参数--server.port=8081
2. 查看所有生效的 PropertySource

访问 /actuator/env 端点,可查看所有已加载的配置源及其属性:

{"propertySources": [{"name": "commandLineArgs","properties": { "server.port": "8081" }},{"name": "systemProperties","properties": { "java.version": "17.0.1" }}]
}
三、自定义 PropertySource
1. 实现自定义配置源

例如:从数据库加载配置。

public class DatabasePropertySource extends PropertySource<Map<String, String>> {private Map<String, String> properties = new HashMap<>();public DatabasePropertySource() {super("databaseProperties");// 从数据库加载配置到 MaploadFromDatabase();}private void loadFromDatabase() {// 模拟数据库查询properties.put("app.database.url", "jdbc:mysql://localhost:3306/mydb");properties.put("app.database.username", "admin");}@Overridepublic Object getProperty(String name) {return properties.get(name);}
}
2. 注册自定义配置源

通过 EnvironmentPostProcessor 接口动态添加:

public class CustomEnvironmentPostProcessor implements EnvironmentPostProcessor {@Overridepublic void postProcessEnvironment(ConfigurableEnvironment env, SpringApplication app) {// 创建自定义配置源DatabasePropertySource dbSource = new DatabasePropertySource();// 添加到配置源列表的最前面(最高优先级)env.getPropertySources().addFirst(dbSource);}
}

注册到 META-INF/spring.factories

org.springframework.boot.env.EnvironmentPostProcessor=com.example.CustomEnvironmentPostProcessor
3. 使用自定义配置

在代码或配置文件中直接引用:

@Value("${app.database.url}")
private String dbUrl;
四、PropertySource 的高级用法
1. 动态刷新配置

结合 Spring Cloud Config 或 Nacos 实现配置热更新:

@RefreshScope
@RestController
public class ConfigController {@Value("${dynamic.config}")private String dynamicConfig;
}
2. 配置源优先级调整

通过代码调整配置源顺序:

env.getPropertySources().addAfter("systemProperties", myPropertySource);
3. 多文件配置合并

使用 @PropertySource 加载多个文件:

@Configuration
@PropertySource({"classpath:default.properties", "file:/opt/config/override.properties"})
public class AppConfig {}
五、PropertySource 与 Relaxed Binding

Relaxed Binding 允许在不同配置源中使用不同命名风格,例如:
• 环境变量 APP_DATASOURCE_URL
• 配置文件 app.datasource.url
• 命令行参数 --app.datasource.url=...

Spring Boot 会自动统一处理这些格式,绑定到同一个属性。

六、总结

核心价值
PropertySource 抽象实现了配置源的统一管理,屏蔽了底层差异,使开发者无需关心配置来源。
灵活扩展
支持自定义配置源(如数据库、远程 API),满足企业级需求。
优先级控制
通过调整配置源顺序,实现不同环境(开发、测试、生产)的配置覆盖。
最佳实践
• 优先使用标准配置文件(application.yml)。
• 敏感配置通过外部化机制(如 Vault)管理。
• 避免硬编码配置,使用 @Value@ConfigurationProperties 绑定属性。

自定义配置加载工厂类及注解使用指南

以下通过一个完整示例演示如何创建自定义配置加载工厂类,并通过 @PropertySource 注解实现加密 YAML 配置的加载。

一、创建自定义配置工厂类

1. 实现 PropertySourceFactory
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.EncodedResource;
import org.springframework.core.io.support.PropertySourceFactory;
import java.io.IOException;
import java.util.Map;public class EncryptedYamlPropertySourceFactory implements PropertySourceFactory {// 密钥(实际应从安全位置读取)private static final String SECRET_KEY = "my-secret-key-123";@Overridepublic PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {// 1. 读取加密文件内容String encryptedContent = readEncryptedContent(resource);// 2. 解密内容(示例使用 AES)String decryptedContent = decryptAES(encryptedContent, SECRET_KEY);// 3. 解析 YAMLMap<String, Object> properties = parseYaml(decryptedContent);// 4. 创建 PropertySourcereturn new MapPropertySource("encryptedYaml", properties);}private String readEncryptedContent(EncodedResource resource) throws IOException {try (InputStream is = resource.getInputStream()) {return new String(is.readAllBytes(), StandardCharsets.UTF_8);}}private String decryptAES(String encryptedContent, String key) {// 实现 AES 解密逻辑(此处为伪代码)return "app:\n  security:\n    api-key: \"decrypted-key\"";}private Map<String, Object> parseYaml(String content) {Yaml yaml = new Yaml();return yaml.load(content);}
}

二、通过注解加载配置

1. 使用 @PropertySource 指定工厂类
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;@Configuration
@PropertySource(value = "classpath:config/secure-config.yml.enc",  // 加密配置文件路径factory = EncryptedYamlPropertySourceFactory.class // 指定自定义工厂类
)
public class SecurityConfig {
}
2. 加密配置文件示例

加密前的明文内容 (secure-config.yml):

app:security:api-key: "a1b2c3d4e5"jwt-secret: "jwt-s3cr3t"

加密后保存为 secure-config.yml.enc(假设使用 AES 加密)。

三、在代码中使用配置

1. 注入配置值
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;@Service
public class ApiService {@Value("${app.security.api-key}")private String apiKey;@Value("${app.security.jwt-secret}")private String jwtSecret;public void printConfig() {System.out.println("API Key: " + apiKey);System.out.println("JWT Secret: " + jwtSecret);}
}
2. 启动类测试
@SpringBootApplication
public class MyApp implements CommandLineRunner {@Autowiredprivate ApiService apiService;public static void main(String[] args) {SpringApplication.run(MyApp.class, args);}@Overridepublic void run(String... args) {apiService.printConfig(); // 输出解密后的配置值}
}

四、高级功能扩展

1. 动态密钥管理

通过环境变量获取密钥(避免硬编码):

public class EncryptedYamlPropertySourceFactory implements PropertySourceFactory {@Overridepublic PropertySource<?> createPropertySource(String name, EncodedResource resource) {String secretKey = System.getenv("CONFIG_SECRET_KEY"); // 从环境变量获取密钥// 使用密钥解密...}
}
2. 多配置文件支持

加载多个加密文件:

@Configuration
@PropertySources({@PropertySource(value = "classpath:config/db.yml.enc", factory = EncryptedYamlPropertySourceFactory.class),@PropertySource(value = "file:/etc/app/secure.yml.enc", factory = EncryptedYamlPropertySourceFactory.class)
})
public class MultiConfig {
}
3. 配置优先级控制

手动调整配置源顺序:

@Configuration
public class PriorityConfig implements EnvironmentAware {@Overridepublic void setEnvironment(Environment env) {ConfigurableEnvironment cEnv = (ConfigurableEnvironment) env;// 将自定义配置源提到最高优先级cEnv.getPropertySources().addFirst(new ResourcePropertySource("classpath:config/secure-config.yml.enc"));}
}

五、验证与调试

1. 查看所有配置源

访问 /actuator/env 端点,确认加密配置已加载:

{"propertySources": [{"name": "encryptedYaml","properties": {"app.security.api-key": {"value": "decrypted-key"}}}]
}
2. 日志调试

启用详细日志追踪配置加载过程:

logging:level:org.springframework.core.env: DEBUGcom.example.EncryptedYamlPropertySourceFactory: TRACE

六、注意事项

  1. 工厂类的无状态性
    Spring 要求 PropertySourceFactory 实现类必须为 无状态,避免使用非静态成员变量。

  2. 异常处理
    createPropertySource 方法中妥善处理 IOException 和解密失败异常。

  3. 性能优化
    对大文件或高频访问的配置,可添加缓存机制(首次加载后缓存解密结果)。

  4. IDE 元数据支持
    src/main/resources/META-INF 下添加 additional-spring-configuration-metadata.json,提供配置提示:

    {"properties": [{"name": "app.security.api-key","type": "java.lang.String","description": "API 访问密钥"}]
    }
    

通过本方案,您可以实现 安全、灵活、可维护 的配置加载机制,适用于金融、医疗等对数据安全要求高的场景。

广子

CONGA适用荣耀magic7pro手机壳凯夫拉芳纶纤维荣耀Magic7rsr保时捷设计保护套碳纤维全包超薄硬壳磁吸 磁吸款| 晨曦蓝 |金属镜头圈 荣耀 Magic7 Pro
【在售价】198.00元
【到手价】188.00元

下单链接:https://u.jd.com/1Dtukx8

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI图像生成

要通过代码实现AI图像生成&#xff0c;可以使用深度学习框架如TensorFlow、PyTorch或GANs等技术。下面是一个简单的示例代码&#xff0c;演示如何使用GANs生成手写数字图像&#xff1a; import torch import torchvision import torchvision.transforms as transforms import …

基于springboot的个人博客系统

一、系统架构 前端&#xff1a;html | bootstrap | jquery | css | ajax 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven 二、代码及数据 三、功能介绍 01. 注册 02. 登录 03. 管理后台-首页 04. 管理后台-文章-所有文…

BOTA六维力矩传感器如何打通机器人AI力控操作的三层架构?感知-决策-执行全链路揭秘

想象一下&#xff0c;你对着一个机器人说&#xff1a;“请帮我泡杯茶。”然后&#xff0c;它就真的开始行动了&#xff1a;找茶壶、烧水、取茶叶、泡茶……这一切看似简单&#xff0c;但背后却隐藏着复杂的AI技术。今天&#xff0c;我们就来揭秘BOTA六维力矩传感器在机器人操控…

ffmpeg播放音视频流程

文章目录 &#x1f3ac; FFmpeg 解码播放流程概览&#xff08;以音视频文件为例&#xff09;1️⃣ 创建结构体2️⃣ 打开音视频文件3️⃣ 查找解码器并打开解码器4️⃣ 循环读取数据包&#xff08;Packet&#xff09;5️⃣ 解码成帧&#xff08;Frame&#xff09;6️⃣ 播放 / …

在 Wireshark 中如何筛选数据包

1. 显示过滤器&#xff08;Display Filters&#xff09; 显示过滤器用于 在已捕获的数据包中筛选&#xff0c;语法类似于编程语言中的条件表达式。 &#xff08;1&#xff09;基本过滤 表达式说明ip.addr 192.168.1.1显示所有涉及 192.168.1.1 的 IP 包ip.src 192.168.1.1…

ES6 新增特性 箭头函数

简述&#xff1a; ECMAScript 6&#xff08;简称ES6&#xff09;是于2015年6月正式发布的JavaScript语言的标准&#xff0c;正式名为ECMAScript 2015&#xff08;ES2015&#xff09;。它的目标是使得JavaScript语言可以用来编写复杂的大型应用程序&#xff0c;成为企业级开发语…

Python数据可视化-第7章-绘制3D图表和统计地图

环境 开发工具 VSCode库的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本书为《Python数据可视化》一书的配套内容&#xff0c;本章为第7章 绘制3D图表和统计地图 本章首先介绍了使用mplot3d工具包绘制3D图表&#xff0c;然后介绍了使用animation模块制作动画&#…

【从零开始学习JVM | 第二篇】HotSpot虚拟机对象探秘

对象的创建 1.类加载检查 虚拟机遇到一条new的指令&#xff0c;首先去检查这个指令的参数能否在常量池中定位到这个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有&#xff0c;那必须先执行类的加载过程。 2.分配内存 在类…

Oracle 表空间高水位收缩全攻略

1. 概述 本文档是针对某个特定用户表空间收缩的文档&#xff0c;实际操作要结合生产库具体情况。主要包括以下几个流程&#xff1a; 收集当前数据库相关信息降低数据库表高水位线Resize 收缩数据文件 具体细节详见以下章节。 2. 时间规划 操作类型预估时间实际时间数据库信…

Pytest多环境切换实战:测试框架配置的最佳实践!

你是否也遇到过这种情况&#xff1a;本地测试通过&#xff0c;一到测试环境就翻车&#xff1f;环境变量错乱、接口地址混乱、数据源配置丢失……这些「环境切换」问题简直像定时炸弹&#xff0c;随时引爆你的测试流程&#xff01; 测试人员每天都跟不同的环境打交道&#xff0…

蓝桥杯赛前题

开始每个人能量为3 答题了&#xff0c;答题者1 扣分最后算 #include<bits/stdc.h> using namespace std;const int N1e510; int a[N]; int main(){int n,k,q;cin>>n>>k>>q;for(int i1;i<n;i){a[i]k; }for(int i1;i<q;i){int x;cin>>x;a[…

VSCode优雅的使用debug

原始用法&#xff1a;(这里不使用) 配置launch.json&#xff0c;里面传入参数然后debug&#xff0c;这里我们通常需要传入的参数比较多&#xff0c;而且经常修改参数&#xff0c;直接去修改launch.json会比较麻烦&#xff0c;所以使用sh脚本比较方便。 {// Use IntelliSense to…

oracle常见问题处理集锦

oracle常见问题处理集锦 oracle常见问题处理集锦ORA-03001:未实施的功能ORA:28000 the count is locked oracle常见问题处理集锦 ORA-03001:未实施的功能 问题 ORA-03001:未实施的功能 在datagrip中修改表名称&#xff0c;使用的语法是&#xff1a; rename old_name to new_n…

项目日志配置模板示例

1.新增application.properties配置 logging.configclasspath:logback-spring.xml spring.profiles.activedev 将项目部署到服务器时需要将dev修改为test后再进行打包部署 2.新增logback-spring.xml <?xml version"1.0" encoding"UTF-8"?> <…

2025年第十八届“认证杯”数学中国数学建模网络挑战赛【BC题】完整版+代码+结果

# 问题一&#xff1a;随机森林回归from sklearn.ensemble import RandomForestRegressormodel_rf RandomForestRegressor()model_rf.fit(X_train, y_train)# 问题二&#xff1a;LSTM时间序列预测from tensorflow.keras.models import Sequentialmodel_lstm Sequential()model…

C语言实现TcpDump

一、 在 C 语言中实现 TCP 抓包功能&#xff0c;通常可以使用 libpcap 库。libpcap 是一个广泛使用的网络抓包库&#xff0c;它提供了捕获网络数据包的接口。 libpcap 是一个广泛使用的 C 语言库&#xff0c;用于捕获和过滤网络数据包。它提供了一个通用接口&#xff0c;用于访…

Spark-Core编程

sortByKey算子&#xff1a;对(K, V)型RDD按key排序&#xff0c;K需实现Ordered接口&#xff0c;可指定升序或降序及分区数。 join算子&#xff1a;连接两个(K, V)和(K, W)型RDD&#xff0c;返回(K, (V, W))型RDD 。 leftOuterJoin算子&#xff1a;类似SQL左外连接&#xff0c;返…

阅读MySQL实战45讲第9天

目录 一、你的 SQL 语句为什么变“慢” 二、什么情况会引发数据库的 flush 过程&#xff1f; 三、分析上面四种场景对性能的影响 四、InnoDB 刷脏页的控制策略 五、原作者小结&#xff1a; 引言&#xff1a; 一条 SQL 语句&#xff0c;正常执行的时候特别快&#xff0c;但是有时…

cin,cin.get(),getchar(),getline(),cin.get line()异同点

文章目录 1.cin2.cin.get()3.getchar()4.cin.getline()5.getline() 1.cin &#xff08;1&#xff09;cin>>等价于cin.operator>>()&#xff0c;即调用成员函数operator>>()进行读取数据。 &#xff08;2&#xff09;当cin>>从缓冲区中读取数据时&…

VMware虚拟机Ubuntu磁盘扩容

VMware中操作&#xff1a; 选择要扩容的虚拟机&#xff0c;点击编辑虚拟机设置 打开后点击磁盘——>点击扩展&#xff08;注意&#xff1a;如果想要扩容的话需要删除快照&#xff09; 调整到你想要的容量 点击上图的扩展——>确定 然后我们进到虚拟机里面 首先&#…