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

【Spring】手动实现Spring底层机制-问题的引出

🎄欢迎来到@边境矢梦°的csdn博文🎄

🎄本文主要梳理手动实现Spring底层机制-问题的引出 🎄
🌈我是边境矢梦°,一个正在为秋招和算法竞赛做准备的学生🌈
🎆喜欢的朋友可以关注一下🫰🫰🫰,下次更新不迷路🎆

Ps: 月亮越亮说明知识点越重要 (重要性或者难度越大)🌑🌒🌓🌔🌕   

目录

🌸底层难点问题的引出🚀

🌈问题的概念解释

🎈BeanDefinition

🥝类加载器和类路径classPath


🌸底层难点问题的引出🚀

1. 底层如何实现依赖

2. 底层如何实现singleton (单例池)

3. 底层如何实现prototype (多例)

4. 底层如何实现IOC容器创建和初始化(之前用反射实现过, 较浅, 继续深入)

5. 底层如何实现getBean()

6. 底层如何实现BeanPostProcessor

7. Spring底层如何实现Bean后置处理器机制

8. 原生Spring底层如何实现AOP


🌈问题的概念解释

  1. spring底层实现依赖注入(Dependency Injection,DI)的主要机制是通过反射和配置元数据来实现的。依赖注入是Spring框架的核心功能之一,它允许开发者将一个Bean所依赖的其他Bean(依赖项)动态地注入到该Bean中而不需要硬编码这些依赖项。以下是Spring底层如何实现依赖注入的关键步骤:
    1. Bean Definition 注册:在Spring容器初始化的过程中,所有的Bean定义(Bean的类名、属性、依赖等信息)都会被注册到容器的BeanFactory中。这些Bean定义可以通过XML配置文件、Java注解或Java配置类来定义。

    2. 依赖关系定义:在Bean定义中,可以使用不同的方式来定义Bean之间的依赖关系。最常见的方式是使用构造函数注入(Constructor Injection)或Setter方法注入(Setter Injection)。依赖关系可以通过依赖注入的标签或注解来表示。

    3. 依赖解析和注入:当容器需要创建一个Bean实例时,它会检查该Bean的定义,以确定它所依赖的其他Bean。容器会自动解析这些依赖关系,并尝试实例化或获取依赖的Bean。

    4. 依赖注入:容器会将依赖项注入到目标Bean中。这可以通过调用目标Bean的构造函数、Setter方法、字段注入等方式来实现,具体取决于依赖关系的定义方式。

    5. 依赖的生命周期管理:Spring容器负责管理依赖项的生命周期。通常,依赖项的生命周期与目标Bean的生命周期相匹配。如果依赖项是Singleton作用域的Bean,那么它只会被创建一次并在容器启动时初始化;如果是Prototype作用域的Bean,每次注入都会创建一个新的实例。

    6. 可选的AOP代理(可选):如果Bean被配置为使用AOP(面向切面编程),容器可能会为该Bean创建一个代理对象,并将代理对象注入到依赖中,以便在方法调用时应用切面逻辑。

  2. Spring框架实现Singleton模式的核心机制是通过控制Bean的创建和管理来确保在容器中只有一个实例的存在Spring框架使用了一个叫做BeanFactory的容器来管理对象,其中包括了Singleton对象。下面是Spring如何实现Singleton模式的简要说明:

    • 容器的生命周期管理:Spring容器本身也是一个Singleton对象,它负责管理所有的Bean实例。容器的生命周期通常与应用程序的生命周期相匹配。

    • 同步管理:Spring通过使用同步机制来确保在多线程环境下Singleton对象的安全创建和访问。这样可以避免并发问题。

    • 懒加载:虽然Spring默认在容器启动时就创建Singleton对象,但你也可以将Bean的懒加载标志设置为true,以延迟对象的创建直到第一次请求。这样可以节省资源,只有在需要时才会创建Singleton对象。

    • Bean的缓存:Spring使用一个叫做BeanFactory的容器来管理Bean的实例。在BeanFactory内部,Singleton对象会被缓存起来,以确保每次请求同一个Bean时,都会返回相同的实例。

    • Bean的创建和初始化:Spring容器会根据Bean定义创建实例对象。对于Singleton作用域的Bean,容器只会创建一个实例并在容器启动时进行初始化。这个实例会被缓存起来以供后续使用

    • Bean Definition:在Spring配置文件(如XML文件)或者Java配置类中,你需要定义Bean。这个Bean定义包括了Bean的类名、属性、依赖等信息。当Spring容器初始化时,它会解析这些Bean定义。

  3. Spring框架底层实现Prototype作用域的Bean时,采用了一种不同的机制,与Singleton不同。在Prototype作用域下,Spring容器不会维护一个单独的缓存,每次请求Prototype类型的Bean都会创建一个新的实例。下面是Spring如何实现Prototype模式的简要说明:

    • Bean Definition:与Singleton作用域一样,你需要在Spring配置文件或Java配置类中定义Bean。Bean定义包括了Bean的类名、属性、依赖等信息。

    • Bean的创建和初始化:当请求一个Prototype作用域的Bean时,Spring容器会根据Bean定义创建一个新的实例对象,并在需要的情况下进行初始化。每次请求都会触发新的对象创建。

    • 不进行缓存:与Singleton不同,Spring容器不会维护Prototype对象的缓存。每次请求Prototype Bean时,都会创建一个全新的实例。

    • 不进行生命周期管理Spring容器不会管理Prototype对象的生命周期。因此,容器不会在Bean的销毁阶段执行任何清理操作。对象的销毁由客户端代码负责。

  4. 底层实现IOC容器的创建和初始化通常包括以下几个步骤

    • 创建容器对象:实例化一个容器对象,可以是自定义的容器类或者使用现有的容器框
    • 扫描组件:容器会扫描指定的包或者目录,查找符合条件的组件(类)。

    • 注册组件:将扫描到的组件注册到容器中,可以使用反射机制创建实例
    • 解析依赖:对于需要注入的依赖,容器会解析其依赖关系并在需要时注入对应的实例。
    • 初始化组件:对于注册到容器中的组件,容器会调用其相应的初始化方法,可以是在注解上指定的初始化方法或者实现了特定接口的回调方法。
    • 提供访问接口:容器提供相应的接口,如getBean()方法来获取容器中的组件实例。
  5. Spring框架中的getBean()方法是用来从Spring容器中获取Bean实例的主要方法之一。下面是Spring框架底层如何实现getBean()方法的简要说明:

    • Bean Definition的注册:在Spring容器启动过程中,所有的Bean定义(包括Bean的名称、类名、属性等信息)都会被注册到容器的BeanFactory中。这个注册是在容器初始化阶段进行的,通常是通过XML配置文件或Java配置类来完成的。

    • Bean实例化:当调用getBean()方法时,容器首先会根据传入的Bean名称或类型信息,查找相应的Bean定义。

    • Bean的创建和初始化:如果找到了相应的Bean定义,容器会根据定义中的信息创建Bean的实例。这通常涉及到Java反射机制,它会调用Bean的构造函数来创建一个新的对象。然后,容器会应用依赖注入和初始化方法等来配置和初始化这个Bean实例。

    • Bean的缓存:Spring容器通常会维护一个Bean实例的缓存,以确保同一个Bean不会被多次创建。这样,如果之前已经创建了一个Bean实例,下次调用getBean()方法时,容器会直接返回缓存中的实例,而不会再次创建。

    • 返回Bean实例:最终,getBean()方法会返回创建或从缓存中获取的Bean实例,供调用者使用。

    • AOP代理(可选):如果该Bean被配置为使用AOP(面向切面编程),容器可能会为该Bean创建一个代理对象,以便在方法调用时应用切面逻辑。

  6. BeanPostProcessor是Spring框架提供的一个扩展点它允许开发者在Bean初始化的不同阶段插入自定义的逻辑。Spring底层通过一系列的回调方法来实现BeanPostProcessor接口,以便在Bean的初始化前后执行额外的处理。以下是Spring底层如何实现BeanPostProcessor的简要说明:

    • 接口定义BeanPostProcessor是一个接口,其中定义了两个回调方法:

      • postProcessBeforeInitialization(Object bean, String beanName): 在Bean的初始化前执行。在这个方法中,可以对Bean进行修改或者执行一些额外的初始化逻辑。

      • postProcessAfterInitialization(Object bean, String beanName): 在Bean的初始化后执行。在这个方法中,同样可以对Bean进行修改或者执行其他的操作。

    • 注册BeanPostProcessor开发者可以自定义一个或多个实现了BeanPostProcessor接口的类,然后将它们注册到Spring容器中。这可以通过XML配置文件、Java配置类或者注解方式来完成。一旦注册,这些BeanPostProcessor将会被Spring容器调用。

    • 回调方法执行:当Spring容器创建和初始化Bean时,它会在适当的时机调用已注册的BeanPostProcessor的回调方法。具体的调用时机如下:

      • 在Bean的实例化后,但在初始化方法调用之前,会调用postProcessBeforeInitialization方法。

      • 在Bean的初始化方法调用后,会调用postProcessAfterInitialization方法

    • 自定义逻辑:开发者可以在这两个回调方法中编写自己的逻辑,例如,可以在postProcessBeforeInitialization方法中进行属性设置或校验,也可以在postProcessAfterInitialization方法中执行一些清理工作。

      • 在Java中,回调方法(Callback Methods)是一种常见的编程模式,它允许一个对象(通常是一个类)将某个方法的引用传递给另一个对象,以便在特定事件发生时调用该方法。回调方法通常用于事件处理、异步编程和自定义扩展点等情况。

  7. Spring底层实现Bean后置处理器(BeanPostProcessor)机制主要依赖于接口和容器生命周期回调方法。Bean后置处理器允许在容器实例化、配置和初始化Bean之前和之后执行自定义逻辑,例如修改Bean的属性,执行代理等操作。以下是Spring底层如何实现Bean后置处理器机制的简要说明:

    • 接口定义BeanPostProcessor是Spring框架提供的接口,其中包含了两个回调方法:

      • postProcessBeforeInitialization(Object bean, String beanName): 在Bean的初始化之前调用。开发者可以在此方法中修改Bean实例的属性或执行自定义初始化逻辑。

      • postProcessAfterInitialization(Object bean, String beanName): 在Bean的初始化之后调用。开发者可以在此方法中进行清理工作或者对Bean进行后处理。

    • 注册BeanPostProcessor:开发者可以创建自定义的实现了BeanPostProcessor接口的类,并将这些后置处理器注册到Spring容器中。这通常可以通过XML配置文件、Java配置类或注解方式来完成。

    • 容器生命周期回调方法:Spring容器在不同的生命周期阶段会自动调用已注册的Bean后置处理器的回调方法。以下是典型的生命周期回调方法执行顺序:

      • 创建Bean实例。

      • 在调用Bean的构造函数之后,但在初始化方法(如果有的话)之前,调用postProcessBeforeInitialization方法。

      • 在调用Bean的初始化方法之后,调用postProcessAfterInitialization方法。

    • 自定义逻辑:开发者可以在postProcessBeforeInitializationpostProcessAfterInitialization方法中编写自己的逻辑,以根据需要修改、增强或清理Bean。

    • AOP代理(可选):在postProcessBeforeInitialization方法中,开发者可以选择创建AOP代理以包装Bean。这可以用于实现AOP切面。

  8. 原生Spring底层实现AOP(面向切面编程)主要依赖于动态代理和反射机制。Spring使用AOP实现了横切关注点(cross-cutting concerns)的模块化,允许在不改变业务逻辑的情况下,将横切关注点(如日志、事务、安全性检查等)应用于应用程序的各个部分。以下是Spring底层如何实现AOP的简要说明:

    • AOP核心概念

      • 切面(Aspect):切面是包含横切关注点的模块。它定义了何时以及在何地应用横切关注点。

      • 连接点(Join Point):连接点是在应用程序中可能被拦截的点,例如方法调用、异常抛出等。

      • 通知(Advice):通知是在连接点上执行的动作,包括"前置通知"、"后置通知"、"环绕通知"、"抛出异常通知"和"最终通知"。

      • 切点(Pointcut):切点是一组连接点的集合,它定义了哪些连接点应该被拦截。

    • AOP代理生成:Spring底层使用JDK动态代理和CGLIB两种方式生成AOP代理。具体的代理方式取决于目标Bean是否实现了接口。如果目标Bean实现了接口,Spring将使用JDK动态代理,否则将使用CGLIB代理。代理对象负责调用切面的通知方法。

    • 通知执行:当目标方法被调用时,AOP代理会根据切面定义的通知类型,在连接点上执行相应的通知。例如,前置通知会在方法执行前执行,后置通知会在方法执行后执行。

    • 切点匹配:Spring使用切点表达式(Pointcut Expressions)来确定哪些连接点应该被拦截。切点表达式可以根据方法名、包名、类名等条件来匹配连接点。

    • 通知执行顺序:通知可以按照特定的顺序来执行,这个顺序可以在切面配置中定义。通常情况下,通知的执行顺序包括前置通知、环绕通知、后置通知、抛出异常通知和最终通知。

    • XML配置或注解:Spring提供了两种方式配置AOP,一种是通过XML配置文件定义切面、切点和通知,另一种是使用注解来标注切面、切点和通知。


🎈BeanDefinition

在Spring框架中,BeanDefinition是Spring容器中的一个抽象概念,当Spring容器初始化时,它会解析配置文件或者注解,并生成相应的BeanDefinition对象。BeanDefinition是用于描述和定义一个Bean的元数据(数据的数据, 类属性的属性)信息的对象它包含了一个Bean的类名、作用域、属性值、构造函数参数、初始化方法、销毁方法等相关信息。它的主要作用是为容器提供创建和管理Bean实例的必要信息

通过BeanDefinition,Spring容器了解了如何实例化、配置和管理一个Bean对象。它允许我们对Bean进行灵活的配置和定制化可以设置不同的作用域(如单例、原型等),设置属性值,指定构造函数参数等。

BeanDefinition可以通过不同的方式进行定义,包括XML配置文件、注解和Java代码等。无论使用哪种方式,最终都会被解析为BeanDefinition对象,然后由容器根据该对象来创建和管理相应的Bean实例。

Spring的BeanDefinition提供了一个统一的模型来管理和控制Bean的生命周期和行为它使得Spring容器能够根据配置信息动态地创建和管理Bean对象,同时也提供了强大的扩展和定制化能力。

🥝类加载器和类路径classPath

java的类加载器3种

  • Bootstrap类加载器--—----—--—---对应路径jre/lib
  • Ext类加载器---------—----------对应路径jre/lib/ext
  • App类加载器--—-------------—--对应路径classpath

App类加载器常用, classpath 类路径,就是 java.exe 执行时,指定的路径,比如

"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2023.1.2\lib\idea_rt.jar=55328:C:\Program Files\JetBrains\IntelliJ IDEA 2023.1.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;D:\NewExecllction\exicesecode\lxb-spring\target\classes;C:\Users\Administrator\.m2\repository\org\springframework\spring-context\5.3.8\spring-context-5.3.8.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-aop\5.3.8\spring-aop-5.3.8.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-beans\5.3.8\spring-beans-5.3.8.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-core\5.3.8\spring-core-5.3.8.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-jcl\5.3.8\spring-jcl-5.3.8.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-expression\5.3.8\spring-expression-5.3.8.jar;C:\Users\Administrator\.m2\repository\org\springframework\spring-aspects\5.3.8\spring-aspects-5.3.8.jar;C:\Users\Administrator\.m2\repository\org\aspectj\aspectjweaver\1.9.6\aspectjweaver-1.9.6.jar" com.lxb.spring.AppMain

🌰ClassLoader的getResource方法

相关文章:

【Spring】手动实现Spring底层机制-问题的引出

🎄欢迎来到边境矢梦的csdn博文🎄 🎄本文主要梳理手动实现Spring底层机制-问题的引出 🎄 🌈我是边境矢梦,一个正在为秋招和算法竞赛做准备的学生🌈 🎆喜欢的朋友可以关注一下&#x1…...

Java - List 去重,获取唯一值,分组列出所属对应集合

问题&#xff1a;List 去重&#xff0c;获取唯一值&#xff0c;分组列出所属对应集合 方案一&#xff1a;这个不需要额外的内存占用 //遍历后判断赋给另一个list集合public static void main(String[] args){List<String> list new ArrayList<String>(); lis…...

离散高斯抽样(Discrete Gaussian Sampling)

离散高斯抽样 离散高斯抽样&#xff08;Discrete Gaussian Sampling&#xff09;是一种常见于密码学和数学领域的随机采样方法。它通常用于构建基于格&#xff08;lattice&#xff09;的密码学方案&#xff0c;如基于格的加密和数字签名。Discrete Gaussian Sampling 的主要目…...

Elasticsearch:什么是生成式人工智能?

生成式人工智能定义 给学生的解释&#xff08;基本&#xff09;&#xff1a; 生成式人工智能是一种可以创造新的原创内容的技术&#xff0c;例如艺术、音乐、软件代码和写作。 当用户输入提示时&#xff0c;人工智能会根据从互联网上现有示例中学到的知识生成响应&#xff0c;…...

责任链模式让我的代码精简10倍?

目录 什么是责任链使用场景结语 前言最近&#xff0c;我让团队内一位成员写了一个导入功能。他使用了责任链模式&#xff0c;代码堆的非常多&#xff0c;bug 也多&#xff0c;没有达到我预期的效果。实际上&#xff0c;针对导入功能&#xff0c;我认为模版方法更合适&#xff…...

Draw软件安装下载

Draw软件安装下载 1.软件简介2.软件下载3.安装方法 1.软件简介 Draw软件&#xff0c;全名为LibreOffice Draw&#xff0c;是一款免费、开源的2D矢量绘图软件&#xff0c;属于LibreOffice办公套件的一部分。它可以用来创建各种类型的图形&#xff0c;包括流程图、组织结构图、平…...

uniapp代码混淆ios上架43问题

参考文章&#xff1a;uniapp打包ios apk&#xff0c;混淆代码_uniapp 混淆_酸奶自由竟然重名了的博客-CSDN博客 uniapp打包ios&#xff0c;上传到ios应用市场时&#xff0c;会因为 4.3(代码重复率过高) 无法通过审核&#xff0c;此时可通过混淆代码来通过审核 1. 项目终端 安…...

Linux目录遍历函数

1.打开一个目录 #include <sys/types.h> #include <dirent.h> DIR *opendir(const char *name); 参数&#xff1a; -name:需要打开的目录的名称 返回值&#xff1a; DIR * 类型&#xff0c;理解为目录流 错误返回NULL 2.读取目录中的数据 #include <dirent.h…...

数据库-理论基础

目录 1.什么是数据库&#xff1f; 2.数据库与文件系统的区别&#xff1f; 3.常见的数据库由那些&#xff1f; 4.关系型数据库(MySQL&#xff09;的特征及组成结构介绍 1.什么是数据库&#xff1f; 数据&#xff1a;描述事物的符号记录&#xff0c;可以是数字&#xff0c;文…...

【已解决】src/spt_python.h:14:20: 致命错误:Python.h:没有那个文件或目录

src/spt_python.h:14:20: 致命错误&#xff1a;Python.h&#xff1a;没有那个文件或目录 问题 其中重点的报错信息 src/spt_python.h:14:20: fatal error: Python.h: No such file or directory 思路 sudo yum install python-devel然后重新安装需要的依赖。 解决 成功。…...

基于Face++网络爬虫+人脸融合算法智能发型推荐程序——深度学习算法应用(含Python及打包exe工程源码)+爬虫数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境Pycharm 环境 模块实现1. Face.APl调用1&#xff09;Face.APl介绍2&#xff09;调用API 2. 数据爬取1&#xff09;网络数据爬取步骤2&#xff09;爬虫实现 3. 模型构建4. 用户界面设计1&#xff09;需要调用的库文…...

Jetson nano嵌入式平台配置ip记录

背景 Jetson nano平台使用千兆网和PC连接时没有ip地址&#xff0c;在ubuntu的终端输入ifconfig显示eh0未设置ip&#xff0c;需要先在nano平台上配置ip地址&#xff0c;然后PC通过千兆网远程控制该平台。 配置ip 使用终端进入到network文件夹中&#xff0c; cd /etc/network…...

前端中的跨域请求及其解决方案

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 跨域&#xff08;Cross-Origin&#xff09;⭐CORS&#xff08;跨域资源共享&#xff09;⭐JSONP&#xff08;JSON with Padding&#xff09;⭐代理服务器⭐ WebSocket⭐服务器设置响应头⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a…...

SpringBoot2.0(mybatis-plus初始使用)

目录 一&#xff0c;介绍二&#xff0c;SpringBoot2.x整合MybatisPlus Lombok2.1&#xff0c;添加依赖 pom2.2&#xff0c;配置数据库信息 application.properties2.3&#xff0c;工程结构初始化 三&#xff0c;创建接口返回统一对象四&#xff0c;创建bean五&#xff0c;创建…...

游戏视频录制软件对比,哪款最适合你的需求?

随着电子竞技和游戏直播行业的迅速崛起&#xff0c;越来越多的玩家渴望记录并分享自己在游戏中的精彩瞬间。游戏视频录制软件正是满足这一需求的关键工具。本文将针对三款优秀的游戏视频录制软件进行对比分析&#xff0c;以便为读者提供选购建议。 游戏视频录制软件1&#xff1…...

耐蚀合金连续油管最新版 学习记录

声明 本文是学习GB-T 42858-2023 耐蚀合金连续油管. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了耐蚀合金连续油管的订货、材料、制造、检验试验、标记等。 本文件适用于油气井用耐蚀合金连续油管(以下简称"油管")…...

LoGoNet:基于局部到全局跨模态融合的精确 3D 目标检测

论文地址&#xff1a;https://arxiv.org/abs/2303.03595 论文代码&#xff1a;https://github.com/sankin97/LoGoNet 论文背景 激光雷达传感器点云通常是稀疏的&#xff0c;无法提供足够的上下文来区分远处的区域&#xff0c;从而造成性能次优。 激光雷达-摄像机融合方法在三…...

Python 多线程、线程池、进程池

线程间的通讯机制 消息队列 event 事件对象 当线程创建完成之后&#xff0c;并不会马上执行线程&#xff0c;而是等待某一事件发生&#xff0c;线程才会启动 import threading# # 创建 event 对象 # event threading.Event() # # 重置代码中的 event 对象&#xff0c;使得所…...

深入浅出了解华为端到端交付流程的概念和5个关键点

如果您或您所在的组织在学习和研究华为&#xff0c;那么对“端到端”这个词语就一点都不陌生。 今天华研荟带着您了解华为端到端的交付流程的思想和一些做法&#xff0c;如果了解了这个&#xff0c;那么对于华为在其他领域提出的端到端要求或做法就一通百通了。 一、什么是端…...

[Linux]进程信号

[Linux]进程信号 文章目录 [Linux]进程信号进程信号的定义信号的特点信号的生命过程发送信号的原理进程处理信号的方式分类使用指令查看Linux系统定义的信号信号产生使用终端按键产生信号使用指令向进程发送信号调用系统调用向进程发送信号由软件条件产生信号硬件异常产生信号 …...

PostgreSQL 数据类型

文章目录 PostgreSQL数据类型说明PostgreSQL数据类型使用单引号和双引号数据类型转换布尔类型数值类型整型浮点型序列数值的常见操作 字符串类型日期类型枚举类型IP类型JSON&JSONB类型复合类型数组类型 PostgreSQL数据类型说明 PGSQL支持的类型特别丰富&#xff0c;大多数…...

智慧港口4G+UWB+GPS/北斗RTK人员定位系统解决方案

港口人员定位系统能够帮助企业实现对港口作业人员的全面监控和管理&#xff0c;不仅可以保障人员的人身安全&#xff0c;还可以提高人员的作业效率&#xff0c;为港口的可持续发展提供有力保障。接下来为大家分享智慧港口人员定位系统解决方案。 方案背景 1、港口作业人员多&a…...

实时时钟和日历电路芯片MS85163/MS85163M

MS85163/MS85163M 是一款 CMOS 实时时钟 (RTC) 和 日历电路&#xff0c;针对低功耗进行了优化&#xff0c;内置了可编程的时钟输出、中断输出和低电压检测器。所有寄存器地址和数据都通过两线双向I 2 C 总线进行串行传输&#xff0c;最大总线传输速度为 400kbit/s 。采用SOP8…...

【Java从入门到精通】这也许就是Java火热的原因吧!

前言&#xff1a;Java是一种高级的、面向对象的、可跨平台的程序设计语言。Java根据技术类别可划分为以下几类&#xff1a;JavaSE&#xff08;Standard Edition&#xff0c;标准版&#xff09;&#xff1a;支持面向桌面、嵌入式和移动设备的应用程序开发&#xff1b;JavaEE&…...

zTasker—简洁易用强大的定时热键一体自动化工具,效率倍增器

软件名称 zTasker 应用平台 PC Windows7及以上 一句简介 市面上定时类软件很多&#xff0c;但无一例外功能都很单一&#xff0c;要完成不同的任务&#xff0c;需要不同的软件 市面上的热键软件&#xff0c;要么功能少&#xff0c;要么像是AutoHotKey这样对于一般用户太专业…...

惊艳时装界!AIGC风暴来袭,从设计到生产的全新体验

时尚是一个不断演进的领域&#xff0c;充满创新和独创性&#xff0c;但现在&#xff0c;创新迈入了一个崭新的境界——人工智能生成内容&#xff08;AIGC&#xff09;。这个革命性的技术&#xff0c;改变了时装设计的游戏规则。在过去的几年里&#xff0c;人工智能已经深刻地改…...

element -ui table表格内容无限滚动 使用插件vue-seamless-scroll

使用插件 一、安装组件依赖 npm install vue-seamless-scroll 二、引入组件 import vueSeamlessScroll from "vue-seamless-scroll"; components: { vueSeamlessScroll }, <div class"table-list "><vue-seamless-scroll :class-option"…...

如何在windows环境下编译T

一&#xff0c; 安装MYSYS2 1. 去https://www.msys2.org下载 msys2-x86_64-xxxxx.exe; 2. 按照msys2.org主页提示的步骤安装; 3.安装完默认起来的是 UCRT的&#xff0c; 可以根据环境的需要选择&#xff0c; 我选择的 MSYS2 MINGW64 4. 搭建编译环境&#xff0c; 安装对应的软…...

USB接口针式打印机

1 针式打印机原理 - 针式打印机16针是纵向排列&#xff0c;每次打印垂直的16bit&#xff0c;然后右移一bit&#xff0c;继续下列打印&#xff1b;字节的MSB表示最上面的点&#xff0c;字节LSB表示最下面的点 - 由于汉字字模的点阵是横向排列的&#xff0c;而提供给打印头的信息…...

外贸建站教程步骤有哪些?独立站怎么搭建?

推荐的外贸建站教程&#xff1f;制作国际贸易网站的流程&#xff1f; 对于那些希望将产品或服务推向全球市场的企业来说&#xff0c;建立一个专业、具有吸引力的网站是至关重要的。下面115SHOP将介绍外贸建站教程的关键步骤&#xff0c;帮助您更好地了解如何在国际市场上建立您…...

化妆品企业网站建设的策划方案/首页关键词排名代发

我在开发Winform程序时&#xff0c;发现将窗体双击标题栏放大后&#xff0c;会出现大量的空白处&#xff0c;相当丑陋呀 然后在网上查了查怎么禁止这样的命令 以VB.net为例 禁止双击标题栏修改大小 Protected Overrides Sub WndProc(ByRef m As Message)拦截双击标题栏的系统…...

自己做网站和凡科的区别/青岛seo建站

名字 strstr, strcasestr - 在字符串中定位一个子串概要 #include <string.h>char *strstr(const char *haystack, const char *needle);char *strcasestr(const char *haystack, const char *needle); // 是GNU的扩展描述 strstr()函数在haysta…...

网站建设接单/兰州seo技术优化排名公司

题目描述 给定n个点 给出他们的权值&#xff0c; 并且给出他们的父子关系 现在给他们染色&#xff0c; 一个节点染色的消耗为 T*a[i]&#xff0c; T为这个节点是第几次染色 a[i]为权值 根节点可以随时染色 问&#xff1a; 染色完需要全部节点的最小消耗样例 Sample Input 5 1…...

政府网站信息内容建设/推广普通话手抄报模板可打印

在程序执行过程中&#xff0c;操作系统会进行线程调度&#xff0c;同一时刻能同时执行的程序数量跟CPU的内核线程数有关&#xff0c;比如4核CPU&#xff0c;同时最多只能有4个线程。Go 语言中的运行时系统也会对goroutine进行调度&#xff0c;调度器会频繁地让goroutine处于中断…...

网站开发上线ftp怎么用/怎么做网址

editTable.js 提供编辑表格当前行、添加一行、删除当前行的操作&#xff0c;其中可以设置参数&#xff0c;如&#xff1a; operatePos 用于设置放置操作的列&#xff0c;从0开始&#xff0c;-1表示以最后一列作为放置操作的列&#xff1b;&#xff08;这里的操作包括 编辑当前行…...

廊坊建站模板系统/品牌推广运营策划方案

cmd下tracter //路由追踪//服务开关net start PPTVServicenet stop Spooler输入“ipconfig /release”&#xff0c;按“Enter”键&#xff0c;将释放IP地址。输入“ipconfig /renew” &#xff0c;按“Enter”键&#xff0c;将重新获取IP地址。在所在的网络中使用net view命令…...