SpringBoot源码解析(九):Bean定义接口体系

SpringBoot源码系列文章

SpringBoot源码解析(一):SpringApplication构造方法

SpringBoot源码解析(二):引导上下文DefaultBootstrapContext

SpringBoot源码解析(三):启动开始阶段

SpringBoot源码解析(四):解析应用参数args

SpringBoot源码解析(五):准备应用环境

SpringBoot源码解析(六):打印Banner

SpringBoot源码解析(七):应用上下文结构体系

SpringBoot源码解析(八):Bean工厂接口体系

SpringBoot源码解析(九):Bean定义接口体系


目录

  • 前言
  • 一、BeanDefinition类图
  • 二、BeanDefinition组件功能解析
    • 1、AttributeAccessor(属性访问器)
    • 2、BeanDefinition(Bean定义)
    • 3、AttributeAccessorSupport(属性访问器支持类)
    • 4、BeanMetadataAttributeAccessor(Bean元数据属性访问器)
    • 5、AbstractBeanDefinition(抽象Bean定义)
    • 6、GenericBeanDefinition(通用Bean定义)
    • 7、ChildBeanDefinition(子Bean定义)
    • 8、RootBeanDefinition(根Bean定义)
    • 9、AnnotatedBeanDefinition(注解Bean定义)
    • 10、ScannedGenericBeanDefinition(扫描通用Bean定义)
  • 总结

前言

  Spring容器的核心在于其对Bean的管理,而这一切的基础则由BeanDefinition接口体系所支撑。BeanDefinition作为描述定义Spring容器中Bean的核心接口,它不仅负责存储Bean的元数据,还为容器的实例化、依赖注入和生命周期管理提供了必要的信息。接下来我们将对其主要组件进行介绍。

一、BeanDefinition类图

在这里插入图片描述

二、BeanDefinition组件功能解析

1、AttributeAccessor(属性访问器)

  AttributeAccessor是一个用于管理和操作键值对形式属性的接口,提供设置获取删除、检查属性等通用功能,广泛应用于Spring框架中元数据的管理

public interface AttributeAccessor {// 设置属性void setAttribute(String name, @Nullable Object value);// 获取指定属性的值 @NullableObject getAttribute(String name);// 如果该键对应的属性值已经存在,则直接返回现有值// 如果不存在,使用计算函数生成新值(相当于延迟计算,调用时候才计算)@SuppressWarnings("unchecked")default <T> T computeAttribute(String name, Function<String, T> computeFunction) {...}// 移除指定键的属性并返回其值@NullableObject removeAttribute(String name);// 检查指定键的属性是否存在boolean hasAttribute(String name);// 返回所有属性的键名称String[] attributeNames();
}

2、BeanDefinition(Bean定义)

  AttributeAccessor是一个用于管理和操作键值对形式属性的接口,提供设置获取删除、检查属性等通用功能,广泛应用于Spring框架中元数据的管理

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {// 单例作用域标识符:`singleton`(表示该 Bean 在整个容器生命周期内只有一个实例)String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;// 原型作用域标识符:`prototype`(表示每次获取该 Bean 时都会创建一个新实例)String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;// 角色:应用程序 Bean(用于实现具体的业务逻辑)int ROLE_APPLICATION = 0;// 角色:支持 Bean(一些配合主逻辑使用的辅助工具或配置类)int ROLE_SUPPORT = 1;// 角色:基础设施 Bean(框架内部的实现类,比如事务管理器或事件监听器,这些 Bean 通常由 Spring 自动生成,用户无需关心)int ROLE_INFRASTRUCTURE = 2;// ==================== 可修改的属性 ====================// 设置父定义的名称(如果有)void setParentName(@Nullable String parentName);// 返回父定义的名称(如果有)@NullableString getParentName();// 设置此 Bean 定义的类名void setBeanClassName(@Nullable String beanClassName);// 返回当前的 Bean 类名@NullableString getBeanClassName();// 设置 Bean 的作用域(如 singleton 或 prototype)void setScope(@Nullable String scope);// 返回 Bean 当前的作用域@NullableString getScope();// 设置是否延迟初始化(仅适用于单例 Bean)void setLazyInit(boolean lazyInit);// 返回该Bean是否延迟初始化(该Bean实际需要使用时才会被创建)boolean isLazyInit();// 设置此Bean依赖的其他 Bean 名称(Spring容器将确保这些依赖的Bean先被初始化)void setDependsOn(@Nullable String... dependsOn);// 返回此 Bean 依赖的其他 Bean 名称@NullableString[] getDependsOn();// 设置此 Bean 是否可以作为自动装配的候选对象// 即:是否能够被Spring容器在自动装配过程中选中并注入到其他Bean中void setAutowireCandidate(boolean autowireCandidate);// 返回此 Bean 是否可以作为自动装配的候选对象boolean isAutowireCandidate();// 设置此 Bean 是否为主要的自动装配候选对象(在多个候选对象中优先选择primary候选)void setPrimary(boolean primary);// 返回此 Bean 是否为主要的自动装配候选对象boolean isPrimary();// 指定用于创建此 Bean 的工厂 Bean 名称(如果有)void setFactoryBeanName(@Nullable String factoryBeanName);// 返回用于创建此 Bean 的工厂 Bean 名称(如果有)@NullableString getFactoryBeanName();// 指定用于创建此 Bean 的工厂方法名称(如果有)void setFactoryMethodName(@Nullable String factoryMethodName);// 返回用于创建此 Bean 的工厂方法名称(如果有)@NullableString getFactoryMethodName();// 返回此 Bean 的构造函数参数值ConstructorArgumentValues getConstructorArgumentValues();// 检查是否为此 Bean 定义了构造函数参数值default boolean hasConstructorArgumentValues() {return !getConstructorArgumentValues().isEmpty();}// 返回当前 Bean 定义中的属性键值对集合,用于描述 Bean 初始化时需要注入的属性MutablePropertyValues getPropertyValues();// 检查是否为此 Bean 定义了属性值default boolean hasPropertyValues() {return !getPropertyValues().isEmpty();}// 设置初始化方法名称void setInitMethodName(@Nullable String initMethodName);// 返回初始化方法名称@NullableString getInitMethodName();// 设置销毁方法名称void setDestroyMethodName(@Nullable String destroyMethodName);// 返回销毁方法名称@NullableString getDestroyMethodName();// 设置此 Bean 定义的角色,上面常量的三种角色void setRole(int role);// 返回此 Bean 定义的角色int getRole();// 设置此 Bean 定义的人类可读描述void setDescription(@Nullable String description);// 返回此 Bean 定义的人类可读描述@NullableString getDescription();// ==================== 只读属性 ====================// 解析和返回当前 Bean 定义的具体类型(包括泛型和复杂类型)ResolvableType getResolvableType();// 检查此 Bean 是否为单例boolean isSingleton();// 检查此 Bean 是否为原型boolean isPrototype();// 判断一个 Bean 定义是否为抽象定义,用于区分模板和具体实现boolean isAbstract();// 返回 Bean 定义的资源描述(通常是 XML 文件、Java 配置类、注解等)// 通过返回的描述,开发者可以了解这个 Bean 是从哪里加载的,便于定位问题@NullableString getResourceDescription();// 它的作用是在Bean定义发生装饰、代理或重新定义时,提供对原始定义的访问@NullableBeanDefinition getOriginatingBeanDefinition();
}

3、AttributeAccessorSupport(属性访问器支持类)

  AttributeAccessorSupport是Spring中的一个抽象类,用于管理任意键值对属性,提供添加、获取、移除等操作,常用于存储元数据动态属性信息。。

public abstract class AttributeAccessorSupport implements AttributeAccessor, Serializable {// 提供了一个内置的Map(attributes)来存储键值对属性private final Map<String, Object> attributes = new LinkedHashMap<>();// ...省略AttributeAccessor属性设置获取移除等方法的实现
}

4、BeanMetadataAttributeAccessor(Bean元数据属性访问器)

  BeanMetadataAttributeAccessor是Spring框架中一个常用的工具类。它用于存储和管理与Bean元数据相关的附加属性,尤其是在Spring容器中扩展Bean定义时,作为元数据的容器。

@SuppressWarnings("serial")
public class BeanMetadataAttributeAccessor extends AttributeAccessorSupport implements BeanMetadataElement {// 记录元数据元素的来源对象,可以是配置文件路径、注解类等@Nullableprivate Object source;// 设置此元数据元素的配置来源对象public void setSource(@Nullable Object source) {this.source = source;}// 获取此元数据元素的配置来源对象@Override@Nullablepublic Object getSource() {return this.source;}// 将给定的BeanMetadataAttribute添加到此访问器的属性集中public void addMetadataAttribute(BeanMetadataAttribute attribute) {// 将属性存储在父类提供的 attributes Map 中super.setAttribute(attribute.getName(), attribute);}// 在此访问器的属性集中查找给定的BeanMetadataAttribute@Nullablepublic BeanMetadataAttribute getMetadataAttribute(String name) {return (BeanMetadataAttribute) super.getAttribute(name);}// 设置属性,将其包装为BeanMetadataAttribute存储@Overridepublic void setAttribute(String name, @Nullable Object value) {// 将属性值包装为 BeanMetadataAttributesuper.setAttribute(name, new BeanMetadataAttribute(name, value));}// 获取指定名称的属性值@Override@Nullablepublic Object getAttribute(String name) {// 从父类的 attributes Map 获取 BeanMetadataAttributeBeanMetadataAttribute attribute = (BeanMetadataAttribute) super.getAttribute(name);// 返回其值return (attribute != null ? attribute.getValue() : null);}// 移除指定名称的属性并返回其值@Override@Nullablepublic Object removeAttribute(String name) {// 从父类的 attributes Map 移除 BeanMetadataAttributeBeanMetadataAttribute attribute = (BeanMetadataAttribute) super.removeAttribute(name);// 返回其值return (attribute != null ? attribute.getValue() : null);}
}

5、AbstractBeanDefinition(抽象Bean定义)

  AbstractBeanDefinition是Spring中Bean定义抽象基类,提供了描述Bean的属性、依赖关系、作用域和生命周期等核心功能。

public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessorimplements BeanDefinition, Cloneable {// ==================== 核心属性 ====================// Bean的类对象,可以是Class实例或类名字符串@Nullableprivate volatile Object beanClass; // SCOPE_DEFAULT: 默认的Bean作用域名称为 "",等效于单例状态,除非被父Bean定义覆盖@Nullableprivate String scope = SCOPE_DEFAULT; // 标记该Bean是否为抽象Bean,抽象Bean不能被实例化private boolean abstractFlag = false; // 是否延迟初始化,null表示未明确设置@Nullableprivate Boolean lazyInit; // 自动装配模式,默认不自动装配private int autowireMode = AUTOWIRE_NO; // 依赖检查模式,默认无依赖检查private int dependencyCheck = DEPENDENCY_CHECK_NONE; // 该Bean依赖的其他Bean名称@Nullableprivate String[] dependsOn; // 是否为自动装配候选Beanprivate boolean autowireCandidate = true; // 是否为主要的自动装配候选Beanprivate boolean primary = false; // 工厂Bean的名称,如果通过工厂Bean创建@Nullableprivate String factoryBeanName; // 工厂方法的名称,用于通过静态方法或工厂Bean的方法创建实例@Nullableprivate String factoryMethodName; // 构造函数的参数值@Nullableprivate ConstructorArgumentValues constructorArgumentValues; // Bean的属性值@Nullableprivate MutablePropertyValues propertyValues; // 初始化方法名称,用于在Bean实例化后调用@Nullableprivate String initMethodName; // 销毁方法名称,用于在Bean销毁前调用@Nullableprivate String destroyMethodName; // Bean的角色,默认是应用角色private int role = BeanDefinition.ROLE_APPLICATION; // Bean的描述信息@Nullableprivate String description; // 描述该Bean定义来源的资源,例如XML配置文件的位置@Nullableprivate Resource resource; // ==================== 核心方法 ====================// 都是类似的getset方法@Overridepublic void setBeanClassName(@Nullable String beanClassName) {this.beanClass = beanClassName;}@Override@Nullablepublic String getBeanClassName() {Object beanClassObject = this.beanClass;if (beanClassObject instanceof Class) {return ((Class<?>) beanClassObject).getName();}else {return (String) beanClassObject;}}// 验证 Bean 定义是否有效,例如检查必须的属性是否已设置public void validate() throws BeanDefinitionValidationException {...}// 克隆当前 Bean 定义,用于 Bean 配置的复制public abstract AbstractBeanDefinition cloneBeanDefinition();
}

6、GenericBeanDefinition(通用Bean定义)

  GenericBeanDefinition用于定义普通的Bean配置,适用于没有继承关系的独立Bean(虽然可以指定父 Bean,但通常不表示父子关系),支持配置构造方法、作用域、初始化方法等属性。

@SuppressWarnings("serial")
public class GenericBeanDefinition extends AbstractBeanDefinition {@Nullableprivate String parentName; // 父类名称// 创建一个新的GenericBeanDefinition// 可通过其bean属性和配置方法进行配置public GenericBeanDefinition() {super();}// 创建一个新的GenericBeanDefinition,作为给定bean定义的深拷贝public GenericBeanDefinition(BeanDefinition original) {super(original);}// 设置父类名称@Overridepublic void setParentName(@Nullable String parentName) {this.parentName = parentName; }// 获取父类名称@Override@Nullablepublic String getParentName() {return this.parentName; }// 克隆 bean 定义@Overridepublic AbstractBeanDefinition cloneBeanDefinition() {return new GenericBeanDefinition(this); }// ... 省略重写 equal 和 toString方法
}

7、ChildBeanDefinition(子Bean定义)

  ChildBeanDefinition专门用于表示子Bean的定义,允许子bean继承父bean的属性和方法,并可以进行扩展或覆盖。

@SuppressWarnings("serial")
public class ChildBeanDefinition extends AbstractBeanDefinition {@Nullableprivate String parentName; // 父类名称// 为给定的父类创建一个新的 ChildBeanDefinition,提供构造函数参数和属性值public ChildBeanDefinition(String parentName, Class<?> beanClass, ConstructorArgumentValues cargs, MutablePropertyValues pvs) {super(cargs, pvs);this.parentName = parentName; // 设置父类名称setBeanClass(beanClass); // 设置 bean 类}// ... 省略类似构造方法// 设置父类名称@Overridepublic void setParentName(@Nullable String parentName) {this.parentName = parentName; }// 获取父类名称@Override@Nullablepublic String getParentName() {return this.parentName; }// 校验父类必须存在,否则报错@Overridepublic void validate() throws BeanDefinitionValidationException {super.validate();// 校验父类名称是否为空if (this.parentName == null) {throw new BeanDefinitionValidationException("'parentName' must be set in ChildBeanDefinition");}}// 克隆当前的 ChildBeanDefinition@Overridepublic AbstractBeanDefinition cloneBeanDefinition() {return new ChildBeanDefinition(this); }// ... 省略重写 equal 和 toString方法
}

8、RootBeanDefinition(根Bean定义)

  RootBeanDefinition用于定义容器中的根级Bean配置,不能继承父Bean,是独立的顶级Bean定义类。

@SuppressWarnings("serial")
public class RootBeanDefinition extends AbstractBeanDefinition {// 此属性用于保存一个被该bean定义装饰增强的Bean定义@Nullableprivate BeanDefinitionHolder decoratedDefinition; // Bean定义的注解信息@Nullableprivate AnnotatedElement qualifiedElement; ...// 目标类型,表示包含泛型的类型@Nullablevolatile ResolvableType targetType; // 缓存解析后的目标类型@Nullablevolatile Class<?> resolvedTargetType;// 缓存已解析的销毁方法的名称@Nullablevolatile String resolvedDestroyMethodName;// 缓存解析后的构造函数或工厂方法@NullableExecutable resolvedConstructorOrFactoryMethod;// 缓存完全解析的构造函数参数@NullableObject[] resolvedConstructorArguments;...// 创建一个新的 RootBeanDefinition,通过其 bean 属性和配置方法进行配置public RootBeanDefinition() {super();}// 创建一个新的RootBeanDefinition用于带有作用域的bean,通过给定的supplier构造每个实例public <T> RootBeanDefinition(@Nullable Class<T> beanClass, String scope, @Nullable Supplier<T> instanceSupplier) {super();setBeanClass(beanClass);setScope(scope);setInstanceSupplier(instanceSupplier);}// ...省略其他构造方法// 省略了一些其他注释,以节省篇幅// 克隆 RootBeanDefinition@Overridepublic RootBeanDefinition cloneBeanDefinition() {return new RootBeanDefinition(this); }// ... 省略重写 equal 和 toString方法
}

9、AnnotatedBeanDefinition(注解Bean定义)

  AnnotatedBeanDefinition是一个扩展了BeanDefinition的接口,用于访问与Bean类相关的注解元数据,如类级注解和工厂方法的元数据。

public interface AnnotatedBeanDefinition extends BeanDefinition {// 获取当前Bean类的注解信息,允许在不加载类的情况下访问类级注解元数据AnnotationMetadata getMetadata();// 返回当前 Bean 定义的工厂方法的元数据,如果没有工厂方法则返回 null@NullableMethodMetadata getFactoryMethodMetadata();
}

10、ScannedGenericBeanDefinition(扫描通用Bean定义)

  ScannedGenericBeanDefinition是Spring中用于表示通过类路径扫描(如 @ComponentScan)发现的Bean的定义类,包含了扫描到的Bean类的元数据和配置信息。

// 该类不会在早期加载Bean的Class,而是从 ".class" 文件本身解析所有相关的元数据,
// 使用 ASM ClassReader 进行解析
@SuppressWarnings("serial")
public class ScannedGenericBeanDefinition extends GenericBeanDefinition implements AnnotatedBeanDefinition {// 存储扫描到的 Bean 类的注解元数据private final AnnotationMetadata metadata;// 为给定的 MetadataReader 描述的类创建一个新的 ScannedGenericBeanDefinition。public ScannedGenericBeanDefinition(MetadataReader metadataReader) {// 校验 metadataReader 不为 nullAssert.notNull(metadataReader, "MetadataReader must not be null");// 从 MetadataReader 获取注解元数据this.metadata = metadataReader.getAnnotationMetadata();// 设置 Bean 类的名称setBeanClassName(this.metadata.getClassName());// 设置扫描到的资源setResource(metadataReader.getResource());}@Override// 返回 Bean 类的注解元数据public final AnnotationMetadata getMetadata() {return this.metadata;}@Override@Nullable// 返回工厂方法的元数据(这里为 null,表示没有工厂方法)public MethodMetadata getFactoryMethodMetadata() {return null;}
}

总结

  本文详细介绍了Spring框架中Bean的定义及其管理机制,重点阐述了BeanDefinition接口及其各个实现类的功能,包括属性访问Bean元数据管理父子Bean关系作用域依赖注入等方面的实现,旨在帮助开发者理解Spring容器如何通过这些机制来管理和配置Bean的生命周期。

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

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

相关文章

Vue 3 30天精进之旅:Day 13 - 路由守卫

在构建单页面应用时&#xff0c;路由守卫是一个非常重要的概念。它允许我们在路由进入或离开时执行一些操作&#xff0c;比如验证用户权限、处理数据加载、执行导航确认等。Vue Router提供了多种类型的路由守卫&#xff0c;使我们能够灵活地控制路由的行为。在今天的学习中&…

【TypeScript】基础:数据类型

文章目录 TypeScript一、简介二、类型声明三、数据类型anyunknownnervervoidobjecttupleenumType一些特殊情况 TypeScript 是JavaScript的超集&#xff0c;代码量比JavaScript复杂、繁多&#xff1b;但是结构更清晰 一、简介 为什么需要TypeScript&#xff1f; JavaScript的…

C++模板编程——可变参函数模板

目录 1. 可变参函数模板基本介绍 2. 参数包展开——通过递归函数 3. 参数包展开——通过编译期间if语句(constexpr if) 4. 重载 5. 后记 进来看的小伙伴们应该对C中的模板有了一定了解&#xff0c;下面给大家介绍一下可变参函数模板。过于基础的概念将不仔细介绍。 1. 可变…

ChatGPT-4o和ChatGPT-4o mini的差异点

在人工智能领域&#xff0c;OpenAI再次引领创新潮流&#xff0c;近日正式发布了其最新模型——ChatGPT-4o及其经济实惠的小型版本ChatGPT-4o Mini。这两款模型虽同属于ChatGPT系列&#xff0c;但在性能、应用场景及成本上展现出显著的差异。本文将通过图文并茂的方式&#xff0…

三数之和(15)

15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 可以一起总结的题目&#xff1a;三角形的最大周长&#xff08;976&#xff09;-CSDN博客 解法&#xff1a; class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {vector…

2025最新源支付V7全套开源版+Mac云端+五合一云端

2025最新源支付V7全套开源版Mac云端五合一云端 官方1999元&#xff0c; 最新非网上那种功能不全带BUG开源版&#xff0c;可以自己增加授权或二开 拥有卓越的性能和丰富的功能。它采用全新轻量化的界面UI&#xff0c;让您能更方便快捷地解决知识付费和运营赞助的难题 它基于…

9 点结构模块(point.rs)

一、point.rs源码 use super::UnknownUnit; use crate::approxeq::ApproxEq; use crate::approxord::{max, min}; use crate::length::Length; use crate::num::*; use crate::scale::Scale; use crate::size::{Size2D, Size3D}; use crate::vector::{vec2, vec3, Vector2D, V…

数据分析系列--[12] RapidMiner辨别分析(含数据集)

一、数据准备 二、导入数据 三、数据预处理 四、建模辨别分析 五、导入测试集进行辨别分析 一、数据准备 点击下载数据集 二、导入数据 三、数据预处理 四、建模辨别分析 五、导入测试集进行辨别分析 Ending, congratulations, youre done.

Day33【AI思考】-函数求导过程 的优质工具和网站

文章目录 **函数求导过程** 的优质工具和网站**一、动态图形工具**1. **Desmos&#xff08;网页端&#xff09;**2. **GeoGebra&#xff08;全平台&#xff09;** **二、分步推导工具**3. **Wolfram Alpha&#xff08;网页/App&#xff09;**4. **Symbolab&#xff08;网页/App…

个人笔记(很没营养,纯备忘录)

1.输入电阻和输出电阻指在一个可划分为3部分的电路中&#xff0c;中间部分电路相当于前面电路的负载有输入端电阻&#xff0c;称输入电阻&#xff0c;相对于后面部分等效为电源有输出端内阻&#xff0c;称输出电阻 理所当然的希望输出电阻对负载影响小&#xff0c;输入电阻能完…

当卷积神经网络遇上AI编译器:TVM自动调优深度解析

从铜线到指令&#xff1a;硬件如何"消化"卷积 在深度学习的世界里&#xff0c;卷积层就像人体中的毛细血管——数量庞大且至关重要。但鲜有人知&#xff0c;一个简单的3x3卷积在CPU上的执行路径&#xff0c;堪比北京地铁线路图般复杂。 卷积的数学本质 对于输入张…

51单片机 02 独立按键

一、独立按键控制LED亮灭 轻触按键&#xff1a;相当于是一种电子开关&#xff0c;按下时开关接通&#xff0c;松开时开关断开&#xff0c;实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。 #include <STC89C5xRC.H> void main() { // P20xFE;while(1){…

系统URL整合系列视频二(界面原型)

视频 系统URL整合系列视频二&#xff08;界面原型&#xff09; 视频介绍 &#xff08;全国&#xff09;大型分布式系统Web资源URL整合需求界面原型讲解。当今社会各行各业对软件系统的web资源访问权限控制越来越严格&#xff0c;控制粒度也越来越细。安全级别提高的同时也增加…

vscode命令面板输入 CMake:build不执行提示输入

CMake&#xff1a;build或rebuild不编译了&#xff0c;弹出:> [Add a new preset] , 提示输入发现settings.jsons设置有问题 { "workbench.colorTheme": "Default Light", "cmake.pinnedCommands": [ "workbench.action.tasks.configu…

wax到底是什么意思

在很久很久以前&#xff0c;人类还没有诞生文字之前&#xff0c;人类就产生了语言&#xff1b;在诞生文字之前&#xff0c;人类就已经使用了语言很久很久。 没有文字之前&#xff0c;人们的语言其实是相对比较简单的&#xff0c;因为人类的生产和生活水平非常低下&#xff0c;…

SSRF 漏洞利用 Redis 实战全解析:原理、攻击与防范

目录 前言 SSRF 漏洞深度剖析 Redis&#xff1a;强大的内存数据库 Redis 产生漏洞的原因 SSRF 漏洞利用 Redis 实战步骤 准备环境 下载安装 Redis 配置漏洞环境 启动 Redis 攻击机远程连接 Redis 利用 Redis 写 Webshell 防范措施 前言 在网络安全领域&#xff0…

【周易哲学】生辰八字入门讲解(八)

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本文讲解【周易哲学】生辰八字入门讲解&#xff0c;期待与你一同探索、学习、进步&#xff0c;一起卷起来叭&#xff01; 目录 一、六亲女命六亲星六亲宫位相互关系 男命六亲星…

CAN总线数据采集与分析

CAN总线数据采集与分析 目录 CAN总线数据采集与分析1. 引言2. 数据采集2.1 数据采集简介2.2 数据采集实现3. 数据分析3.1 数据分析简介3.2 数据分析实现4. 数据可视化4.1 数据可视化简介4.2 数据可视化实现5. 案例说明5.1 案例1:数据采集实现5.2 案例2:数据分析实现5.3 案例3…

【c++】类与对象详解

目录 面向过程思想和面向对象思想类的定义引入类的关键字类定义的两种方式类的访问限定符类的作用域类大小的计算封装 this指针类的6个默认成员函数构造函数初步理解构造函数深入理解构造函数初始化列表单参数构造函数引发的隐式类型转换 析构函数拷贝构造函数赋值运算符重载运…

大模型训练(5):Zero Redundancy Optimizer(ZeRO零冗余优化器)

0 英文缩写 Large Language Model&#xff08;LLM&#xff09;大型语言模型Data Parallelism&#xff08;DP&#xff09;数据并行Distributed Data Parallelism&#xff08;DDP&#xff09;分布式数据并行Zero Redundancy Optimizer&#xff08;ZeRO&#xff09;零冗余优化器 …