SpringBoot 环境配置解析:Environment 与 PropertySource

news2026/4/13 1:33:16
前面我们系统讲解了 Value、ConfigurationProperties 的配置注入用法很多同学能熟练用它们读取配置但一旦遇到复杂场景就彻底懵圈比如为什么命令行参数能覆盖 application.yml 的配置为什么 Nacos 配置能实时更新为什么自定义配置源读取不到线上配置混乱到底该从哪里排查其实这些问题的根源都指向 SpringBoot 配置体系的两大核心Environment环境门面和PropertySource配置源。我们之前用的所有配置注入方式本质上都是通过 Environment 读取底层的 PropertySource 配置而配置的加载顺序、优先级、动态刷新也都依赖这两个组件的协同工作。一、Spring 配置体系的核心架构在讲具体接口之前我们先搞懂 Spring 是如何管理所有配置的用户/系统配置 → 各类 PropertySource配置源 → Environment环境门面 → 配置注入Value / ConfigurationProperties → 业务代码拆解一下1. 所有配置yml、环境变量、命令行、配置中心等都会被封装成一个个 PropertySource 对象2. Environment 会管理一个 PropertySource 列表统一维护所有配置源3. 当我们读取配置时无论是注解注入还是直接调用 Environment API本质上是通过 Environment 从其管理的 PropertySource 列表中查找配置4. 配置的优先级本质就是 PropertySource 在列表中的顺序越靠前优先级越高后面的配置会覆盖前面的。✅ 一句话总结Environment 是配置的“总入口”PropertySource 是配置的“载体”所有配置都通过 Environment 统一对外提供底层由 PropertySource 支撑。二、Environment 接口详解Environment 是 Spring 提供的「环境抽象接口」位于 org.springframework.core.env 包下它的核心作用是“统一管理所有配置源对外提供统一的配置读取 API”屏蔽底层不同配置源的差异比如 yml 和环境变量的读取方式不同但通过 Environment 可以用同一方法读取。1. Environment 的继承体系Environment 不是孤立的接口它有清晰的继承体系理解这个体系能快速掌握它的核心功能// 顶层接口属性解析器定义了读取配置的基础方法 PropertyResolver ↓ 继承 ConfigurablePropertyResolver // 可配置的属性解析器增加了类型转换、配置校验等功能 ↓ 继承 Environment // 环境接口增加了环境 Profiles 相关功能 ↓ 实现 AbstractEnvironment // 抽象实现类维护了 PropertySource 列表和 Profiles 信息 ↓ 实现 StandardEnvironment // 标准环境非 Web 环境适用于普通 Java 项目 ↓ 实现 StandardServletEnvironment // Web 环境适用于 SpringMVC、SpringBoot Web 项目SpringBoot 项目中默认使用的是 StandardServletEnvironmentWeb 环境它会自动加载 Web 相关的配置源如 Servlet 上下文参数。2. Environment 的两大核心功能Environment 主要负责两件事管理配置源PropertySource和管理环境 Profiles这也是它与普通 PropertyResolver 的核心区别。功能1管理配置源Environment 内部维护了一个「PropertySource 列表」ListPropertySource?所有配置源都会被添加到这个列表中。当读取配置时Environment 会按列表顺序遍历 PropertySource找到第一个包含目标 key 的配置源返回对应的值这就是配置优先级的底层逻辑。核心相关方法扩展/调试必备// 1. 获取所有配置源只读 MutablePropertySources getPropertySources(); // 2. 添加配置源指定位置影响优先级 void addFirst(PropertySource? propertySource); // 添加到最前面优先级最高 void addLast(PropertySource? propertySource); // 添加到最后面优先级最低 void addBefore(String relativePropertySourceName, PropertySource? propertySource); // 添加到指定配置源之前 void addAfter(String relativePropertySourceName, PropertySource? propertySource); // 添加到指定配置源之后 // 3. 移除配置源 void remove(String propertySourceName);功能2管理环境 ProfilesProfiles 是 Spring 用于区分不同环境dev/test/prod的机制Environment 负责管理当前激活的 Profiles、默认 Profiles以及判断某个 Profiles 是否被激活。核心相关方法// 1. 获取当前激活的环境如 dev、prod String[] getActiveProfiles(); // 2. 获取默认环境当没有激活环境时使用默认环境 String[] getDefaultProfiles(); // 3. 设置激活的环境编程式设置 void setActiveProfiles(String... profiles); // 4. 判断是否激活了某个/某些环境 boolean acceptsProfiles(String... profiles); boolean acceptsProfiles(Profiles profiles);3. Environment 常用 API除了上述核心方法Environment 还继承了 PropertyResolver 的所有方法用于读取配置这些 API 是日常开发和调试的常用工具// 1. 读取单个配置返回 String不存在则返回 null String getProperty(String key); // 2. 读取单个配置指定默认值不存在则返回默认值 String getProperty(String key, String defaultValue); // 3. 读取配置并自动类型转换常用无需手动转换 T T getProperty(String key, ClassT type); T T getProperty(String key, ClassT type, T defaultValue); // 4. 读取配置并强制转换不存在则抛出异常适用于必须存在的配置 T T getRequiredProperty(String key, ClassT type) throws IllegalStateException; // 5. 判断配置中是否包含某个 key boolean containsProperty(String key); // 6. 解析配置中的占位符如 ${spring.application.name} String resolvePlaceholders(String text);4. 直接使用 Environment 读取配置Environment 是 Spring 容器中的核心 Bean可直接通过 Autowired 或构造器注入在 Controller、Service、配置类中使用实战示例如下RestController RequiredArgsConstructor public class EnvController { // 注入 Environment推荐构造器注入更规范 private final Environment environment; GetMapping(/env/info) public MapString, Object getEnvInfo() { MapString, Object envMap new HashMap(); // 1. 读取基础配置自动类型转换 String appName environment.getProperty(spring.application.name); Integer port environment.getProperty(server.port, Integer.class); Boolean devEnv environment.getProperty(spring.profiles.active, String.class).equals(dev); // 2. 读取带默认值的配置 String timeout environment.getProperty(myapp.timeout, String.class, 5000); // 3. 读取必须存在的配置不存在则抛异常 String dbUrl environment.getRequiredProperty(spring.datasource.url, String.class); // 4. 读取 Profiles 相关信息 String[] activeProfiles environment.getActiveProfiles(); String[] defaultProfiles environment.getDefaultProfiles(); boolean acceptDev environment.acceptsProfiles(dev); // 5. 解析占位符配置如配置中写的 ${spring.application.name}-${server.port} String appInfo environment.resolvePlaceholders(${spring.application.name}:${server.port}); // 封装返回 envMap.put(appName, appName); envMap.put(port, port); envMap.put(devEnv, devEnv); envMap.put(timeout, timeout); envMap.put(dbUrl, dbUrl); envMap.put(activeProfiles, activeProfiles); envMap.put(appInfo, appInfo); return envMap; } }✅ 测试效果启动项目访问 http://localhost:8080/env/info会返回所有读取到的配置信息包括 Profiles 信息和占位符解析结果。⚠️ Environment 使用注意事项• getProperty() 方法返回 null 时要注意判空避免空指针异常• getRequiredProperty() 方法用于“必须存在的配置”如数据库地址不存在会抛出 IllegalStateException适合用于校验核心配置• resolvePlaceholders() 方法可手动解析配置中的占位符适用于自定义配置解析场景• Environment 是单例 Bean可在任何被 Spring 管理的类中注入无需额外配置。三、PropertySource 配置源详解PropertySource 是 Spring 对「配置源」的抽象位于 org.springframework.core.env 包下每一类配置来源如 yml 文件、环境变量、命令行都对应一个 PropertySource 的实现类。简单说PropertySource 就是“配置的容器”一个 PropertySource 对应一个配置来源里面存储着该来源的所有配置键值对。1. PropertySource 的核心结构先看 PropertySource 的核心源码理解它的本质public abstract class PropertySourceT { // 配置源的名称唯一标识如 applicationConfig: [classpath:/application.yml] protected final String name; // 配置源的底层数据不同实现类的类型不同如 Map、Properties、yml 文件等 protected final T source; // 构造方法指定配置源名称和底层数据 public PropertySource(String name, T source) { this.name name; this.source source; } // 核心方法根据 key 获取配置值抽象方法由子类实现 public abstract Object getProperty(String key); // 其他方法获取名称、判断是否包含某个 key 等 public String getName() { return this.name; } public T getSource() { return this.source; } public boolean containsProperty(String key) { return getProperty(key) ! null; } }核心要点• PropertySource 是抽象类必须由子类实现 getProperty() 方法不同配置源的读取逻辑不同• name配置源的唯一标识可通过该名称操作配置源如添加、删除、调整顺序• source底层数据载体比如 yml 文件对应的 source 是 Map环境变量对应的 source 是 System.getenv() 返回的 Map。2. SpringBoot 中常见的 PropertySource 实现类SpringBoot 启动时会自动加载多种配置源每种配置源对应一个 PropertySource 实现类我们日常开发中接触的所有配置都来自这些实现类按优先级从高到低排列如下重点记PropertySource 实现类对应配置来源优先级核心说明CommandLinePropertySource命令行参数如 --server.port8081最高启动时通过命令行传入会覆盖其他所有配置SystemEnvironmentPropertySource操作系统环境变量如 JAVA_HOME、PATH次高系统级配置SpringBoot 会自动加载JvmSystemPropertiesPropertySourceJVM 系统参数如 -Dspring.profiles.activedev中高启动时通过 -D 传入优先级高于配置文件ConfigFileApplicationListener$ConfigurationPropertySourceapplication-{profile}.yml/properties如 application-dev.yml中激活环境的配置文件优先级高于默认配置文件ConfigFileApplicationListener$ConfigurationPropertySourceapplication.yml/properties默认配置文件中低默认配置文件所有环境都会加载ClassPathResourcePropertySource类路径下的其他配置文件如 custom.yml低需手动通过 PropertySource 注解引入DefaultPropertySourceSpring 默认配置如默认端口 8080最低SpringBoot 内置的默认配置可被任何配置覆盖3. 实战查看当前所有 PropertySource调试必备当遇到配置优先级混乱、配置读取不到时最有效的调试方式就是“查看当前所有 PropertySource”了解配置源的顺序和内容实战代码如下RestController RequiredArgsConstructor public class PropertySourceController { private final Environment environment; GetMapping(/env/property-sources) public MapString, Object getPropertySources() { MapString, Object result new HashMap(); // 1. 获取 Environment 中的所有配置源需强转为 ConfigurableEnvironment ConfigurableEnvironment configurableEnvironment (ConfigurableEnvironment) environment; MutablePropertySources propertySources configurableEnvironment.getPropertySources(); // 2. 遍历所有配置源获取名称和核心信息 propertySources.forEach(propertySource - { String sourceName propertySource.getName(); Object source propertySource.getSource(); // 简化输出只保留配置源名称和类型 result.put(sourceName, source.getClass().getSimpleName()); }); return result; } }✅ 测试效果访问接口后会返回当前所有配置源的名称和类型比如{ commandLineArgs: SimpleCommandLinePropertySource, systemEnvironment: SystemEnvironmentPropertySource, systemProperties: MapPropertySource, applicationConfig: [classpath:/application-dev.yml]: OriginTrackedMapPropertySource, applicationConfig: [classpath:/application.yml]: OriginTrackedMapPropertySource }通过这个接口能快速定位配置源的顺序判断某个配置源是否被加载以及优先级是否正确。4. PropertySource 注解引入自定义配置文件SpringBoot 会自动加载 application.yml/properties但如果我们有自定义配置文件如 custom.yml、db.properties就需要用 PropertySource 注解引入该注解会将自定义配置文件封装成 PropertySource添加到 Environment 中。实战示例// 1. 自定义配置文件classpath:custom.yml myapp: custom-name: 自定义配置 custom-value: 123456 // 2. 配置类中引入该配置文件 Configuration // 引入自定义 yml 文件注意PropertySource 默认不支持 yml需指定 factory PropertySource(value classpath:custom.yml, factory YamlPropertySourceFactory.class) public class CustomConfig { // 注入自定义配置两种方式都可以 Value(${myapp.custom-name}) private String customName; Autowired private Environment environment; Bean public String customValue() { // 两种方式读取自定义配置 String value1 customName; String value2 environment.getProperty(myapp.custom-value); return value1 : value2; } } // 3. 自定义 YamlPropertySourceFactory解决 PropertySource 不支持 yml 的问题 public class YamlPropertySourceFactory implements PropertySourceFactory { Override public PropertySource? createPropertySource(String name, EncodedResource resource) throws IOException { // 读取 yml 文件封装成 PropertySource YamlPropertiesFactoryBean factory new YamlPropertiesFactoryBean(); factory.setResources(resource.getResource()); Properties properties factory.getObject(); String sourceName name ! null ? name : resource.getResource().getFilename(); return new PropertiesPropertySource(sourceName, properties); } }⚠️ 注意PropertySource 注解默认只支持 properties 文件若要引入 yml 文件需自定义 PropertySourceFactory如上述 YamlPropertySourceFactory。四、SpringBoot 配置加载的完整链路理解了 Environment 和 PropertySource 的核心概念后我们再梳理一下 SpringBoot 启动时配置加载的完整流程搞懂“配置从哪里来、怎么被加载、怎么被读取”1. 完整加载流程1. SpringBoot 启动初始化 Spring 容器创建 Environment 对象默认是 StandardServletEnvironment2. Environment 初始化时会自动加载「默认配置源」系统环境变量、JVM 系统参数、Spring 内置默认配置3. ConfigFileApplicationListener 监听器触发加载 classpath 下的 application.yml/properties 和 application-{profile}.yml/properties封装成对应的 PropertySource添加到 Environment 的配置源列表中4. 如果有自定义配置文件通过 PropertySource 引入会被封装成 PropertySource添加到 Environment 中默认添加到列表末尾优先级较低5. 如果有命令行参数、配置中心配置Nacos/Apollo会被封装成对应的 PropertySource添加到 Environment 列表的前面优先级较高6. 配置绑定Value、ConfigurationProperties和代码中直接使用 Environment 读取配置时Environment 会按配置源列表的顺序从前往后查找 key返回第一个匹配的值。2. 配置优先级总结结合上述流程SpringBoot 配置的优先级从高到低排列后面的会覆盖前面的记准这个顺序能快速解决配置冲突问题命令行参数 操作系统环境变量 JVM 系统参数 激活环境配置文件application-{profile}.yml 默认配置文件application.yml 自定义配置文件PropertySource 引入 Spring 内置默认配置✅ 示例如果 application.yml 中配置 server.port8080命令行传入 --server.port8081最终生效的是 8081因为命令行参数的优先级更高。五、扩展 Environment 与 PropertySource日常开发中除了使用 SpringBoot 自带的配置源我们还经常需要扩展配置源如从数据库读取配置、自定义配置中心这就需要手动操作 Environment 和 PropertySource下面讲解两个高频扩展场景。手动添加自定义 PropertySource优先级最高需求自定义一个配置源如 Map 类型添加到 Environment 中让其优先级最高覆盖其他所有配置。Configuration public class CustomPropertySourceConfig { Bean public CommandLineRunner customPropertySource(ConfigurableEnvironment environment) { return args - { // 1. 自定义配置源Map 类型模拟配置数据 MapString, Object customConfig new HashMap(); customConfig.put(spring.application.name, custom-app); customConfig.put(server.port, 8088); // 2. 封装成 MapPropertySourcePropertySource 的实现类 PropertySource? customPropertySource new MapPropertySource( customPropertySource, // 配置源名称唯一 customConfig ); // 3. 将自定义配置源添加到 Environment 最前面优先级最高 environment.getPropertySources().addFirst(customPropertySource); // 验证读取配置确认自定义配置源生效 String appName environment.getProperty(spring.application.name); System.out.println(自定义配置源生效appName appName); // 输出 custom-app }; } }✅ 效果启动项目后server.port 会变成 8088spring.application.name 变成 custom-app说明自定义配置源成功覆盖了其他配置。从数据库读取配置自定义 PropertySource需求配置信息存储在数据库中项目启动时从数据库读取配置封装成 PropertySource添加到 Environment 中实现“数据库配置驱动”。// 1. 数据库表设计简化 CREATE TABLE sys_config ( id int(11) NOT NULL AUTO_INCREMENT, config_key varchar(50) NOT NULL COMMENT 配置key, config_value varchar(255) NOT NULL COMMENT 配置值, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8; // 2. 实体类 Data public class SysConfig { private Integer id; private String configKey; private String configValue; } // 3. 自定义 PropertySource从数据库读取配置 public class DbPropertySource extends PropertySourceJdbcTemplate { // 构造方法指定配置源名称和 JdbcTemplate用于查询数据库 public DbPropertySource(String name, JdbcTemplate source) { super(name, source); } // 核心方法根据 key 从数据库查询配置值 Override public Object getProperty(String key) { String sql SELECT config_value FROM sys_config WHERE config_key ?; try { // 从数据库查询配置 return source.queryForObject(sql, String.class, key); } catch (Exception e) { // 没有查询到配置返回 null交给下一个配置源 return null; } } } // 4. 配置类将数据库配置源添加到 Environment Configuration public class DbConfigSourceConfig { Autowired private JdbcTemplate jdbcTemplate; Bean public CommandLineRunner dbPropertySource(ConfigurableEnvironment environment) { return args - { // 1. 创建自定义数据库配置源 PropertySource? dbPropertySource new DbPropertySource( dbPropertySource, jdbcTemplate ); // 2. 添加到 Environment添加到 application.yml 之前优先级高于默认配置文件 environment.getPropertySources().addBefore( applicationConfig: [classpath:/application.yml], dbPropertySource ); // 验证读取数据库中的配置 String dbConfig environment.getProperty(db.custom.config); System.out.println(数据库配置生效 dbConfig); }; } }✅ 效果项目启动时会从数据库读取配置封装成 DbPropertySource添加到 Environment 中优先级高于 application.yml读取配置时会优先从数据库获取。配置动态刷新结合配置中心需求配置中心如 Nacos的配置修改后无需重启项目Environment 能实时获取到最新配置即配置热更新。核心原理配置中心修改配置后会触发事件手动更新 Environment 中的对应 PropertySource实现配置热更新。// 简化示例结合 Nacos核心逻辑 Component public class NacosConfigRefreshListener { Autowired private ConfigurableEnvironment environment; // 监听 Nacos 配置变化事件 EventListener(NacosConfigChangedEvent.class) public void onConfigChanged(NacosConfigChangedEvent event) { // 1. 获取变化的配置信息Nacos 回调提供 String dataId event.getDataId(); MapString, Object newConfig event.getConfigInfo(); // 2. 找到对应的 PropertySourceNacos 配置对应的 PropertySource MutablePropertySources propertySources environment.getPropertySources(); PropertySource? nacosPropertySource propertySources.get(nacosConfigSource); // 3. 更新 PropertySource 中的配置替换底层数据 if (nacosPropertySource instanceof MapPropertySource) { ((MapPropertySource) nacosPropertySource).getSource().putAll(newConfig); } // 4. 通知 Environment 配置已更新可选部分场景需要 System.out.println(Nacos 配置更新key event.getKeys()); } }✅ 说明实际开发中Nacos、Apollo 等配置中心会自动实现上述逻辑我们只需引入对应依赖开启热更新即可底层都是通过更新 Environment 中的 PropertySource 实现的。八、总结•1. 核心关系Environment 是门面PropertySource 是载体所有配置都通过 Environment 统一读取底层由 PropertySource 支撑•2. 核心功能Environment 管理配置源和 ProfilesPropertySource 存储具体配置•3. 配置优先级命令行 环境变量 JVM 参数 激活环境配置 默认配置 自定义配置•4. 扩展能力自定义 PropertySource 可实现从数据库、接口等自定义来源读取配置添加到 Environment 中•5. 排错关键查看配置源列表、确认优先级、检查配置 key 和格式、调试 PropertySource 更新•6. 实战口诀配置来源看 Source读取入口看 Environment优先级看顺序扩展自定义 Source。看到这里你已经彻底掌握了 Environment 与 PropertySource 的底层原理和实战用法不仅能解决日常开发中的配置问题还能实现自定义配置源、配置热更新等高级功能面试时也能从容应对底层问题。其实这部分知识的核心就是“理解配置的管理逻辑”——所有配置都被封装成 PropertySource由 Environment 统一管理优先级由配置源的顺序决定。掌握这个核心无论遇到什么配置相关的问题都能迎刃而解。收藏这篇下次遇到配置读取异常、优先级混乱、热更新失效等问题直接对照梳理少走弯路 关注我后续持续分享 SpringBoot 底层干货、实战技巧从入门到进阶帮你吃透核心知识点高效搬砖

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…