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

spring5高级49讲

文章目录

  • 1、BeanFactory与ApplicationContext
  • 2、BeanFactory与ApplicationContext的容器实现
    • BeanFactory的容器实现
      • 后处理器排序
    • ApplicationContext的容器实现
  • 3、Bean的生命周期
    • Bean后处理器
  • 4、常见的Bean后处理器
  • 5、常见BeanFactory后处理器
  • 6、Aware和InitializingBean接口
  • 7、执行与销毁
  • 8、Bean的作用域scope
    • scope失效
  • 9、基于AJC编译器实现AOP
  • 10、基于agent类加载实现AOP
  • 11、基于JDK动态代理 / CGLIB动态代理 实现AOP
  • 12、JDK动态代理实现原理
  • 13、CGLib动态代理实现原理
  • 14、MethodProxy
    • CGLIB和JDK动态代理的实现区别
  • 15、Spring AOP与选择代理

1、BeanFactory与ApplicationContext

BeanFactory负责:

  • 创建、管理和配置应用程序中的对象(Bean)
  • 实现IoC(控制反转)和DI(依赖注入)
  • 是spring的核心机制。

ApplicationContext是BeanFactory的子接口。与BeanFactory相比,ApplicationContext组合了另外四个接口功能,使其可以支持:

  • 国际化(MessageSource,多语言支持)
  • 资源解析加载(ResourcePatternResolver,根据通配符匹配资源名加载资源)
  • 获取环境配置信息(EnvironmentCapable,根据配置的环境参数加载不同的配置文件,从而实现在不同环境下的灵活配置和适配。)
  • 事件发布功能(ApplicationEventPublisher,允许应用程序中的Bean发送事件。同时,其他Bean可以监听这些事件,使用@EventListener注解,并在事件发生时采取相应的处理措施。这为应用程序的解耦和模块间通信提供了便利的机制)。

在这里插入图片描述

在这里插入图片描述

2、BeanFactory与ApplicationContext的容器实现

BeanFactory的容器实现

1、创建BeanFactory的实现类对象。
2、定义bean(类型、scope等),并注册到BeanFactory
3、注册常用的后处理器。(解析注解,注入等)

在这里插入图片描述
在这里插入图片描述

BeanFactory不会做的事:

  • 不会主动添加Bean后处理器
  • 不会主动调用Bean的后处理器来解析注解
  • 不会主动初始化单例
  • 不会解析 $#

可以看出BeanFactory实现的是容器的基本功能,而下边要讲的ApplicationContext的容器实现,则会将上边的功能一一实现。

后处理器排序

Bean的后处理器有很多,用来解析不同的注解,比如@Autowired@Resource等,处理器有其固定的执行的顺序,当然也可通过添加比较器的方式来改变。

@Autowired@Resource同时出现时,执行结果与Bean后处理器执行顺序有关。
在这里插入图片描述

ApplicationContext的容器实现

Spring中的ApplicationContext是用于管理Bean的高级容器,提供了多种实现方式来适应不同场景和需求。其中常见的四种实现方式分别是:

1、ClassPathXmlApplicationContext:通过类路径下的XML配置文件加载和管理Bean。

2、FileSystemXmlApplicationContext:通过文件系统路径加载XML配置文件来管理Bean。

3、AnnotationConfigApplicationContext:基于Java注解的实现方式,使用@Configuration和@Bean注解配置Bean。

4、WebApplicationContext:用于Web应用,加载Web相关的配置信息。

1、2都是基于XML文件配置来构建容器内容,1是通过加载XML文件资源读取,2是直接XML文件路径读取。

3、4都是基于@Configuration和@Bean注解配置,不同的是第4种方式集成了TomcatServer,配置了与网页请求处理相关的Bean,主要包括:ServletWebServerFactory、Servlet分发、Servlet请求分发注册,以及相应请求路径的控制器Bean。
在这里插入图片描述

3、Bean的生命周期

Bean主要是生命周期包括:

  • 1、构造。
  • 2、依赖注入:@Autowired
  • 3、初始化:@PostConstruct
  • 4、销毁:@PreDestroy

在这里插入图片描述

Bean后处理器

除了基本的4个生命周期,还可以通过添加Bean后处理器,定位到更加精细的生命周期阶段,以便进行功能的增强,比如:

  • 实例化执行之前、实例化执行之后
  • 依赖注入之前(@Autowired、@Resource、@Value)
  • 初始化之前、初始化之后
  • 销毁执行之前

在这里插入图片描述
在这里插入图片描述

4、常见的Bean后处理器

  • 1、common注解后处理器:解析 @Resourse、@PostConstruct、@PreDestroy
  • 2、autowired注解处理器:解析@Autowired、@Value

在这里插入图片描述
从上边结果看到,common后处理器的执行优先级更高。

  • ConfigurationPropertiesBindingPostProcessor:解析@ConfigurationProperties

在这里插入图片描述

5、常见BeanFactory后处理器

  • ConfigurationClassPostProcessor:主要职责就是解析@Configuration注解的类,识别其中的@Bean方法,还可以解析@ComponentScan、@Import、@ImportResource
  • MapperScannerConfigurer:解析@Mapper,对应mybatis的MapperScan注解。

6、Aware和InitializingBean接口

Aware接口是一组特殊的接口,它们允许Bean感知或获取容器的某些方面或上下文信息。通过实现Aware接口,Bean可以与Spring容器进行交互,并获取一些有用的信息或执行特定的操作。
在这里插入图片描述
使用InitializingBean接口可以实现Bean的初始化逻辑。

Aware和InitializingBean接口实现的功能,使用Bean后处理器也可以实现,但Aware和InitializingBean是内置接口功能,不依赖外部,是一种内聚的使用方法,而后处理的方法是分模块解耦的,如果其他模块失效,则后处理器的执行也可能失效。

7、执行与销毁

指定初始化的方法有3种:

  • 1、通过后处理器的@PostConstruct
  • 2、通过 InitializingBean内置的接口
  • 3、通过在@Bean注解时,指定参数
    在这里插入图片描述
    在这里插入图片描述

执行的优先级:
在这里插入图片描述

销毁的方式与初始化类似也有3种:
在这里插入图片描述

8、Bean的作用域scope

Spring提供了以下几种常见的Bean作用域:

  • Singleton(单例):在整个应用程序的生命周期内,只创建一个Bean实例。每次请求该Bean时,都返回同一个实例。这是Spring的默认作用域。
  • Prototype(原型):每次请求该Bean时,都会创建一个新的Bean实例。即每次获取Bean,都返回一个全新的实例。
  • Request(请求):每个HTTP请求都会创建一个新的Bean实例,适用于Web应用程序。
  • Session(会话):每个用户会话(Session)创建一个新的Bean实例,适用于Web应用程序。
  • Application(应用):在整个Web应用程序的生命周期内,只创建一个Bean实例,适用于Web应用程序。
  • WebSocket(Web Socket):在WebSocket会话的生命周期内,每次创建一个新的Bean实例。

scope失效

1、一个作用域为单例的bean,如果要注入其他作用域(非单例)的bean对象,那么这个非单例作用域会失效。

实验:在单例的e中,有成员f,注入,而f是一个多例的作用域。最后的结果是e中获取到的f不是多例,而是同一个。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

原因在于:
对于单例对象而言,依赖注入仅发生了一次,后续没有再用的多例的F,因此E用的始终是第一次依赖注入的F。

在这里插入图片描述
解决方法1:使用@Lazy注解,添加在要注入的对象上,该注解仅在使用对象时,才会通过f的代理的方法,创建出f,这样调用的f就是多例的。

解决方法2:可以通过在多例对象的scope注解中,指定参数,设置代理模式。

在这里插入图片描述
解决方法3:注入F的工厂,获取方法中,使用工厂构建,然后返回
在这里插入图片描述
解决方法4:注入容器对象,获取方法中,使用容器构建出对象。

9、基于AJC编译器实现AOP

AJC(AspectJ Compiler)是AspectJ编译器的缩写。AspectJ是一种Java语言的扩展,它是AOP(面向切面编程)的一个实现。AspectJ允许开发者在Java代码中直接定义切面(Aspects),从而实现横切关注点的功能,例如日志记录、性能监控、事务管理等。

AJC的实现需要在Maven中引入AJC编译器插件

AJC编译器会直接将@Aspect增加的内容,写入到目标类中。

待增强的类:
在这里插入图片描述
aspect:
在这里插入图片描述
在编译后,生成的target中,可以看到我们的目录类已经被改写,增强的切面内容已经写入了目标类中:
在这里插入图片描述

基于AJC编译器实现的AOP,不同于spring容器中,基于代理的实现。因此AJC增强,不需要借助spring容器,而且它可以增强静态方法,而基于代理实现的增强,它的本质是通过重写方法,而静态方法是不可被重写的。

10、基于agent类加载实现AOP

基于agent类加载实现AOP指的是在在运行时,通过指定系统运行参数,基于agent类加载来实现增强。

实验:
切面指向待增强类中所有的方法:
在这里插入图片描述
运行时虚拟机参数设置:

bashjavaagent:C:\Users\123\.m2\repository/org/aspectj/aspectjweaver/1.9.4/aspectjweaver-1.9.4.jar

AJC在编译阶段实现了AOP增强,因此可以在target中找到编译对象,通过反编译查看增强后的目标类。

基于agent类加载实现的增强,增强的目标运行在JVM中。
可以通过阿里的Arthas工具,调试正在运行的程序:
在这里插入图片描述

通过 jad命令,指定待增强的目标类:
在这里插入图片描述
然后就可以看到类加载增强的内容。
在这里插入图片描述

11、基于JDK动态代理 / CGLIB动态代理 实现AOP

JDK动态代理:对于实现了接口的目标对象,Spring使用JDK动态代理来创建代理对象。JDK动态代理是通过Java原生的java.lang.reflect.Proxy类来实现的。代理对象实现了目标接口,并在InvocationHandler的invoke方法中添加了增强逻辑,即基于反射,method.invoke('待增强对象', '方法参数');

JDK动态代理只能针对接口代理!

在这里插入图片描述

注意:代理对象没有源码,是在运行期间动态生成的字节码,因此代理对象需要传递加载器,将字节码加载对代理对象。
在这里插入图片描述

CGLIB动态代理:对于没有实现接口的目标对象,Spring使用CGLIB动态代理来创建代理对象。CGLIB(Code Generation Library)是一个代码生成库,它通过生成目标类的子类来实现代理。代理对象继承了目标类,并在其子类中添加了增强逻辑。

核心逻辑是基于Code Generation Library中的
Enhancer.create()方法,生成代理类为待增强目标的类的子类。

所以cglib动态代理只能针对可继承的待增强对象进行代理!
在这里插入图片描述

cglib动态代理对于方法的调用有三种:
1、通过方法反射的方式,method.invoke(target,args)
2、通过方法代理对象,传入目标对象调用,非反射,需要目标
3、通过方法代理对象,传入代理对象调用,非反射,需要代理。这里传入的代理是FastClassProxy

12、JDK动态代理实现原理

JDK动态代理是基于反射实现的。

  • 1、代理对象必须实现InvocationHandler接口,JDK在实现时是继承了Proxy类,提供了InvocationHandler的构建方法,在执行时通过super,传入InvocationHandler。
  • 2、使用Proxy.newProxyInstance产生代理对象,代理对象是基于ASM(字节码操作框架)技术,动态生成的字节码,因此需要传入类加载器,将字节码加载为对象。
  • 3、接口方法的获取是通过反射的方式,即从类的字节码中调用getMethod方法得到的,为了避免多次调用的getMethod的开销,代理对象内部使用静态成员保存了方法,并通过静态代码块进行了初始化赋值。
  • 4、为了处理有返回值的方法,代理对象中的返回值为Object对象。方法中对于异常的捕获和处理,分为了运行时异常和受检时异常,对于运行时异常直接抛出,对于受检异常,将其包装为UndeclaredThrowableException后,再抛出。
  • 5、jdk反射优化,接口方法增强时,采用了反射的方式调用方法,这样性能是有损耗的,jdk内部对此进行了优化,当调用次数到第17次时,jdk内部会生成一个有该方法的代理对象,直接调用该代理对象的方法,而不再使用反射的形式调用。

13、CGLib动态代理实现原理

JDK动态代理增强的是实现了接口的目标类,本质上基于反射。
CGLib动态代理采用继承 + 方法拦截器的方式,针对可继承的目标类进行增强。

1、生成代理类:当目标类需要被代理时,CGLIB会在运行时生成一个代理类,该代理类继承自目标类,成为目标类的子类。

2、拦截器:在CGLIB中,代理的逻辑由一个拦截器(MethodInterceptor)来实现,拦截器负责在代理类的方法调用前后执行额外的逻辑。拦截器类似于JDK动态代理中的InvocationHandler。

3、方法调用的重定向:在代理类的方法调用时,CGLIB会将方法的调用重定向到拦截器的intercept()方法中。在intercept()方法中,可以实现对目标方法的增强逻辑,并调用目标方法。

4、代理对象创建:通过字节码生成技术,CGLIB将代理类的定义转换为字节码,并使用ClassLoader加载字节码,最终生成代理对象。

14、MethodProxy

cglib中基于MethodProxy的目标方法调用,是直接调用而非反射,这使得它的性能会优于JDK动态代理的方式。

在CGLIB源码中,MethodProxy类的主要实现是由FastClass类和MethodInfo类配合完成的。下面简要解释MethodProxy的实现原理:

1、FastClass:FastClass是CGLIB中的一个关键类,它负责快速调用一个类的方法,而无需像反射那样通过Method对象进行调用。FastClass通过方法的索引号直接进行方法调用,从而提高了调用的效率。FastClass通过ASM库在运行时生成一个快速调用方法的类。

2、MethodInfo:MethodInfo用于表示目标类中的一个方法。它包含了方法的名称、访问修饰符、返回类型、参数类型等信息。

3、MethodProxy:在生成代理类的过程中,CGLIB会为每个目标方法生成一个对应的MethodProxy对象。MethodProxy中包含了目标方法的索引号和方法签名等信息。

4、在代理类的方法调用时,代理对象会通过MethodProxy的invoke(Object obj, Object[] args)方法来调用目标方法。invoke()方法内部会通过FastClass来快速调用目标方法,而无需使用Java反射。通过FastClass的invoke(int methodIndex, Object obj, Object[] args)方法,根据目标方法的索引号直接调用目标方法。

通过这种方式,CGLIB避免了Java反射带来的性能开销,实现了高性能的动态代理。MethodProxy是实现这一机制的重要组成部分,它使得CGLIB动态代理在对没有实现接口的类进行代理时,具有了更高的效率和性能。

CGLIB和JDK动态代理的实现区别

CGLIB和JDK动态代理是两种不同的动态代理实现方式,它们在原理、适用场景和性能方面有一些区别。下面讲解一下它们的区别:

  • 原理和实现方式:

    • JDK动态代理:JDK动态代理是通过Java原生的java.lang.reflect.Proxy类和InvocationHandler接口来实现的。在运行时,JDK动态代理通过生成目标接口的代理对象,并通过InvocationHandler的invoke()方法来实现对目标方法的拦截和增强。
    • CGLIB动态代理:CGLIB动态代理是通过CGLIB库,利用字节码生成技术,在运行时生成目标类的子类作为代理类。在子类中,CGLIB通过生成MethodProxy对象实现对目标方法的拦截和增强。
  • 代理类型:

    • JDK动态代理:JDK动态代理只能代理实现了接口的目标类。如果目标类没有实现任何接口,就无法使用JDK动态代理进行代理。
    • CGLIB动态代理:CGLIB动态代理可以代理没有实现接口的目标类。它通过生成目标类的子类来实现代理,因此对于没有接口的类也能够代理。
  • 性能:

    • JDK动态代理:JDK动态代理在调用代理方法时,涉及到反射调用,有一定的性能开销。代理效率相对较低,尤其在代理方法较多时性能下降较明显。
    • CGLIB动态代理:CGLIB动态代理在调用代理方法时,通过直接调用生成的子类的方法,无需反射调用,因此相对于JDK动态代理,性能更高。特别适用于代理方法较多或代理对象创建较频繁的情况。
  • 依赖和兼容性:

    • JDK动态代理:JDK动态代理依赖于Java原生的java.lang.reflect.Proxy类,对于Java平台的兼容性较好,无需额外引入第三方库。
    • CGLIB动态代理:CGLIB动态代理依赖于CGLIB库,使用时需要引入相应的依赖。CGLIB动态代理在Java平台上运行良好,但在其他Java虚拟机(JVM)上可能存在兼容性问题。

15、Spring AOP与选择代理

相关文章:

spring5高级49讲

文章目录 1、BeanFactory与ApplicationContext2、BeanFactory与ApplicationContext的容器实现BeanFactory的容器实现后处理器排序 ApplicationContext的容器实现 3、Bean的生命周期Bean后处理器 4、常见的Bean后处理器5、常见BeanFactory后处理器6、Aware和InitializingBean接口…...

MacOS本地安装Hadoop3

金翅大鹏盖世英,展翅金鹏盖世雄。 穿云燕子锡今鸽,踏雪无痕花云平。 ---------------- 本文密钥:338 ----------------- 本文描述了在macbook pro的macos上安装hadoop3的过程,也可以作为在任何类linux平台上安装hadoop3借鉴。 …...

十五章:使用类别峰值响应的弱监督实例分割

0.摘要 目前,使用图像级别标签而不是昂贵的像素级掩码进行弱监督实例分割的研究还未得到充分探索。本文通过利用类别峰值响应来实现一个分类网络,用于提取实例掩码,来解决这个具有挑战性的问题。只通过图像标签的监督下,完全卷积的…...

自然语言处理从入门到应用——LangChain:模型(Models)-[聊天模型(Chat Models):基础知识]

分类目录:《自然语言处理从入门到应用》总目录 聊天模型是语言模型的一种变体。虽然聊天模型在内部使用语言模型,但它们公开的接口略有不同。它们不是提供一个“输入文本,输出文本”的API,而是提供一个以“聊天消息”作为输入和输…...

Asp.Net 使用Log4Net (SQL Server)

Asp.Net 使用Log4Net (SQL Server) 1. 创建数据库表 首先,在你的SQL Server数据库中创建一个用于存储日志的表。以下是一个简单的表结构示例: CREATE TABLE [dbo].[Logs]([Id] [INT] IDENTITY(1,1) PRIMARY KEY,[Date] [DATETIME] NOT NULL,[Thread] …...

Vue2基础五、工程化开发

零、文章目录 Vue2基础五、工程化开发 1、工程化开发和脚手架 (1)开发 Vue 的两种方式 核心包传统开发模式:基于 html / css / js 文件,直接引入核心包,开发 Vue。工程化开发模式:基于构建工具&#xf…...

发现 ModStartCMS:构建梦想网站的全新选择

亲爱的网站开发者和内容创作者们, 在当今数字化的时代,网站已经成为展示品牌、传递信息和吸引目标受众的关键渠道。为了帮助您更高效地打造梦想中的网站,我们荣幸地向您介绍 ModStartCMS,这是一款基于 Laravel 的全新模块化内容管…...

大数据Flink(五十二):Flink中的批和流以及性能比较

文章目录 Flink中的批和流以及性能比较 ​​​​​​​​​​​​​​一、Flink中的批和流...

【MySQL】MySQL索引、事务、用户管理

20岁的男生穷困潦倒,20岁的女生风华正茂,没有人会一直风华正茂,也没有人会一直穷困潦倒… 文章目录 一、MySQL索引特性(重点)1.磁盘、OS、MySQL,在进行数据IO时三者的关系2.索引的理解3.聚簇索引&#xff0…...

函数重载与引用

文章目录 一、函数重载1. 重载规则2.重载列子3.函数名修饰规则 二、引用1.本质2.特性1. 引用必须在定义时初始化2 . 一个变量可以有多个引用3 . 引用一旦引用一个实体,就不能引用其他实体 3.引用例子4.引用的权限5.效率比较6.指针跟引用的区别 一、函数重载 函数重…...

如何快速模拟一个后端 API

第一步:创建一个文件夹,用来存储你的数据 数据: {"todos": [{ "id": 1, "text": "学习html44", "done": false },{ "id": 2, "text": "学习css", "…...

DLA :pytorch添加算子

pytorch的C extension写法 这部分主要介绍如何在pytorch中添加自定义的算子,需要以下cuda基础。就总体的逻辑来说正向传播需要输入数据,反向传播需要输入数据和上一层的梯度,然后分别实现这两个kernel,将这两个kernerl绑定到pytorch即可。 a…...

Java特殊时间格式转化

平常开发过程当中,我们可能会见到有的日期格式是这样的。 1、2022-12-21T12:20:1608:00 2、2022-12-21T12:20:16.0000800 3、2022-12-21T12:20:16.00008:00下面来说一下这种时间格式怎么转换 第一种:2022-12-21T12:20:1608:00 代码如下: p…...

在CSDN学Golang云原生(Kubernetes声明式资源管理Kustomize)

一,生成资源 在 Kubernetes 中,我们可以通过 YAML 或 JSON 文件来定义和创建各种资源对象,例如 Pod、Service、Deployment 等。下面是一个简单的 YAML 文件示例,用于创建一个 Nginx Pod: apiVersion: v1 kind: Pod m…...

后台管理系统中常见的三栏布局总结:使用element ui构建

vue2 使用 el-menu构建的列表布局&#xff1a; 列表可以折叠展开 <template><div class"home"><header><el-button type"primary" click"handleClick">切换</el-button></header><div class"conte…...

SpringCloud学习路线(10)——分布式搜索ElasticSeach基础

一、初识ES &#xff08;一&#xff09;概念&#xff1a; ES是一款开源搜索引擎&#xff0c;结合数据可视化【Kibana】、数据抓取【Logstash、Beats】共同集成为ELK&#xff08;Elastic Stack&#xff09;&#xff0c;ELK被广泛应用于日志数据分析和实时监控等领域&#xff0…...

CSS翻转DIV展示顺序

项目国际化开发中&#xff0c;阿拉伯语是从右往左读的&#xff0c;在做样式兼容时&#xff0c;一些表单代码块也需要 label在右&#xff0c;表单在左。如果整个项目改div的话代价太大了&#xff0c;所以需要做样式翻转。 html <div class"container"><div …...

python 源码中 PyId_stdout 如何定义的

python 源代码中遇到一个变量名 PyId_stdout&#xff0c;搜不到在哪里定义的&#xff0c;如下只能搜到引用的位置&#xff08;python3.8.10&#xff09;&#xff1a; 找了半天发现是用宏来构造的声明语句&#xff1a; // filepath: Include/cpython/object.h typedef struct …...

Mybatis映射关系mybatis核心配置文件

目录 1.Mybatis映射关系 1.1一对一映射之resultType 1.2resultMap处理映射关系 2.mybatis核心配置文件 1. properties&#xff08;属性&#xff09; 2. settings&#xff08;设置&#xff09; 3.typeAliases&#xff08;类型别名&#xff09; 4.environments&#xff0…...

Mybatis中limit用法与分页查询

错误示范 错误示范一&#xff1a; <select id"fileInspectionList" resultType"map">SELECT <include refid"aip_n_static_cols"/>FROM sys_inspection_form WHERE<if test" type admin.toString() ">dept_id …...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...