SpringBean模块(二)bean初始化(2)和容器初始化顺序的比较--引入ApplicationContextInitializer

前面介绍了获取容器可以让spring bean实现ApplicationContextAware,实际也是初始化执行了setApplicationContext接口,

初始化接口还可以借助一些注解或者spring bean的初始化方法,那么他们的执行顺序是什么样的呢?

一、验证(没有依赖关系时)是无序的

1、demo
下面新建三个class文件

分别使用ApplicationContextAware、@PostConstruct和InitializingBean

package com.bit.demo.test.bean;import com.bit.demo.dto.UserDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class InitUserInitUtil implements ApplicationContextAware {private static UserDTO userDTO;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {log.info("初始化方法,ApplicationContextInitializer");UserDTO user = new UserDTO();user.setUserName("zs");user.setPassword("123456");this.userDTO = user;}public static UserDTO getUserDTO() {return userDTO;}
}
package com.bit.demo.test.bean;import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;@Component
@Slf4j
public class TestClass1 {@PostConstructpublic void init(){//项目启动执行方法log.info("初始化方法, 使用PostConstruct");}
}
package com.bit.demo.test.bean;import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;@Component
@Slf4j
public class TestClass2 implements InitializingBean {@PostConstructpublic void initAgain() {log.info("初始化方法, 同时使用PostConstruct和InitializingBean");}@Overridepublic void afterPropertiesSet() throws Exception {log.info("初始化方法, 使用InitializingBean");}
}
  启动项目输出
 .   ____          _            __ _ _/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/  ___)| |_)| | | | | || (_| |  ) ) ) )'  |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot ::                (v3.2.4)2025-03-28T10:56:01.574+08:00  INFO 13716 --- [           main] com.bit.demo.BitApplication              : Starting BitApplication using Java 17.0.11 with PID 13716 (C:\mydemo\bit-demo\target\classes started by Tina.Zhang in C:\code\cci-voice)
2025-03-28T10:56:01.576+08:00  INFO 13716 --- [           main] com.bit.demo.BitApplication              : No active profile set, falling back to 1 default profile: "default"
2025-03-28T10:56:02.209+08:00  INFO 13716 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 7777 (http)
2025-03-28T10:56:02.216+08:00  INFO 13716 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2025-03-28T10:56:02.217+08:00  INFO 13716 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.19]
2025-03-28T10:56:02.258+08:00  INFO 13716 --- [           main] o.a.c.c.C.[.[localhost].[/bitDemo]       : Initializing Spring embedded WebApplicationContext
2025-03-28T10:56:02.258+08:00  INFO 13716 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 648 ms
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
Initialization Sequence datacenterId:6 workerId:4_ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ /               |         3.5.5 
2025-03-28T10:56:02.495+08:00  INFO 13716 --- [           main] c.bit.demo.test.bean.InitUserInitUtil    : 初始化方法,ApplicationContextInitializer
2025-03-28T10:56:02.496+08:00  INFO 13716 --- [           main] com.bit.demo.test.bean.TestClass1        : 初始化方法, 使用PostConstruct
2025-03-28T10:56:02.497+08:00  INFO 13716 --- [           main] com.bit.demo.test.bean.TestClass2        : 初始化方法, 同时使用PostConstruct和InitializingBean
2025-03-28T10:56:02.497+08:00  INFO 13716 --- [           main] com.bit.demo.test.bean.TestClass2        : 初始化方法, 使用InitializingBean
2025-03-28T10:56:02.718+08:00  INFO 13716 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 7777 (http) with context path '/bitDemo'
2025-03-28T10:56:02.723+08:00  INFO 13716 --- [           main] com.bit.demo.BitApplication              : Started BitApplication in 1.385 seconds (process running for 1.765)
2、考虑到路径影响类的加载

前面的输出顺序是InitUserInitUtil > TestClass1 > TestClass2,正好和类路径顺序一致,考虑到类的路径影响类的加载,现在TestClass1、TestClass2各copy出来一个,加个前缀Aa,排在InitUserInitUtil 的前面。

新增文件

再次启动

可以看到Aa开头的类日志先输出了。

3、结论

ApplicationContextAware的setApplicationContext、@PostConstruct、

InitializingBean的afterPropertiesSet 他们的执行顺序是随机的。

4、错误引用

基于上面,AaTestClass1 > AaTestClass2 > InitUserInitUtil > TestClass1 > TestClass2

现在如果在AaTestClass2中利用InitUserInitUtil 获取UserDTO:

package com.bit.demo.test.bean;import com.bit.demo.dto.UserDTO;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;@Component
@Slf4j
public class AaTestClass2 implements InitializingBean {@PostConstructpublic void initAgain() {log.info("初始化方法, 同时使用PostConstruct和InitializingBean");}@Overridepublic void afterPropertiesSet() throws Exception {log.info("初始化方法, 使用InitializingBean");UserDTO innitUser = InitUserInitUtil.getUserDTO();if(innitUser != null) {log.info("获取user成功",innitUser);}else{log.info("获取user失败",innitUser);}}
}

因为此时InitUserInitUtil 还没有初始化,获取到的是null:

注意:

这也间接说明了,不要滥用ApplicationContextAware来获取Bean,能自动获取Bean的都通过Autowired等注解获取,因为使用了注解spring自身会优化加载顺序,让被依赖的Bean先执行。在必须手动获取如非spring bean中使用则不用考虑加载问题(非spring bean根本不会自动加载)。

5、使用自动装配引入依赖关系来解决引用问题 

我们知道,使用@Autowired等自动装配,可以让被依赖的bean先执行。针对上面的问题,改写下:

package com.bit.demo.test.bean;import com.bit.demo.dto.UserDTO;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
@Slf4j
public class AaTestClass2 implements InitializingBean {@Autowiredprivate InitUserInitUtil initUserInitUtil;@PostConstructpublic void initAgain() {log.info("初始化方法, 同时使用PostConstruct和InitializingBean");}@Overridepublic void afterPropertiesSet() throws Exception {log.info("初始化方法, 使用InitializingBean");UserDTO innitUser = InitUserInitUtil.getUserDTO();if(innitUser != null) {log.info("获取user成功",innitUser.toString());}else{log.info("获取user失败",innitUser);}}
}

这时启动打印:AaTestClass1  > InitUserInitUtil > AaTestClass2  > TestClass1 > TestClass2,

对比上面的AaTestClass1 > AaTestClass2 > InitUserInitUtil > TestClass1 > TestClass2,可见InitUserInitUtil 提前加载了 

6、引入ApplicationContextInitializer

上面增加依赖关系可以解决bean的引用问题。

那如果就希望InitUserInitUtil做为一个最底层的bean,能够在其他业务bean之前加载,还可以使用

ApplicationContextInitializer。
package com.bit.demo.test.bean;import com.bit.demo.dto.UserDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class InitUserInitUtil implements ApplicationContextInitializer {private static UserDTO userDTO;public static UserDTO getUserDTO() {return userDTO;}@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {log.info("初始化方法,ApplicationContextInitializer");UserDTO user = new UserDTO();user.setUserName("zs");user.setPassword("123456");this.userDTO = user;}
}

注册:

@SpringBootApplication
public class BitApplication {public static void main(String[] args) {//SpringApplication.run(BitApplication.class, args);SpringApplication application = new SpringApplication(BitApplication.class);application.addInitializers(new InitUserInitUtil()); // 注册自定义 ApplicationContextInitializerapplication.run(args);}
}
package com.bit.demo.test.bean;import com.bit.demo.dto.UserDTO;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;@Component
@Slf4j
public class AaTestClass2 implements InitializingBean {@PostConstructpublic void initAgain() {log.info("初始化方法, 同时使用PostConstruct和InitializingBean");}@Overridepublic void afterPropertiesSet() throws Exception {log.info("初始化方法, 使用InitializingBean");UserDTO innitUser = InitUserInitUtil.getUserDTO();if(innitUser != null) {log.info("获取user成功",innitUser);}else{log.info("获取user失败",innitUser);}}
}
   
再次启动输出
 =========|_|==============|___/=/_/_/_/:: Spring Boot ::                (v3.2.4)2025-03-28T11:18:53.520+08:00  INFO 15408 --- [           main] c.bit.demo.test.bean.InitUserInitUtil    : 初始化方法,ApplicationContextInitializer
2025-03-28T11:18:53.525+08:00  INFO 15408 --- [           main] com.bit.demo.BitApplication              : Starting BitApplication using Java 17.0.11 with PID 15408 (C:\mydemo\bit-demo\target\classes started by Tina.Zhang in C:\code\cci-voice)
2025-03-28T11:18:53.526+08:00  INFO 15408 --- [           main] com.bit.demo.BitApplication              : No active profile set, falling back to 1 default profile: "default"
2025-03-28T11:18:54.182+08:00  INFO 15408 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 7777 (http)
2025-03-28T11:18:54.190+08:00  INFO 15408 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2025-03-28T11:18:54.190+08:00  INFO 15408 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.19]
2025-03-28T11:18:54.233+08:00  INFO 15408 --- [           main] o.a.c.c.C.[.[localhost].[/bitDemo]       : Initializing Spring embedded WebApplicationContext
2025-03-28T11:18:54.233+08:00  INFO 15408 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 672 ms
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
Initialization Sequence datacenterId:6 workerId:2_ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ /               |         3.5.5 
2025-03-28T11:18:54.467+08:00  INFO 15408 --- [           main] com.bit.demo.test.bean.AaTestClass1      : 初始化方法, 使用PostConstruct
2025-03-28T11:18:54.467+08:00  INFO 15408 --- [           main] com.bit.demo.test.bean.AaTestClass2      : 初始化方法, 同时使用PostConstruct和InitializingBean
2025-03-28T11:18:54.468+08:00  INFO 15408 --- [           main] com.bit.demo.test.bean.AaTestClass2      : 初始化方法, 使用InitializingBean
2025-03-28T11:18:54.468+08:00  INFO 15408 --- [           main] com.bit.demo.test.bean.AaTestClass2      : 获取user成功
2025-03-28T11:18:54.469+08:00  INFO 15408 --- [           main] com.bit.demo.test.bean.TestClass1        : 初始化方法, 使用PostConstruct
2025-03-28T11:18:54.469+08:00  INFO 15408 --- [           main] com.bit.demo.test.bean.TestClass2        : 初始化方法, 同时使用PostConstruct和InitializingBean
2025-03-28T11:18:54.469+08:00  INFO 15408 --- [           main] com.bit.demo.test.bean.TestClass2        : 初始化方法, 使用InitializingBean
2025-03-28T11:18:54.688+08:00  INFO 15408 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 7777 (http) with context path '/bitDemo'
2025-03-28T11:18:54.694+08:00  INFO 15408 --- [           main] com.bit.demo.BitApplication              : Started BitApplication in 1.376 seconds (process running for 1.72)

二、ApplicationContextInitializer

1、介绍

ApplicationContextInitializer 是 Spring 框架中的一个接口,主要用于在 Spring 容器刷新(refresh())之前ApplicationContext 进行自定义的初始化操作。它允许在 ApplicationContext 完全初始化之前进行配置,例如:添加属性、激活配置文件(Profiles)等。

这种机制让开发者能够在 Spring 启动过程中更早地进行干预,适用于有高级配置需求的应用程序。

该接口位于 org.springframework.context 包下:

public interface ApplicationContextInitializer<C extends ConfigurableApplicationContext> {void initialize(C applicationContext);
}
2、方法说明

initialize(C applicationContext):

  • 该方法在 ApplicationContext 刷新(refresh())之前调用,可以对 applicationContext 进行初始化。

  • CConfigurableApplicationContext 的子类,如 AnnotationConfigApplicationContextGenericApplicationContext

3、典型使用场景
(1)动态修改 Environment 变量

initialize() 方法中修改 Environment,实现动态配置:

@Override
public void initialize(ConfigurableApplicationContext applicationContext) {ConfigurableEnvironment environment = applicationContext.getEnvironment();environment.getSystemProperties().put("my.custom.property", "CustomValue");System.out.println("✅ 设置环境变量 my.custom.property = " + environment.getProperty("my.custom.property"));
}
(2)激活特定的 Spring Profile
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {ConfigurableEnvironment environment = applicationContext.getEnvironment();environment.setActiveProfiles("dev"); // 激活 dev ProfileSystem.out.println("✅ 激活 Profile: " + String.join(", ", environment.getActiveProfiles()));
}
(3)在 Spring 容器启动前添加 PropertySource

如果需要在 Spring 启动前添加额外的配置源(如数据库、远程配置中心等),可以这样做:

import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertiesPropertySource;
import java.util.Properties;@Override
public void initialize(ConfigurableApplicationContext applicationContext) {MutablePropertySources propertySources = applicationContext.getEnvironment().getPropertySources();Properties properties = new Properties();properties.put("extra.config", "Loaded from ApplicationContextInitializer");propertySources.addFirst(new PropertiesPropertySource("extraProperties", properties));System.out.println("✅ 额外配置: " + applicationContext.getEnvironment().getProperty("extra.config"));
}

4、与其他 Spring 组件的对比
组件作用范围作用时间点主要用途
ApplicationContextInitializerSpring 容器ApplicationContext.refresh() 之前初始化 ApplicationContext,添加 PropertySource、修改配置等
BeanFactoryPostProcessorBeanFactoryApplicationContext.refresh() 期间修改 Bean 定义(如动态修改 @Bean 配置)
BeanPostProcessor单个 BeanBean 初始化前后处理 Bean 实例,如 AOP、代理等
ApplicationRunner / CommandLineRunner应用启动完成后ApplicationContext 初始化后运行启动任务(如初始化数据、执行业务逻辑)
5、执行时期和注意事项

ApplicationContextInitializer 的执行时机 早于 Spring 容器刷新(refresh()),如下所示:

(1)创建 SpringApplication

(2)调用 ApplicationContextInitializer.initialize()

(3)加载 Environment

(4)创建 ApplicationContext 并调用 refresh()

(5)扫描 BeanFactory 并注册 Bean

(5)调用 BeanFactoryPostProcessor

(6)调用 InitializingBean@PostConstruct

(7)启动 Spring 容器

注意:由于 ApplicationContextInitializerrefresh() 之前执行,此时 Bean 还未初始化,不能调用 applicationContext.getBean()

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {System.out.println("✅ 获取 ApplicationContext:" + applicationContext);System.out.println("✅ 获取 Environment:" + applicationContext.getEnvironment());// ❌ 不能使用 getBean(),因为此时 Bean 还未初始化try {Object myBean = applicationContext.getBean("myBean");System.out.println("获取 Bean: " + myBean);} catch (Exception e) {System.out.println("⚠️ 此时无法获取 Bean,因为 ApplicationContext 还未刷新!");}}
}
6、使用方法
(1)实现ApplicationContextInitializer
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {System.out.println("🚀 ApplicationContextInitializer 执行...");// 获取 EnvironmentConfigurableEnvironment environment = applicationContext.getEnvironment();// 设置自定义属性environment.getSystemProperties().put("custom.property", "Hello Spring!");// 打印 Environment 变量System.out.println("✅ Environment 自定义属性:" + environment.getProperty("custom.property"));}
}
(2)注册ApplicationContextInitializer

Spring 提供了 3 种方式 来注册 ApplicationContextInitializer

①  在 SpringApplication 中添加 addInitializers

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication application = new SpringApplication(MyApplication.class);application.addInitializers(new MyApplicationContextInitializer()); // 注册自定义 ApplicationContextInitializerapplication.run(args);}
}

② 在 spring.factories 中自动加载

创建 META-INF/spring.factories 文件:

org.springframework.context.ApplicationContextInitializer=com.example.MyApplicationContextInitializer

③ 在测试中使用 @ContextConfiguration

如果只想在测试环境中使用 ApplicationContextInitializer,可以使用 @ContextConfiguration

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;@SpringBootTest
@ContextConfiguration(initializers = MyApplicationContextInitializer.class)
public class MyApplicationTests {@Testvoid contextLoads() {System.out.println("🔍 运行测试...");}
}

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

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

相关文章

中小型企业网络的搭建

1.1 网络逻辑拓扑、布线方案的设计 1.1.1 网络设计依据 网络设计应遵循以下基本原则&#xff1a; 高效性&#xff1a;确保网络架构能够支持企业日常业务的高效运行。 可靠性&#xff1a;采用冗余设计&#xff0c;确保网络的高可用性&#xff0c;避免单点故障。 可扩展性…

angr基础学习

参考&#xff1a;angr AngrCTF_FITM/笔记/03/Angr_CTF从入门到精通&#xff08;三&#xff09;.md at master ZERO-A-ONE/AngrCTF_FITM angr_explore 00_angr_find IDA分析结果&#xff1a; 逻辑简单&#xff0c;输入&#xff0c;complex_function进行加密&#xff0c;加密…

软考-高级-系统架构设计师【考试备考资料下载】

计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试是原中国计算机软件专业技术资格和水平考试的完善与发展。计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试是由国家人力资源和社会保障部、工业和信息化部领导下的国家级考试。 计算机技术与软件专…

3. 第三放平台部署deepseek

有时候我们会发现使用deepseek服务器&#xff0c;异常卡顿&#xff0c;这是由于多方面原因造成的&#xff0c;比如说访问人数过多等。想要解决这个问题&#xff0c;我们可以选择第三方平台进行部署 第三方平台 我们可以选择的第三方平台很多&#xff0c;比如硅基流动、秘塔搜索…

1.4-蜜罐\堡垒机\API接口

1.4-蜜罐\堡垒机\API接口 蜜罐&#xff1a;用来钓鱼或诱惑测试人员的防护系统 bash <(curl -sS -L https://hfish.net/webinstall.sh) # 安装HFISH蜜罐堡垒机&#xff1a; 运维用的&#xff0c;统一管理运维平台;拿下堡垒机就很有可能等于拿下了多个平台 jumpServer一键安…

知识图引导的检索增强生成

摘要 检索增强生成&#xff08;RAG&#xff09;已经成为一种很有前途的技术&#xff0c;用于解决大型语言模型&#xff08;LLM&#xff09;生成的响应中的幻觉问题。现有的RAG研究主要集中在应用基于语义的方法来提取孤立的相关组块&#xff0c;忽略了它们之间的内在关系。在本…

【机器学习】imagenet2012 数据预处理数据预处理

【机器学习】数据预处理 1. 下载/解压数据2. 数据预处理3. 加载以及训练代码3.1 使用PIL等加载代码3.2 使用OpenCV的方式来一张张加载代码3.3 h5的方式来加载大文件 最后总结 这个数据大约 140个G,128w的训练集 1. 下载/解压数据 首先需要下载数据&#xff1a; 数据最后处理…

质量工程:数字化转型时代的质量体系重构

前言&#xff1a;质量理念的范式转移阅读原文 如果把软件开发比作建造摩天大楼&#xff1a; 传统测试 竣工后检查裂缝&#xff08;高成本返工&#xff09; 质量工程 从地基开始的全流程监理体系&#xff08;设计图纸→施工工艺→建材选择→竣工验收&#xff09; IEEE研究…

【全栈开发】—— Paddle OCR 文字识别 + deepseek接入(基于python 最新!!!)

所有源码都在文章中&#xff0c;大家不要私信来要源码&#xff0c;当然&#xff0c;评论区欢迎交流技术 目录 Paddle OCR 配置环境 示例 deepseek接入 环境配置 api 调用代码 sliconflow Paddle OCR 配置环境 清华源下载 paddlepaddle&#xff1a; pip install paddlepaddle …

SAIL-RK3588J 核心板技术方案——高精度装配式建筑机器人控制‌

&#xff08;本方案契合《建筑机器人产业目录》政策要求&#xff09; 一、方案背景与政策支持‌ ‌政策驱动‌ 2025年2月《建筑机器人产业目录》明确将‌“高精度建筑机器人控制设备”‌纳入重点补贴范围&#xff0c;要求定位精度≤0.5mm、支持实时质检与多机协同&#xff0c…

OpenAI API - 快速入门开发

文章目录 开发者快速入门分析图像输入使用工具扩展模型提供闪电般的 AI 体验构建代理进一步探索 模型精选模型推理模型旗舰聊天模型成本优化模型实时模型旧版 GPT 模型DALLE文本转语音转写嵌入调度工具特定模型GPT 基础模型 Libraries创建和导出 API 密钥安装官方 SDKJavaScrip…

蓝桥杯省赛 棋盘 3533 二维差分+二维前缀和

传送门 0棋盘 - 蓝桥云课 const int N 2e3 10;int n,m; int a[N][N];void insert(int x11,int y11,int x22,int y22) {a[x11][y11] ;a[x11][y22 1] --;a[x22 1][y11] --;a[x22 1][y22 1] ; }void solve() {cin >> n >> m;for (int i 1;i < m;i ){int x11…

《C++Linux编程进阶:从0实现muduo 》-第6讲.C++死锁问题如何分析调试-原子操作,互斥量,条件变量的封装

重点内容 视频讲解&#xff1a;《CLinux编程进阶&#xff1a;从0实现muduo C网络框架系列》-第6讲.C死锁问题如何分析调试-原子操作,互斥量,条件变量的封装 代码改动 lesson6代码 实现&#xff1a;base/Atomic.h 实现&#xff1a;base/Mutex.h 实现&#xff1a;base/Condit…

洛谷题单1-P5708 【深基2.习2】三角形面积-python-流程图重构

题目描述 一个三角形的三边长分别是 a a a、 b b b、 c c c&#xff0c;那么它的面积为 p ( p − a ) ( p − b ) ( p − c ) \sqrt{p(p-a)(p-b)(p-c)} p(p−a)(p−b)(p−c) ​&#xff0c;其中 p 1 2 ( a b c ) p\frac{1}{2}(abc) p21​(abc)。输入这三个数字&#xff…

matplotlib标题比x,y轴字体大,明明标题字体更大?

原始代码&#xff1a; plt.xlabel(训练轮次&#xff08;Epochs&#xff09;, fontsize14, fontweightbold, fontpropertieschinese_font) # 设置中文字体、加大、加粗 plt.ylabel(R值, fontsize14, fontweightbold, fontpropertieschinese_font) # 设置中文字体、加大、加粗…

Baklib内容中台的核心优势是什么?

智能化知识管理引擎 Baklib的智能化知识管理引擎通过多源数据整合与智能分类技术&#xff0c;实现企业知识资产的自动化归集与动态更新。系统内置的语义分析算法可自动识别文档主题&#xff0c;结合自然语言处理技术生成结构化标签体系&#xff0c;大幅降低人工标注成本。针对…

Android学习总结之ContentProvider跨应用数据共享

在 Android 开发中&#xff0c;跨应用数据共享是构建开放生态的关键需求。作为四大组件之一&#xff0c;ContentProvider通过标准化接口和安全机制&#xff0c;成为实现这一需求的核心枢纽。本文将围绕其生命周期方法、核心机制、自定义实现及最佳实践展开&#xff0c;帮助开发…

计算机底层基石:原码、反码、补码、移码深度剖析

在计算机的世界里&#xff0c;所有数据最终都以二进制的形式进行存储与运算。原码、反码、补码和移码作为二进制数据的重要编码方式&#xff0c;对计算机实现高效数据处理起着关键作用。接下来&#xff0c;我们将深入剖析这几种编码。​ 一、原码​ 1.1 定义​ 原码是最简单…

Bitnode和Bitree有什么区别 为什么Bitree前多了*

Bitnode 和 Bitree 的区别在于它们的类型定义和用途&#xff1a; Bitnode: 这是一个结构体类型&#xff0c;表示二叉树中的一个节点。 它包含三个成员&#xff1a; data&#xff1a;存储节点的数据&#xff08;这里是 char 类型&#xff09;。 lchild&#xff1a;指向左子节点…

AI 时代,我们该如何写作?

当ChatGPT/DeepSeek能在几秒钟内产出一篇文章&#xff0c;而且生成能力日益精进&#xff0c;你是否也曾思考&#xff0c;我还能做什么&#xff1f; 当2024年AI开始进入人们的视野&#xff0c;我在CSDN 上的博客也悄然发生了变化&#xff0c;以前一篇文章发布后&#xff0c;阅读…