当前位置: 首页 > news >正文

【Spring底层分析】Spring IoC

Spring IoC

IoC:控制反转。将对象创建和对象之间的调用交给Spring容器来管理。好处是降低了对象之间的耦合度。

DI:依赖注入。给bean对象注入依赖的对象。

大白话就是:Spring帮你创建对象,对象的属性如果依赖于某个对象,也是Spring为对象注入依赖对象。

怎么理解Spring IoC可以降低对象之间的耦合度?

// 传统高耦合代码
public class UserService {private UserRepository userRepository = new JdbcUserRepository(); // 直接依赖具体类public void saveUser(User user) {userRepository.save(user);}
}

Spring IoC降低对象之间的耦合度:

public class UserService {private UserRepository userRepository; // 依赖接口// 构造器注入public UserService(UserRepository userRepository) {this.userRepository = userRepository;}
}
@Configuration
public class AppConfig {@Beanpublic UserRepository userRepository() {return new JpaUserRepository(); // 只需修改此处即可切换实现}
}

Spring依赖注入的四个方式?

  • 构造函数注入

    • Spring在创建某个类的实例时,会选择这个类的一个构造器创建。
    • 如果只有一个构造器就会默认使用,而如果有多个,则选择标有@Autowired注解的构造器使用。
    • 解析构造函数参数,从容器获取相应的Bean。
    • 创建实例,并完成依赖注入。
  • 字段注入

    • Spring创建完类实例后,扫描 @Autowired 注解的字段,Spring 会从容器中找到匹配的 Bean并注入。
  • setter方法注入

    • Spring创建完类实例后,扫描 @Autowired 注解的方法,从容器中找到匹配的 Bean,并通过反射调用 Setter 方法注入依赖。
  • @Bean 方法参数注入

    • (@Bean )public UserService userService(Environment env),会找到Environment类型的bean注入。

代码解释:

@Component
public class Chef {private Vegetable vegetable; // 依赖抽象(接口)private Egg egg;// 管家(Spring)通过构造函数自动注入食材public Chef(Vegetable vegetable, Egg egg) { this.vegetable = vegetable;this.egg = egg;}public void cook() {Dish dish = new Dish(vegetable, egg);}
}@Component
public class Tomato implements Vegetable { /* ... */ }
@Component
public class Chef {@Autowired  // 字段注入private Vegetable vegetable;  // Spring 会注入 Vegetable 的实例private Egg egg;             // 无 @Autowired,Spring 不会注入(此时 egg = null)// 默认无参构造器(Spring 会调用它)
}
public class Chef {private Vegetable vegetable;private Egg egg;// 必需依赖通过构造函数注入public Chef(Vegetable vegetable) {this.vegetable = vegetable;}// 可选依赖通过 Setter 注入@Autowired(required = false)public void setEgg(Egg egg) {this.egg = egg;}
}
@Bean
public UserService userService(Environment env) {// 从环境变量中读取 "env.mode" 的值String envMode = env.getProperty("env.mode");if ("prod".equals(envMode)) {return new UserServiceImplA(); // 生产环境实现} else {return new UserServiceImplB(); // 默认/开发环境实现}
}

Spring容器启动阶段都会干什么?

  • ApplicationContext applicationContext = new ClassPathXmlApplicationContext(“beans.xml”);

在这里插入图片描述

  • refresh();

在这里插入图片描述

  • obtainFreshBeanFactory()
  • finishBeanFactoryInitialization()

在这里插入图片描述

  • ▲obtainFreshBeanFactory()

这个方法主要干的是:加载和解析配置文件,保存到对应的 Bean 定义中(保存在BeanDefinition中),然后将这些BeanDefinition注册到beanDefinitionMap中。(用于后续bean实例化做准备。)

BeanDefinition 中保存了我们的 Bean 信息,比如这个 Bean 指向的是哪个类、是否是单例的、是否懒加载、这个 Bean 依赖了哪些 Bean 等等。

  • ▲finishBeanFactoryInitialization()

    这个方法主要干的是:对于单实例bean的创建、属性赋值、初始化。

    • preInstantiateSingletons():处理所有非懒加载的单实例

      • List beanNames = new ArrayList(this.beanDefinitionNames); // 获取所有beanName

      • 处理 FactoryBean

      • 处理普通的 Bean:getBean(beanName);// 初始化所有非懒加载的单实例bean

  • ▲getBean(beanName)

    这个方法主要干的是:对于单实例bean的创建、属性赋值、初始化。

    • doGetBean():已经初始化过了就从容器中直接返回,否则就先初始化再返回。
      • createBean() ->Object beanInstance = doCreateBean(beanName, mbdToUse, args) :获得实例化后的bean实例
  • ▲doCreateBean(beanName, mbdToUse, args)

    在这个方法中可以看到bean生命周期的前三个阶段。

    • instanceWrapper = this.createBeanInstance(beanName, mbd, args);:实例化阶段
      • return instantiateUsingFactoryMethod(beanName, mbd, args); // 采用工厂方法实例化
      • return autowireConstructor(beanName, mbd, null, null); // 构造函数依赖注入
      • return instantiateBean(beanName, mbd); //使用无参构造器
    • this.populateBean(beanName, mbd, instanceWrapper);:属性赋值阶段
    • exposedObject = this.initializeBean(beanName, exposedObject, mbd);:初始化阶段

Spring 的 Bean 实例化方式?

方式1:使用构造器实例化

  • 直接通过类的构造器创建 Bean,由 Spring 自动调用。
  • 依赖注入通过构造器参数完成
@Service
public class UserService {private final UserRepository userRepository;// 构造器注入(Spring 自动注入 UserRepository)public UserService(UserRepository userRepository) {this.userRepository = userRepository;}public User getUserById(Long id) {return userRepository.findById(id);}
}@Repository
public class JpaUserRepository implements UserRepository {// 实现数据访问逻辑
}

应用场景:

大多数简单 Bean 的创建,如 Service、Repository 类。

方式2:静态工厂方法

  • 通过类的静态方法返回 Bean 实例,工厂类无需实例化。
  • 方法必须是 static 的。
// 静态工厂类:
public class UserFactory {// 静态方法:直接通过类名调用public static User createUser() {return new User("John");}
}
// 注解配置
@Configuration
public class AppConfig {@Beanpublic static User user() {return UserFactory.createUser(); // 直接调用静态方法,无需实例化 UserFactory}
}

“当 @Configuration 类中的 @Bean 方法是静态的且没有其他需要实例化的成员(如非静态方法或 @Autowired 字段)时,Spring 不会创建该配置类的实例。因为静态方法属于类级别,Spring 可以直接通过类名调用,无需实例化对象。但如果配置类中存在非静态方法或依赖注入字段,Spring 会创建实例以满足这些需求。”

应用场景:

创建全局工具类或整合第三方库的 Bean。

@Bean
public static DataSource dataSource() {return LegacyDataSourceFactory.createDataSource();
}@Bean
public static ExecutorService threadPool() {return Executors.newFixedThreadPool(10);
}

方式3:实例工厂方法

  • 通过一个已存在的工厂 Bean 的非静态方法创建目标 Bean。
  • 方法是非静态的
@Component
public class DataSourceFactory {@Autowiredprivate Environment env;  // 注入环境变量(如 application.properties 中的配置)public DataSource createDataSource() {HikariDataSource dataSource = new HikariDataSource();dataSource.setJdbcUrl(env.getProperty("spring.datasource.url"));dataSource.setUsername(env.getProperty("spring.datasource.username"));dataSource.setPassword(env.getProperty("spring.datasource.password"));return dataSource;}
}@Configuration
public class DataSourceConfig {@Autowiredprivate DataSourceFactory dataSourceFactory;@Beanpublic DataSource dataSource() {return dataSourceFactory.createDataSource();  // 调用实例方法创建 Bean}}

应用场景:工厂类需要依赖其他 Bean 或动态配置

方式4:FactoryBean 接口实例化方式

  • 通过实现 FactoryBean 接口,将复杂对象的创建逻辑封装到 getObject() 方法中。
public class SqlSessionFactoryBean implements FactoryBean<SqlSessionFactory> {private DataSource dataSource;// 依赖注入数据源public void setDataSource(DataSource dataSource) {this.dataSource = dataSource;}@Overridepublic SqlSessionFactory getObject() throws Exception {  // SqlSessionFactory创建过程SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers/*.xml"));return factoryBean.getObject();}@Overridepublic Class<?> getObjectType() {return SqlSessionFactory.class;}@Overridepublic boolean isSingleton() {return true;}
}// 配置类中注册 FactoryBean
@Configuration
public class MyBatisConfig {@Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);return factoryBean;}
}

应用场景:

适合创建bean实例时需要复杂初始化流程,如整合 MyBatis时, 通过 SqlSessionFactoryBean 配置数据源、XML 映射文件路径等,简化 SqlSessionFactory 的创建过程。

bean的生命周期?

实例化、属性赋值、初始化、使用、销毁

  • 实例化:四种实例化方式

  • 属性赋值:

    • 1、收集数据:扫描标有@Autowired的字段或方法。
    • 2、查找依赖:在bean容器中根据类型或名称查找匹配的bean
    • 3、反射注入:通过反射将依赖的bean赋值给字段或者方法。
  • 初始化:

    • 1、BeanPostProcessor.postProcessBeforeInitialization():BeanPostProcessor的前置处理器
    • 2、@PostConstruct注解方法:执行bean类中标有这个注解的方法
    • 3、InitializingBean.afterPropertiesSet():让bean实现InitializingBean接口,重写里头的初始化方法
    • 4、XML/注解中指定的init-method:@Bean(initMethod = “customInit”)
    • 5、BeanPostProcessor.postProcessAfterInitialization():BeanPostProcessor的后置处理器
  • 使用

  • 销毁

说说循环依赖?

对象A 依赖 对象B,对象B 依赖 对象A,就成了循环依赖。

A 实例化的时候,发现依赖 B,创建 B 实例,创建 B 的时候发现需要 A,创建 A1 实例……无限套娃。。。。

Spring 怎么解决循环依赖呢?

Spring能解决循环依赖的条件是:单实例bean,且通过 Setter/字段注入(构造器注入无法解决循环依赖)

Spring 通过三级缓存解决单例 Bean 的循环依赖问题。

  1. 一级缓存存放已完全初始化的 Bean,
  2. 二级缓存存放提前暴露的半成品 Bean(已实例化但未完成属性注入),
  3. 三级缓存存放生成半成品 Bean 的 ObjectFactory

以 A 依赖 B,B 依赖 A 为例:

  • 创建 A 时,实例化后将其 ObjectFactory 放入三级缓存。
  • 填充 A 的属性时发现依赖 B,触发 B 的创建。
  • 创建 B 时同样将 ObjectFactory 放入三级缓存,填充 B 的属性时发现依赖 A,它就从缓存里找 A 对象。依次从⼀级到三级缓存查询 A。
  • B从三级缓存中通过对象⼯⼚生成A的早期引用,将 A 的早期引用放⼊⼆级缓存,并从三级缓存移除。此时,B 已经实例化并且初始化完成了,把 B 放入⼀级缓存。
  • A 继续完成属性注入和初始化。顺利从⼀级缓存拿到实例化且初始化完成的 B 对象,A 对象创建也完成,删除⼆级缓存中的 A,同时把 A 放⼊⼀级缓存。
  • 最后,⼀级缓存中保存着实例化、初始化都完成的 A、B 对象。

ObjectFactory

以 A 依赖 B,B 依赖 A 为例:

  • 创建 A 时,实例化后将其 ObjectFactory 放入三级缓存。
  • 填充 A 的属性时发现依赖 B,触发 B 的创建。
  • 创建 B 时同样将 ObjectFactory 放入三级缓存,填充 B 的属性时发现依赖 A,它就从缓存里找 A 对象。依次从⼀级到三级缓存查询 A。
  • B从三级缓存中通过对象⼯⼚生成A的早期引用,将 A 的早期引用放⼊⼆级缓存,并从三级缓存移除。此时,B 已经实例化并且初始化完成了,把 B 放入⼀级缓存。
  • A 继续完成属性注入和初始化。顺利从⼀级缓存拿到实例化且初始化完成的 B 对象,A 对象创建也完成,删除⼆级缓存中的 A,同时把 A 放⼊⼀级缓存。
  • 最后,⼀级缓存中保存着实例化、初始化都完成的 A、B 对象。

相关文章:

【Spring底层分析】Spring IoC

Spring IoC IoC&#xff1a;控制反转。将对象创建和对象之间的调用交给Spring容器来管理。好处是降低了对象之间的耦合度。 DI&#xff1a;依赖注入。给bean对象注入依赖的对象。 大白话就是&#xff1a;Spring帮你创建对象&#xff0c;对象的属性如果依赖于某个对象&#xf…...

Ubuntu系统进程管理

在Ubuntu系统中&#xff0c;进程管理是系统维护和性能调优的重要部分。以下是关键命令和技巧的总结&#xff0c;帮助你有效管理系统进程&#xff1a; 1. 查看进程 ps 命令&#xff1a;查看当前进程快照。 bash ps aux # 查看所有运行中的进程&#xff08;a所有用户…...

HDU2196 Computer 树形DP

原题链接 既然要查找每个节点的最远到达距离&#xff0c;由于该图是个树&#xff0c;我们就找从根节点向下遍历方向的终点的距离与先返回父节点再从最优的父节点沿着原来的方向的终点的距离的最大值 如图所示 也就是说&#xff0c;我们需要获得当前点的正距离最大值和正距离最…...

【第四十周】文献阅读:用于检索-增强大语言模型的查询与重写

目录 摘要Abstract用于检索-增强大语言模型的查询与重写研究背景方法论基于冻结LLM的重写方案基于可训练重写器的方案重写器预热训练&#xff08;Rewriter Warm-up&#xff09;强化学习&#xff08;Reinforcement Learning&#xff09; 创新性实验结果局限性总结 摘要 这篇论文…...

Istio常用命令

Istio常用命令 1. 安装和配置2. Sidecar 注入3. 验证和状态4. 升级和卸载5. 故障排除6. 配置管理 istioctl 的常用命令及其详细说明&#xff1a; 1. 安装和配置 安装 Istio # 使用指定的配置文件&#xff08;如 demo&#xff09;安装 Istio 到 Kubernetes 集群。 istioctl m…...

Linux基础15

一、网络模型 二、eNSP模拟器 拖拽操作建立模拟网络环境 交换机视图操作&#xff1a; <> 用户视图 [] 系统视图 接口视图 协议视图 ​ display version #显示版本和设备型号 ​ display current-configuration #查看设备配置(查错) ​…...

FISCO BCOS群组扩容实战指南:从原理到操作全解析

引言&#xff1a;为什么需要群组扩容&#xff1f; 在区块链技术迅猛发展的今天&#xff0c;企业级应用对区块链平台提出了更高的要求。"如何在不影响现有业务的情况下扩展区块链处理能力&#xff1f;"、"能否实现不同业务数据的物理隔离&#xff1f;"、&qu…...

【pytorch图像视觉】lesson17深度视觉应用(上)构建自己的深度视觉项目

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、 数据1、认识经典数据1.1入门数据&#xff1a;MNIST、其他数字与字母识别&#xff08;1&#xff09;数据加载&#xff08;2&#xff09;查看数据的特征和标…...

从“被动跳闸”到“主动预警”:智慧用电系统守护老旧小区安全

安科瑞顾强 近年来&#xff0c;老旧小区电气火灾事故频发&#xff0c;成为威胁居民生命财产安全的重要隐患。据统计&#xff0c;我国居住场所火灾伤亡人数远超其他场所&#xff0c;仅今年一季度就发生8.3万起住宅火灾&#xff0c;造成503人遇难。这些建筑多建于上世纪&#x…...

2.1 全栈运维管理:Proxmox VE单节点配置桥接、VLAN和Bonding的详细实验指南

本文是Proxmox VE 全栈管理体系的系列文章之一&#xff0c;如果对 Proxmox VE 全栈管理感兴趣&#xff0c;可以关注“Proxmox VE 全栈管理”专栏&#xff0c;后续文章将围绕该体系&#xff0c;从多个维度深入展开。 概要&#xff1a;本文介绍 Proxmox VE 单节点网络配置。桥接基…...

docker面试题

1.docker网络 Docker网络是Docker容器之间进行通信的关键功能。Docker提供了多种网络模式和驱动&#xff0c;以满足不同的网络需求。以下是Docker网络的详细介绍&#xff1a; 1.Docker网络模式 Docker提供了以下几种网络模式&#xff0c;每种模式适用于不同的场景&#xff1a;…...

计算机视觉——基于YOLOV8 的人体姿态估计训练与推理

概述 自 Ultralytics 发布 YOLOV5 之后&#xff0c;YOLO 的应用方向和使用方式变得更加多样化且简单易用。从图像分类、目标检测、图像分割、目标跟踪到关键点检测&#xff0c;YOLO 几乎涵盖了计算机视觉的各个领域&#xff0c;似乎已经成为计算机视觉领域的“万能工具”。 Y…...

【本地图床搭建】宝塔+Docker+MinIO+PicGo+cpolar:打造本地化“黑科技”图床方案

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言宝塔安装DockerMinIO 安装与设置cploar内网穿透PicGo下载与安装typora安装总结互动…...

【家政平台开发(41)】家政平台性能蜕变:性能测试与优化全解析

本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…...

监控docker中的java应用

1)进入指定的容器 docker exec -it demo /bin/bash 2)下载curl root89a67e345354:/# apt install curl -y 3)下载arthas root89a67e345354:/# curl -O https://arthas.aliyun.com/arthas-boot.jar 4)运行 root89a67e345354:/# java -jar arthas-boot.jar 5)监控 […...

Android游戏辅助工具开发详解

文章目录 第一部分&#xff1a;概述与基础准备1.1 游戏辅助工具的定义与用途1.2 开发环境准备1.3 项目创建与配置 第二部分&#xff1a;核心功能实现2.1 屏幕点击功能实现2.1.1 基础点击功能2.1.2 多点触控实现 2.2 滑动功能实现2.2.1 基础滑动功能2.2.2 曲线滑动实现 2.3 屏幕…...

重生之外卖配送时被投诉后的反思

重生之外卖配送时被投诉后的反思 写苍穹外卖时 我们发现在每一次调用sql语句时 insert update语句总会需要在service的实现类里加入例如create_time,create_user , update_time , update_user的填充 每次赋值都要重新编写代码&#xff0c;会造成代码冗余 &#xff1b; 序号字…...

计算机基础复习资料整理

计算机基础复习资料整理 一、操作系统 &#xff08;一&#xff09;定义 操作系统&#xff08;Operating System&#xff0c;OS&#xff09;是介于计算机硬件和用户&#xff08;程序或人&#xff09;之间的接口。作为通用管理程序&#xff0c;它管理计算机系统中每个部件的活动…...

Profibus DP主站网关数据映射全解析!

Profibus DP主站网关数据映射全解析&#xff01; 在工业自动化领域&#xff0c;Profibus DP主站网关作为一种关键的通讯设备&#xff0c;其数据映射的精准度和效率对整个控制系统的性能有着至关重要的影响。本文旨在深入探讨Profibus DP主站网关的数据映射过程&#xff0c;揭示…...

ocr-不动产权识别

目录 一、在阿里云申请ocr识别服务 二、创建springboot项目 三、后续 一、在阿里云申请ocr识别服务 在线体验&#xff1a;房产证图片上传 [阿里官方]不动产权证OCR文字识别_API专区_云市场-阿里云 (aliyun.com) 可以选择一毛500次这个 当然也可以白嫖100 下面有个在线调试…...

leetcode 198. House Robber

本题是动态规划问题。 第一步&#xff0c;明确并理解dp数组以及下标的含义 dp[i]表示从第0号房间一直到第i号房间(包含第i号房间)可以偷到的最大金额&#xff0c;具体怎么偷这里不考虑&#xff0c;第i1号及之后的房间也不考虑。换句话说&#xff0c;dp[i]也就是只考虑[0,i]号…...

【2025软考高级架构师】——软件架构设计(4)

摘要 本文主要介绍了几种软件架构设计相关的概念和方法。包括C2架构风格的规则&#xff0c;模型驱动架构&#xff08;MDA&#xff09;的起源、目标、核心模型及各模型之间的关系&#xff1b;软件架构复用的概念、历史发展、维度、类型及相关过程&#xff1b;特定领域架构&…...

分发饼干问题——用贪心算法解决

目录 一&#xff1a;问题描述 二&#xff1a;解决思路 贪心策略&#xff08;C语言&#xff09;算法复习总结3——贪心算法-CSDN博客 三&#xff1a;代码实现 四&#xff1a;复杂度分析 一&#xff1a;问题描述 分发饼干问题是一个经典的可以使用贪心算法解决的问题&#xf…...

深入详解MYSQL的MVCC机制

参考资料: 参考视频(注意第二个视频关于幻读的讲解是错误的,详情见本文) redoLog的结构详解 参考资料 学习内容: 1. MVCC要解决的问题 MVCC要解决的问题是,在不产生脏读等数据库问题的前提下,数据库的查询语句和更改语句不相互阻塞的情况; 在InnoDB中,MVCC仅仅存…...

DNS域名解析

目录 一.DNS 1.1DNS的简介 1.2DNS的背景 1.3DNS的架构 1.4实现DNS的方式 1.5DNS的查询类型 1.6DNS解析的基本流程 二.主从复制 2.1定义 2.2优缺点 三.DNS服务软件 3.1bind 3.1.1定义 3.1.2bind相关文件 3.2DNS服务器的核心文件 3.2.1主配置文件 3.2.2域名文件 …...

Java基础:一文讲清多线程和线程池和线程同步

01-概述 02-线程创建 继承Thread 实现Runnable(任务对象) 实现Callable接口 public class ThreadDemo3 {public static void main(String[] args) throws ExecutionException, InterruptedException {// 目标&#xff1a;线程创建3// 需求&#xff1a;求1-100的和Callable<…...

ubuntu 20.04 连不上蓝牙耳机/蓝牙鼠标

sudo gedit /etc/bluetooth/main.conf改为 ControllerMode dual然后重启蓝牙服务 sudo service bluetooth restart...

SaaS、Paas、IaaS、MaaS、BaaS五大云计算服务模式

科普版&#xff1a;通俗理解五大云计算服务模式 1. SaaS&#xff08;软件即服务&#xff09; 一句话解释&#xff1a;像“租用公寓”&#xff0c;直接使用现成的软件&#xff0c;无需操心维护。 案例&#xff1a;使用钉钉办公、在网页版WPS编辑文档。服务提供商负责软件更新和…...

【深拷贝、浅拷贝】golang函数参数传递,变量复制后,操作变量参数,是否影响原有数据?全面解析

Golang中深拷贝与浅拷贝的详细解析&#xff0c;以及变量复制、函数参数传递等场景下对新旧变量影响的总结&#xff1a; 一拷贝与浅拷贝的核心区别 1. 浅拷贝&#xff08;Shallow Copy&#xff09; • 定义&#xff1a;仅复制数据的顶层结构&#xff0c;对引用类型字段&#x…...

c语言编程经典习题详解3

21. 求给定正整数 n 以内的素数之积 定义:找出小于给定正整数n的所有素数,并将它们相乘。要点:使用双层for循环,外层循环遍历小于n的数,内层循环判断是否为素数,若是则累乘。应用:在数论研究、密码学等领域有应用。c #include <stdio.h>int isPrime(int num) {if…...

【HD-RK3576-PI】Docker搭建与使用

硬件&#xff1a;HD-RK3576-PI 软件&#xff1a;Linux6.1Ubuntu22.04 1. 安装Docker Docker安装脚本下载&#xff1a; roothd-rk3576-pi:~ $ curl -fsSL https://test.docker.com -o test-docker.sh 可以直接执行安装 roothd-rk3576-pi:~ $ sh test-docker.sh 2. 配置国内镜…...

C++进阶——异常

目录 1、异常的概念及使用 1.1 异常的概念 1.2 异常的抛出和捕获 1.3 栈展开 1.4 查找匹配的处理代码 1.5 异常的重新抛出 1.6 异常的安全问题 1.7 异常的规范 2、标准库的异常(了解) 1、异常的概念及使用 1.1 异常的概念 C语言&#xff0c;出错了&#xff0c;就报错…...

Linux安装开源版MQTT Broker——EMQX服务器环境从零到一的详细搭建教程

零、EMQX各个版本的区别 EMQX各个版本的功能对比详情https://docs.emqx.com/zh/emqx/latest/getting-started/feature-comparison.html...

C++ 编程指南36 - 使用Pimpl模式实现稳定的ABI接口

一&#xff1a;概述 C 的类布局&#xff08;尤其是私有成员变量&#xff09;直接影响它的 ABI&#xff08;应用二进制接口&#xff09;。如果你在类中添加或修改了私有成员&#xff0c;即使接口不变&#xff0c;编译器生成的二进制布局也会变&#xff0c;从而导致 ABI 不兼容。…...

笔记本电脑突然无法开机电源灯亮但是屏幕无法点亮

现象 按电源键&#xff0c;电源灯点亮&#xff0c;屏幕没动静 风扇开始运转&#xff0c;然后一会儿就不转了&#xff1b;屏幕一直没动静&#xff0c;屏幕没有任何反应&#xff08;没有系统启动画面&#xff0c;没有徽标显示&#xff0c;就一点反应也没用&#xff09; 这个问…...

mongodb 4.0+多文档事务的实现原理

1. 副本集事务实现&#xff08;4.0&#xff09;‌ ‌非严格依赖二阶段提交‌ MongoDB 4.0 在副本集环境中通过 ‌全局逻辑时钟&#xff08;Logical Clock&#xff09;‌ 和 ‌快照隔离&#xff08;Snapshot Isolation&#xff09;‌ 实现多文档事务&#xff0c;事务提交时通过…...

decompiled.class file bytecode version50(java 6)

idea运行项目报错&#xff0c;跳到具体的.class中&#xff0c;idea会给出提示下载源码&#xff0c;点击下载报错&#xff0c;具体报错信息我没记录了&#xff08;反正就是无法看到源码&#xff09; 解决方式&#xff1a; 1、网上说下载scala插件&#xff0c;重启idea即可 但是…...

CSS 列表样式学习笔记

CSS 列表样式提供了强大的功能&#xff0c;用于定制 HTML 列表的外观。通过 CSS&#xff0c;可以轻松地改变列表项的标记类型、位置&#xff0c;甚至使用图像作为列表项标记。以下是对 CSS 列表样式的详细学习笔记。 一、HTML 列表类型 在 HTML 中&#xff0c;主要有两种类型…...

linux网络设置

ifconfig 查看ip地址 查看当前的liunx系统的网络参数ip地址 Ubuntu需要安装 Apt install -y net-tools 查看网络信息 Ifconfig 只能看到开启的网卡 Ifconfig -a 看到所有的网卡包括开启和关闭的 Ifconfig 网卡名称 up 开启网卡 Ifconfig 网卡名称 down 关闭网卡 If…...

抗干扰CAN总线通信技术在分布式电力系统中的应用

摘要&#xff1a;随着分布式电力系统的广泛应用&#xff0c;其通信系统的可靠性与稳定性受到了前所未有的挑战。CAN总线通信技术以其卓越的抗干扰性能和可靠性&#xff0c;在众多通信技术中脱颖而出&#xff0c;成为解决分布式电力系统通信问题的关键。本文深入剖析了CAN总线通…...

Maven工具学习使用(十二)——extension和depency的区别

在 Maven 中&#xff0c;extensions 和 dependencies 是两个不同的概念&#xff0c;它们在项目构建和依赖管理中扮演着不同的角色。 1、Dependencies dependencies 是 Maven 项目中用于管理项目所需的库和模块的部分。这些依赖可以是本地仓库中的&#xff0c;也可以是远程仓库…...

Python学生信息查询

利用字典设置学生信息&#xff0c;将这些信息放入列表中进行存储&#xff0c;根据输入的姓名查询展示对应的学生信息。 Student1{no:202001,name:zyt,score:87} Student2Student1.copy() Student3Student2.copy()Student2[no]202002 Student3[no]202003Student2[name]zwh Stud…...

一天时间,我用AI(deepseek)做了一个配色网站

前言 最近在开发颜色搭配主题的相关H5和小程序&#xff0c;想到需要补充一个web网站&#xff0c;因此有了这篇文章。 一、确定需求 向AI要答案之前&#xff0c;一定要清楚自己想要做什么。如果你没有100%了解自己的需求&#xff0c;可以先让AI帮你理清逻辑和思路&#xff0c;…...

MQ(消息队列)体系详解

消息队列&#xff08;MQ&#xff0c;Message Queue&#xff09; 是一种基于消息传递的异步通信机制&#xff0c;用于不同系统、服务之间进行数据传递和交互。它通常用来解耦生产者和消费者&#xff0c;提供高可用、高吞吐量和可靠的消息传递。 一、消息队列用途 1.系统解耦 …...

【GESP真题解析】第 3 集 GESP一级样题卷编程题 2:闰年求和

大家好&#xff0c;我是莫小特。 这篇文章给大家分享 GESP 一级样题卷编程题第 2 题&#xff1a;闰年求和。 题目链接 洛谷链接&#xff1a;B3846 闰年求和 一、完成输入 根据题目要求&#xff0c;我们需要输入两个整数&#xff0c;分别表示起始年份和终止年份。 要求计算…...

Windows Server 2019 安装 Docker 完整指南

博主本人使用的是离线安装 1. 安装前准备 系统要求 操作系统&#xff1a;Windows Server 2019&#xff08;或 2016/2022&#xff09;权限&#xff1a;管理员权限的 PowerShell网络&#xff1a;可访问互联网&#xff08;或离线安装包&#xff09; 启用容器功能 Install-Win…...

JetBrains PhpStorm v2024.3.1 Mac PHP开发工具

JetBrains PhpStorm v2024.3.1 Mac PHP开发工具 一、介绍 JetBrains PhpStorm 2024 mac&#xff0c;是一款PHP开发工具&#xff0c;直接开始编码&#xff0c;无需安装和配置大量插件。PhpStorm 从一开始就已包含 PHP、JavaScript 和 TypeScript 开发所需的一切&#xff0c;还…...

机器学习(ML)在AI驱动测试通过数据驱动的智能决策显著提升测试效率、覆盖率和准确性。

机器学习(ML)在AI驱动测试中扮演着 核心引擎 的角色,通过数据驱动的智能决策显著提升测试效率、覆盖率和准确性。以下是机器学习在测试各环节的具体作用及实现方案: 一、机器学习在测试生命周期中的作用 #mermaid-svg-u4vgPE6O2jugiZFB {font-family:"trebuchet ms&qu…...

0x06.Redis 中常见的数据类型有哪些?

回答重点 Redis 常见的数据结构主要有五种,这五种类型分别为:String(字符串)、List(列表)、Hash、Set(集合)、Zset(有序集合,也叫sorted set)。 String 字符串是Redis中最基本的数据类型,可以存储任何类型的数据,包括文本、数字和二进制数据。它的最大长度为512MB。 使…...

本地缓存方案Guava Cache

Guava Cache 是 Google 的 Guava 库提供的一个高效内存缓存解决方案&#xff0c;适用于需要快速访问且不频繁变更的数据。 // 普通缓存 Cache<Key, Value> cache CacheBuilder.newBuilder().maximumSize(1000) // 最大条目数.expireAfterWrite(10, TimeUnit.MINUTES) /…...