SpringBoot源码阅读(10)——后处理器
后处理器是在监听器EnvironmentPostProcessorApplicationListener
中被加载。
入口在SpringApplication
实例方法prepareEnvironment
,第343行。
listeners.environmentPrepared(bootstrapContext, environment);
这里触发了事件ApplicationEnvironmentPreparedEvent
相关监听器
监听器 | Order |
---|---|
DelegatingApplicationListener | 0 |
EnvironmentPostProcessorApplicationListener | Integer.MIN_VALUE + 10 |
LoggingApplicationListener | Integer.MIN_VALUE + 20 |
AnsiOutputApplicationListener | Integer.MIN_VALUE + 11 |
FileEncodingApplicationListener | Integer.MAX_VALUE |
排序后,触发顺序
DelegatingApplicationListener
EnvironmentPostProcessorApplicationListener
AnsiOutputApplicationListener
LoggingApplicationListener
FileEncodingApplicationListener
EnvironmentPostProcessorApplicationListener
就是监听器之一。
EnvironmentPostProcessorApplicationListener
主要方法
private void onApplicationEnvironmentPreparedEvent(ApplicationEnvironmentPreparedEvent event) {ConfigurableEnvironment environment = event.getEnvironment();SpringApplication application = event.getSpringApplication();for (EnvironmentPostProcessor postProcessor : getEnvironmentPostProcessors(application.getResourceLoader(),event.getBootstrapContext())) {postProcessor.postProcessEnvironment(environment, application);}
}
List<EnvironmentPostProcessor> getEnvironmentPostProcessors(ResourceLoader resourceLoader,ConfigurableBootstrapContext bootstrapContext) {ClassLoader classLoader = (resourceLoader != null) ? resourceLoader.getClassLoader() : null;EnvironmentPostProcessorsFactory postProcessorsFactory = this.postProcessorsFactory.apply(classLoader);return postProcessorsFactory.getEnvironmentPostProcessors(this.deferredLogs, bootstrapContext);
}
其中this.postProcessorsFactory
是EnvironmentPostProcessorsFactory::fromSpringFactories
static EnvironmentPostProcessorsFactory fromSpringFactories(ClassLoader classLoader) {return new ReflectionEnvironmentPostProcessorsFactory(classLoader,SpringFactoriesLoader.loadFactoryNames(EnvironmentPostProcessor.class, classLoader));
}
EnvironmentPostProcessor
的实现类
# Environment Post Processors
org.springframework.boot.env.EnvironmentPostProcessor=\
org.springframework.boot.cloud.CloudFoundryVcapEnvironmentPostProcessor,\
org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor,\
org.springframework.boot.env.RandomValuePropertySourceEnvironmentPostProcessor,\
org.springframework.boot.env.SpringApplicationJsonEnvironmentPostProcessor,\
org.springframework.boot.env.SystemEnvironmentPropertySourceEnvironmentPostProcessor,\
org.springframework.boot.reactor.DebugAgentEnvironmentPostProcessor# Environment Post Processors
org.springframework.boot.env.EnvironmentPostProcessor=\
org.springframework.boot.autoconfigure.integration.IntegrationPropertiesEnvironmentPostProcessor
处理器 | Order值 |
---|---|
CloudFoundryVcapEnvironmentPostProcessor | Integer.MIN_VALUE + 10 - 1 |
ConfigDataEnvironmentPostProcessor | Integer.MIN_VALUE + 10 |
RandomValuePropertySourceEnvironmentPostProcessor | Integer.MIN_VALUE + 1 |
SpringApplicationJsonEnvironmentPostProcessor | Integer.MIN_VALUE + 5 |
SystemEnvironmentPropertySourceEnvironmentPostProcessor | Integer.MIN_VALUE + 5 - 1 |
DebugAgentEnvironmentPostProcessor | Integer.MAX_VALUE |
IntegrationPropertiesEnvironmentPostProcessor | Integer.MAX_VALUE |
最后顺序
RandomValuePropertySourceEnvironmentPostProcessor
SystemEnvironmentPropertySourceEnvironmentPostProcessor
SpringApplicationJsonEnvironmentPostProcessor
CloudFoundryVcapEnvironmentPostProcessor
ConfigDataEnvironmentPostProcessor
DebugAgentEnvironmentPostProcessor
IntegrationPropertiesEnvironmentPostProcessor
EnvironmentPostProcessorApplicationListener
实例化的时候,是调用的无参构造方法。
public EnvironmentPostProcessorApplicationListener() {this(EnvironmentPostProcessorsFactory::fromSpringFactories, new DeferredLogs());
}
实例化后关键属性
属性 | 值 |
---|---|
postProcessorsFactory | EnvironmentPostProcessorsFactory::fromSpringFactories |
deferredLogs | DeferredLogFactory |
ReflectionEnvironmentPostProcessorsFactory
实例化后的属性
属性 | 值 |
---|---|
classes | null |
classLoader | null |
classNames | EnvironmentPostProcessor实现类的类全限定名\ |
加载EnvironmentPostProcessor
实现类的主要逻辑
@Override
public List<EnvironmentPostProcessor> getEnvironmentPostProcessors(DeferredLogFactory logFactory,ConfigurableBootstrapContext bootstrapContext) {Instantiator<EnvironmentPostProcessor> instantiator = new Instantiator<>(EnvironmentPostProcessor.class,(parameters) -> {parameters.add(DeferredLogFactory.class, logFactory);parameters.add(Log.class, logFactory::getLog);parameters.add(ConfigurableBootstrapContext.class, bootstrapContext);parameters.add(BootstrapContext.class, bootstrapContext);parameters.add(BootstrapRegistry.class, bootstrapContext);});return (this.classes != null) ? instantiator.instantiateTypes(this.classes): instantiator.instantiate(this.classLoader, this.classNames);
}
public Instantiator(Class<?> type, Consumer<AvailableParameters> availableParameters) {this(type, availableParameters, throwingFailureHandler);
}
public Instantiator(Class<?> type, Consumer<AvailableParameters> availableParameters,FailureHandler failureHandler) {this.type = type;this.availableParameters = getAvailableParameters(availableParameters);this.failureHandler = failureHandler;
}
Instantiator
是一个通过用的实例化工具类。
主要逻辑:
- 获取要实例化的类的构造方法,按照构造方法的参数个数倒序排序。
- 然后检查每个参数,是否是给定参数集合中类的子类或者类本身。
- 如果找到了,就把给定参数集合中的值作为参数返回,拿去调用构造方法
- 优先使用个数多个的构造方法,默认使用无参构造
- 构造完成后,使用
AnnotationAwareOrderComparator
比较器排序一番。
属性 | 值 |
---|---|
type | EnvironmentPostProcessor.class |
availableParameters | DeferredLogFactory.class factoryType -> DeferredLogs |
Log.class | logFactory::getLog |
ConfigurableBootstrapContext.class | factoryType -> bootstrapContext |
BootstrapContext.class | factoryType -> bootstrapContext |
BootstrapRegistry.class | factoryType -> bootstrapContext |
failureHandler | 初始化失败后的处理器,默认是抛异常 |
RandomValuePropertySourceEnvironmentPostProcessor
构造方法
public RandomValuePropertySourceEnvironmentPostProcessor(Log logger) {this.logger = logger;
}
SystemEnvironmentPropertySourceEnvironmentPostProcessor
默认无参构造
SpringApplicationJsonEnvironmentPostProcessor
默认无参构造
CloudFoundryVcapEnvironmentPostProcessor
构造方法
public CloudFoundryVcapEnvironmentPostProcessor(Log logger) {this.logger = logger;
}
ConfigDataEnvironmentPostProcessor
构造方法
public ConfigDataEnvironmentPostProcessor(DeferredLogFactory logFactory,ConfigurableBootstrapContext bootstrapContext) {this(logFactory, bootstrapContext, null);
}public ConfigDataEnvironmentPostProcessor(DeferredLogFactory logFactory,ConfigurableBootstrapContext bootstrapContext,ConfigDataEnvironmentUpdateListener environmentUpdateListener) {this.logFactory = logFactory;this.logger = logFactory.getLog(getClass());this.bootstrapContext = bootstrapContext;this.environmentUpdateListener = environmentUpdateListener;
}
DebugAgentEnvironmentPostProcessor
默认无参构造
IntegrationPropertiesEnvironmentPostProcessor
默认无参构造
最后得到各自的构造方法
类 | 构造方法 |
---|---|
RandomValuePropertySourceEnvironmentPostProcessor | public RandomValuePropertySourceEnvironmentPostProcessor(Log logger) |
SystemEnvironmentPropertySourceEnvironmentPostProcessor | 无参构造 |
SpringApplicationJsonEnvironmentPostProcessor | 无参构造 |
CloudFoundryVcapEnvironmentPostProcessor | public CloudFoundryVcapEnvironmentPostProcessor(Log logger) |
ConfigDataEnvironmentPostProcessor | public ConfigDataEnvironmentPostProcessor(DeferredLogFactory logFactoryConfigurableBootstrapContext bootstrapContext) |
DebugAgentEnvironmentPostProcessor | 无参构造 |
IntegrationPropertiesEnvironmentPostProcessor | 无参构造 |
实例化后排序 |
RandomValuePropertySourceEnvironmentPostProcessor
SystemEnvironmentPropertySourceEnvironmentPostProcessor
SpringApplicationJsonEnvironmentPostProcessor
CloudFoundryVcapEnvironmentPostProcessor
ConfigDataEnvironmentPostProcessor
DebugAgentEnvironmentPostProcessor
IntegrationPropertiesEnvironmentPostProcessor
逻辑
RandomValuePropertySourceEnvironmentPostProcessor
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {RandomValuePropertySource.addToEnvironment(environment, this.logger);
}
这个处理器会创建一个Random
对象,放入sources
,key
为random
如果环境变量已经加载,就放在环境变量后面,没有加载,就放到最后
SystemEnvironmentPropertySourceEnvironmentPostProcessor
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {String sourceName = StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME;PropertySource<?> propertySource = environment.getPropertySources().get(sourceName);if (propertySource != null) {replacePropertySource(environment, sourceName, propertySource, application.getEnvironmentPrefix());}
}@SuppressWarnings("unchecked")
private void replacePropertySource(ConfigurableEnvironment environment, String sourceName,PropertySource<?> propertySource, String environmentPrefix) {Map<String, Object> originalSource = (Map<String, Object>) propertySource.getSource();SystemEnvironmentPropertySource source = new OriginAwareSystemEnvironmentPropertySource(sourceName,originalSource, environmentPrefix);environment.getPropertySources().replace(sourceName, source);
}
这个处理器会处理系统环境变量,把系统环境变量包装成OriginAwareSystemEnvironmentPropertySource
SpringApplicationJsonEnvironmentPostProcessor
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {MutablePropertySources propertySources = environment.getPropertySources();propertySources.stream().map(JsonPropertyValue::get).filter(Objects::nonNull).findFirst().ifPresent((v) -> processJson(environment, v));
}
private void processJson(ConfigurableEnvironment environment, JsonPropertyValue propertyValue) {JsonParser parser = JsonParserFactory.getJsonParser();Map<String, Object> map = parser.parseMap(propertyValue.getJson());if (!map.isEmpty()) {addJsonPropertySource(environment, new JsonPropertySource(propertyValue, flatten(map)));}
}
public static JsonParser getJsonParser() {if (ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", null)) {return new JacksonJsonParser();}if (ClassUtils.isPresent("com.google.gson.Gson", null)) {return new GsonJsonParser();}if (ClassUtils.isPresent("org.yaml.snakeyaml.Yaml", null)) {return new YamlJsonParser();}return new BasicJsonParser();
}
这个处理器会从环境变量中获取spring.application.json
或者SPRING_APPLICATION_JSON
的配置,然后找到第一个配置,使用json解析器解析,放入source
,名称为spring.application.json
,位置在servletContextInitParams
或者servletConfigInitParams
之前。
CloudFoundryVcapEnvironmentPostProcessor
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {if (CloudPlatform.CLOUD_FOUNDRY.isActive(environment)) {Properties properties = new Properties();JsonParser jsonParser = JsonParserFactory.getJsonParser();addWithPrefix(properties, getPropertiesFromApplication(environment, jsonParser), "vcap.application.");addWithPrefix(properties, getPropertiesFromServices(environment, jsonParser), "vcap.services.");MutablePropertySources propertySources = environment.getPropertySources();if (propertySources.contains(CommandLinePropertySource.COMMAND_LINE_PROPERTY_SOURCE_NAME)) {propertySources.addAfter(CommandLinePropertySource.COMMAND_LINE_PROPERTY_SOURCE_NAME,new PropertiesPropertySource("vcap", properties));}else {propertySources.addFirst(new PropertiesPropertySource("vcap", properties));}}
}
这个处理器,会从环境变量获取spring.main.cloud-platform
的值,如果是CloudPlatform.CLOUD_FOUNDRY
类型,如果值是CLOUD_FOUNDRY
或者包含VCAP_APPLICATION
或VCAP_SERVICES
,就执行开源云平台的逻辑。
从环境变量中获取VCAP_APPLICATION
和VCAP_SERVICES
的值,用json解析器解析,分别加上前缀vcap.application.
和vcap.services.
,放入sources
,名称是vcap
,位置上,如果有命令行参数,就放在命令行参数后面,如果没有,就放首位。
ConfigDataEnvironmentPostProcessor
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {postProcessEnvironment(environment, application.getResourceLoader(), application.getAdditionalProfiles());
}
ConfigDataEnvironment getConfigDataEnvironment(ConfigurableEnvironment environment, ResourceLoader resourceLoader,Collection<String> additionalProfiles) {return new ConfigDataEnvironment(this.logFactory, this.bootstrapContext, environment, resourceLoader,additionalProfiles, this.environmentUpdateListener);
}
创建一个ConfigDataEnvironment
实例,过程中会创建一个ConfigDataLocationResolvers
实例。
ConfigDataEnvironment(DeferredLogFactory logFactory, ConfigurableBootstrapContext bootstrapContext,ConfigurableEnvironment environment, ResourceLoader resourceLoader, Collection<String> additionalProfiles,ConfigDataEnvironmentUpdateListener environmentUpdateListener) {Binder binder = Binder.get(environment);UseLegacyConfigProcessingException.throwIfRequested(binder);this.logFactory = logFactory;this.logger = logFactory.getLog(getClass());this.notFoundAction = binder.bind(ON_NOT_FOUND_PROPERTY, ConfigDataNotFoundAction.class).orElse(ConfigDataNotFoundAction.FAIL);this.bootstrapContext = bootstrapContext;this.environment = environment;this.resolvers = createConfigDataLocationResolvers(logFactory, bootstrapContext, binder, resourceLoader);this.additionalProfiles = additionalProfiles;this.environmentUpdateListener = (environmentUpdateListener != null) ? environmentUpdateListener: ConfigDataEnvironmentUpdateListener.NONE;this.loaders = new ConfigDataLoaders(logFactory, bootstrapContext, resourceLoader.getClassLoader());this.contributors = createContributors(binder);
}
感觉像是捅了马蜂窝了。
ConfigDataLocationResolvers
实例化,会加载ConfigDataLocationResolver
的实现类。
# ConfigData Location Resolvers
org.springframework.boot.context.config.ConfigDataLocationResolver=\
org.springframework.boot.context.config.ConfigTreeConfigDataLocationResolver,\
org.springframework.boot.context.config.StandardConfigDataLocationResolver
ConfigTreeConfigDataLocationResolver
实例化,会创建LocationResourceLoader
实例
StandardConfigDataLocationResolver
实例化,会加载PropertySourceLoader
的实现类
# PropertySource Loaders
org.springframework.boot.env.PropertySourceLoader=\
org.springframework.boot.env.PropertiesPropertySourceLoader,\
org.springframework.boot.env.YamlPropertySourceLoader
StandardConfigDataLocationResolver
中会设置应用的配置文件名称,key是spring.config.name
,默认值是application
,也就是Spring
配置文件的名字也是可以配置的,这个名字中不能包含*号。
至于PropertiesPropertySourceLoader
和YamlPropertySourceLoader
,就是解析Spring
配置文件的两个加载器,前者解析properties
后缀文件,后者解析yml
后缀文件。
ConfigDataLocationResolvers
中,在加载完成ConfigDataLocationResolver
的接口后,会重新排序,把StandardConfigDataLocationResolver
的子类或本身保留最后实现,放入集合末尾。
ConfigDataEnvironment
实例化时,会创建ConfigDataLoaders
实例,进而加载ConfigDataLoader
的实例。
# ConfigData Loaders
org.springframework.boot.context.config.ConfigDataLoader=\
org.springframework.boot.context.config.ConfigTreeConfigDataLoader,\
org.springframework.boot.context.config.StandardConfigDataLoader
然后调用processAndApply
,会读取配置文件。
void processAndApply() {ConfigDataImporter importer = new ConfigDataImporter(this.logFactory, this.notFoundAction, this.resolvers,this.loaders);registerBootstrapBinder(this.contributors, null, DENY_INACTIVE_BINDING);ConfigDataEnvironmentContributors contributors = processInitial(this.contributors, importer);ConfigDataActivationContext activationContext = createActivationContext(contributors.getBinder(null, BinderOption.FAIL_ON_BIND_TO_INACTIVE_SOURCE));contributors = processWithoutProfiles(contributors, importer, activationContext);activationContext = withProfiles(contributors, activationContext);contributors = processWithProfiles(contributors, importer, activationContext);applyToEnvironment(contributors, activationContext, importer.getLoadedLocations(),importer.getOptionalLocations());
}private ConfigDataEnvironmentContributors processInitial(ConfigDataEnvironmentContributors contributors,ConfigDataImporter importer) {this.logger.trace("Processing initial config data environment contributors without activation context");contributors = contributors.withProcessedImports(importer, null);registerBootstrapBinder(contributors, null, DENY_INACTIVE_BINDING);return contributors;
}
相关文章:
SpringBoot源码阅读(10)——后处理器
后处理器是在监听器EnvironmentPostProcessorApplicationListener中被加载。 入口在SpringApplication实例方法prepareEnvironment,第343行。 listeners.environmentPrepared(bootstrapContext, environment);这里触发了事件ApplicationEnvironmentPreparedEvent 相…...

【源码开源】C#桌面应用开发:串口调试助手
c#桌面应用开发 1、环境搭建和工程创建:参照番茄定时器项目 工程创建参照 2、界面布局设计 3、具体功能函数 (1)端口扫描: private void btn_com_scan_Click(object sender, EventArgs e){//端口号扫描ReflashPortToComboBox(…...

malloc与free函数的用法(精简全面 · 一看即懂)
前言:Hello大家好😘,我是心跳sy,今天为大家带来malloc函数与free函数的用法,我们一起来看看吧! 目录 一、malloc函数 💫 1、⭐️malloc函数对应的头文件⭐️ 2、⭐️malloc函数的作用⭐️ 3…...

强制升级最新系统,微软全面淘汰Win10和部分11用户
说出来可能不信,距离 Windows 11 正式发布已过去整整三年时间,按理说现在怎么也得人均 Win 11 水平了吧? 然而事实却是,三年时间过去 Win 11 占有率仅仅突破到 29%,也就跳起来摸 Win 10 屁股的程度。 2024 年 6 月 Wi…...
java-命令行连接 mysql
在 Java 中,通过命令行连接 MySQL 可以使用以下步骤。假设您已经安装并配置了 MySQL 5.7。 ### 一、通过命令行连接 MySQL #### 1. 打开命令行终端 在不同的操作系统上打开命令行终端的方式: - **Windows**:按 Win R 键,输入…...

RK3588部署YOLOV8-seg的问题
在使用YOLOV8-seg训练出来的pt模型转为onnx的时候,利用以下仓库地址转。 git clone https://github.com/airockchip/ultralytics_yolov8.git 在修改ultralytics/cfg/default.yaml中的task,mode为model为自己需要的内容后, 执行以下语句 cd …...
Python Linux下编译
注意 本教程针对较新Linux系统,没有升级依赖、处理旧版本Linux的openssl等步骤,如有需要可以查看往期文章,例如:在Centos7.6镜像中安装Python3.9 教程中没有使用默认位置、默认可执行文件名,请注意甄别 安装路径&#…...

SpringMVC(3)——SpringMVC注解实战
前言 SpringMVC(2)——controller方法参数与html表单对应(请求参数的绑定) 上篇博客我们提到了controller方法的参数与html表单之间的对应关系 但是这种对应关系有很多缺点: 传递参数只能放在request的body当中&am…...

统信UOS上批量安装惠普打印驱动后启动器没有图标的解决方法
原文链接:统信UOS上批量安装惠普打印驱动后启动器没有图标的解决方法 Hello,大家好啊!今天给大家带来一篇关于在统信UOS上批量安装惠普打印驱动后启动器没有设置图标的解决方法的文章。批量安装打印驱动是企业和个人用户常见的操作࿰…...

Python UDP编程之实时聊天与网络监控详解
概要 UDP(User Datagram Protocol,用户数据报协议)是网络协议中的一种,主要用于快速、简单的通信场景。与TCP相比,UDP没有连接、确认、重传等机制,因此传输效率高,但也不保证数据的可靠性和顺序。本文将详细介绍Python中如何使用UDP协议进行网络通信,并包含相应的示例…...

LiveNVR监控流媒体Onvif/RTSP用户手册-用户管理:编辑、添加用户、关联通道、重置密码、删除、过滤搜索
LiveNVR监控流媒体Onvif/RTSP用户手册-用户管理:编辑、添加用户、关联通道、重置密码、删除、过滤搜索 1、用户管理1.1、添加用户1.2、关联通道1.3、重置密码1.4、编辑1.5、删除1.6、过滤搜索 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、用户管理 1.1、添加用户 点击用户管理…...

SpringBoot新手快速入门系列教程十:基于Docker Compose,部署一个简单的项目
前述: 本篇教程将略过很多docker下载环境配置的基础步骤,如果您对docker不太熟悉请参考我的上一个教程:SpringBoot新手快速入门系列教程九:基于docker容器,部署一个简单的项目 使用 Docker Compose 支持部署 Docker 项…...
websocket中的STOMP 协议:sockjs-client 和 stompjs
文章目录 一、简介二、安装三、创建 webSocket.ts四、页面中使用一、简介 使用 WebSockets 进行实时通信时,一种常见的实现方式是使用 STOMP 协议。STOMP(Simple Text Oriented Messaging Protocol)是一种轻量级的协议,通常用于客户端和消息代理之间的通信,如 WebSockets…...
阿里云API安全2.0全新发布
阿里云安全发布API防护产品已将近三年,为客户提供API资产全生命周期监控管理,发现和管理业务中存在的全量API接口资产,并提升API接口在数据流转过程中的安全性,现已全面覆盖OWASP提出的API TOP 10安全风险。 近期,阿里…...

学习网络的第一步:全面解析OSI与TCP/IP模型
我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hello,大家好!我是你们的好朋友小米。今天我们来聊一聊网络基础知识中的重量级选手——OSI模型和TCP/IP模型!网络的世界就像一个巨大的迷宫,而这两个…...

鸿蒙语言基础类库:【@ohos.util (util工具函数)】
util工具函数 说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 该模块…...

CVPR`24 | 又快又好!渲染速度比ENeRF快30倍!4K4D:实时4K分辨率4D视图合成
文章链接:https://arxiv.org/pdf/2310.11448 git链接: https://zju3dv.github.io/4k4d/ 本文旨在实现动态3D场景在4K分辨率下的高保真和实时视图合成。最近,一些动态视图合成方法在渲染质量方面表现出色。然而,在渲染高分辨率图像…...

中关村软件园发布“数据合规与出境评估服务平台”
在2024中关村论坛年会期间,中关村软件园发布“数据合规与出境评估服务平台”。该平台是中关村软件园结合北京市“两区”建设,立足软件园国家数字服务出口基地和数字贸易港建设,围绕园区内外部企业用户的业务合作、科研创新、跨国运营等场景需…...

记一次若依框架和Springboot常见报错的实战漏洞挖掘
目录 前言 本次测实战利用图 1.判段系统框架 2.登录页面功能点测试 2.1 弱口令 2.2 webpack泄露信息判断 2.3 未授权接口信息发现 3.进一步测试发现新的若依测试点 3.1 默认弱口令 3.2 历史漏洞 4.访问8080端口发现spring经典爆粗 4.1 druid弱口令 4.2 SwaggerU…...

Idea合并Git分支信息
#git 的笔记 ##本篇文章是通过Idea 实现git 命令操作的代码的上传与合并。 1.合并分支 点击 Git 选择Merge 这里选择合并远程的分支...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...

高考志愿填报管理系统---开发介绍
高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发,采用现代化的Web技术,为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## 📋 系统概述 ### 🎯 系统定…...