Knife4j的原理及应用详解(三)
本系列文章简介:
在当今快速发展的软件开发领域,API(Application Programming Interface,应用程序编程接口)作为不同软件应用之间通信的桥梁,其重要性日益凸显。随着微服务架构的兴起,API的数量和复杂度急剧增加,如何高效地管理和维护这些API文档成为了开发者们面临的一大挑战。传统的文档编写方式往往依赖于手工操作,不仅效率低下且容易出错,难以满足现代软件开发的需求。
Swagger,作为一款开源的API文档生成工具,凭借其自动化生成文档、支持多种语言及框架等特点,迅速在开发者中赢得了广泛的认可。然而,Swagger的默认UI界面在美观性和用户体验方面仍有提升空间,特别是对于追求高效和良好用户体验的现代应用而言。
正是在这样的背景下,Knife4j应运而生。作为Swagger的增强解决方案,Knife4j不仅继承了Swagger强大的文档生成能力,还通过定制化的UI界面、增强的交互功能以及更灵活的配置选项,为开发者们提供了一个更加高效、易用且美观的API文档管理工具。
本系列文章旨在深入探讨Knife4j的原理及其应用。首先,我们将简要介绍Knife4j的基本概念、主要功能及特点,以便读者对其有一个初步的了解。随后,我们将深入分析Knife4j的工作原理,包括它是如何与Swagger集成的、如何解析Swagger注解并生成API文档的,以及它如何通过定制化的UI界面和增强的交互功能来提升用户体验。
希望通过全面而深入的剖析,帮助大家更好地理解并掌握Knife4j的原理及其应用,从而为现代软件开发中的API文档管理提供有力的支持。
欢迎大家订阅《Java技术栈高级攻略》专栏(PS:近期会涨价),一起学习,一起涨分!
目录
一、引言
二、Knife4j的原理
2.1 Swagger基础原理
2.1.1 Swagger注解与文档生成流程
2.1.2 OpenAPI规范介绍
2.2 Knife4j对Swagger的扩展与增强
2.2.1 UI界面的定制与优化
2.2.2 文档生成机制的增强
2.2.3 支持Swagger注解以外的扩展机制
2.3 核心技术解析
三、Knife4j的应用
四、Knife4j与其他工具的对比
五、案例分析
六、结论与展望
七、结语
一、引言
Knife4j是一个基于Swagger构建的开源Java API文档工具,它为Java开发者提供了生成、展示和调试API文档的强大功能。Knife4j的前身是swagger-bootstrap-ui,取名Knife4j是希望它能像一把匕首一样小巧、轻量且功能强悍。Knife4j是专为Java MVC框架集成的Swagger生成Api文档的增强解决方案,旨在简化接口文档的编写和管理过程。
本文将跟随《Knife4j的原理及应用详解(二)》的进度,继续介绍Knife4j。希望通过本系列文章的学习,您将能够更好地理解Knife4j的内部工作原理,掌握Knife4j的使用技巧,以及通过合理的设计完成最佳实践,充分发挥优化Knife4j的潜力,为系统的高效运行提供有力保障。
二、Knife4j的原理
2.1 Swagger基础原理
2.1.1 Swagger注解与文档生成流程
Swagger注解与文档生成流程是一个高效、自动化的过程,它允许开发者在编写代码的同时,通过添加特定的注解来自动生成API文档。以下是Swagger注解与文档生成的详细流程:
1. 添加Swagger依赖
首先,需要在项目的构建文件中(如Maven的pom.xml或Gradle的build.gradle)添加Swagger的依赖项。这些依赖项通常包括Swagger的核心库(如springfox-swagger2)和Swagger UI库(如springfox-swagger-ui),用于生成和展示API文档。
例如,在Maven项目中,可以添加如下依赖:
<!-- Swagger2 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> <!-- 注意:版本号可能随时间更新,请根据实际情况选择 --> </dependency> <!-- Swagger-UI --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> <!-- 注意:版本号应与springfox-swagger2保持一致 --> </dependency>
2. 配置Swagger
接下来,需要创建一个配置类来配置Swagger。在这个配置类中,通常会定义一个或多个Docket实例,用于指定哪些包或类应该被Swagger扫描以生成API文档。此外,还可以在这个类中自定义API文档的元数据,如标题、描述和版本信息等。
例如:
@Configuration @EnableSwagger2 // 启用Swagger2 public class SwaggerConfig { @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage("com.yourcompany.yourproject")) // 指定扫描的包 .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("你的项目API文档") .description("这里是项目的详细描述") .version("1.0") .build(); } }
3. 在代码中使用Swagger注解
在完成了Swagger的依赖添加和配置之后,就可以在代码中通过添加Swagger注解来生成API文档了。Swagger提供了多种注解,用于描述API的不同方面,如接口、方法、参数和响应等。
常用的Swagger注解包括:
@Api
:用于Controller类上,描述整个类的作用。@ApiOperation
:用于Controller类中的方法上,描述方法的作用。@ApiParam
:用于方法参数上,描述参数的作用。@ApiModel
:用于实体类上,描述实体类的作用。@ApiModelProperty
:用于实体类的属性上,描述属性的作用。
例如:
@RestController @Api(tags = "用户管理") public class UserController { @GetMapping("/users/{id}") @ApiOperation(value = "根据ID查询用户", notes = "根据用户ID查询用户信息") @ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long") public User getUserById(@PathVariable Long id) { // 方法实现 } }
4. 访问Swagger UI
最后,启动项目并访问Swagger UI的URL(通常是http://localhost:<端口>/swagger-ui.html
),就可以看到自动生成的API文档了。在这个页面上,可以浏览API的接口列表、查看接口的详细信息、进行接口测试等。
总结
Swagger注解与文档生成流程是一个简单而强大的工具,它可以帮助开发者在编写代码的同时自动生成API文档,极大地提高了开发效率和API文档的可用性。通过遵循上述步骤,开发者可以轻松地在自己的项目中集成和使用Swagger。
2.1.2 OpenAPI规范介绍
Swagger基础原理中的OpenAPI规范介绍,可以从以下几个方面进行阐述:
1、OpenAPI规范概述
OpenAPI规范(OpenAPI Specification,OAS),以前称为Swagger规范,是一种用于描述RESTful API的规范和工具集合。它为HTTP API定义了一个与语言无关的标准接口,使得人和计算机都可以在不使用源代码、文档或监听网络通信的情况下,具备发现和理解服务的能力。OpenAPI规范允许开发者以一种标准化的方式描述他们的API,包括API的路径、请求参数、响应参数、认证方法等,从而提高了API的可读性和可维护性。
2、OpenAPI规范的主要特点
- 语言无关性:OpenAPI规范是一种与编程语言无关的标准,因此它适用于各种编程语言和平台。
- 标准化:OpenAPI规范为RESTful API提供了一个统一的描述格式,使得不同的系统和组件之间可以更加方便地进行交互。
- 机器可读性:OpenAPI规范采用YAML或JSON格式编写,这使得机器可以轻松地解析和处理API描述文件。
- 丰富的功能:OpenAPI规范支持多种高级功能,如请求和响应的验证、参数传递方式等,为开发者提供了更多的灵活性和控制能力。
3、OpenAPI规范的应用场景
- API文档生成:使用OpenAPI规范可以自动生成API文档,这些文档包含了API的所有相关信息,如请求参数、响应参数、错误码等,方便开发者了解和使用API。
- 代码生成:基于OpenAPI规范,可以生成各种编程语言的服务器和客户端代码,从而加速API的开发和部署过程。
- API测试和调试:OpenAPI规范支持多种测试和调试工具,如Postman、Apifox等,这些工具可以根据OpenAPI规范定义的API描述文件进行测试和调试工作。
4、OpenAPI规范与Swagger的关系
Swagger是一套围绕OpenAPI规范构建的开源工具,它提供了多种工具来帮助开发者设计、构建、记录和使用REST API。Swagger工具包括Swagger Editor(基于浏览器的编辑器,用于编写OpenAPI规范)、Swagger UI(将OpenAPI规范呈现为交互式API文档的工具)、Swagger Codegen(将OpenAPI规范生成为服务器存根和客户端库的工具)等。通过使用Swagger工具,开发者可以更加方便地管理和使用OpenAPI规范定义的API。
5、总结
OpenAPI规范是现代软件开发中用于描述RESTful API的一种重要规范和工具集合。它提供了一种标准化的方式来描述API,使得不同的系统和组件之间可以更加方便地进行交互。同时,OpenAPI规范还支持多种高级功能和工具,为开发者提供了更多的灵活性和控制能力。通过学习和使用OpenAPI规范,开发者可以更加高效地开发和管理RESTful API。
2.2 Knife4j对Swagger的扩展与增强
2.2.1 UI界面的定制与优化
Knife4j对Swagger的扩展与增强主要体现在UI界面的定制与优化上,以下是对这一方面的详细阐述:
1、Knife4j简介
Knife4j是一个基于Swagger UI的增强版UI框架,专为Java MVC框架集成Swagger以生成API文档提供增强型解决方案。它源自swagger-bootstrap-ui,经过升级和重塑,现在更专注于微服务环境下的灵活性与高效性。Knife4j旨在提供一个轻量化、功能强大的工具,使开发者能够轻松构建和维护高质量的API文档。
2、Knife4j对Swagger UI界面的定制与优化
- UI界面的美化:
- 更加美观的UI设计:Knife4j在Swagger UI的基础上进行了改进和优化,提供了更加美观的界面设计,提升了用户的视觉体验。
- 支持多语言:Knife4j支持多种常用语言,如中文、英文、日文等,可以在配置文件中设置语言属性来配置文档界面语言,方便不同地区的用户使用。
- 增强的交互体验:
- 实时调试功能:Knife4j内置了接口调试功能,允许开发者在文档页面上进行实时测试,直接看到接口的响应结果,大大提高了开发效率。
- 接口排序与搜索:Knife4j提供了接口排序和搜索功能,方便开发者快速定位到需要查看或测试的接口。
- 参数预填充:对于某些需要频繁输入的参数,Knife4j支持参数预填充功能,减少了重复输入的工作量。
- 高度定制化:
- 前端源码开放:Knife4j提供了Vue2.0和Vue3.0版本的前端源码,方便开发者根据项目需求进行定制和扩展。
- 模块化设计:Knife4j采用了模块化设计,开发人员可以根据项目需求选择合适的组件进行集成和使用。
- 适应微服务架构:
- 前后端解耦:Knife4j的设计使得前后端可以解耦,方便在微服务架构中独立部署和使用。
- 分布式系统支持:在分布式系统中,每个服务都可以独立部署Knife4j,实现API文档的自动化生成和管理。
3、整合与使用
要在Spring Boot项目中整合Knife4j,通常需要进行以下步骤:
- 添加依赖:在项目的
pom.xml
文件中添加Knife4j的依赖项。 - 配置Swagger和Knife4j:在Spring Boot的配置文件(如
application.properties
或application.yml
)中添加Swagger和Knife4j的相关配置。 - 编写API文档:使用Swagger注解(如
@Api
、@ApiOperation
等)编写API文档。 - 访问Knife4j界面:启动Spring Boot应用后,通过配置的访问路径(如
http://localhost:8080/doc.html
)访问Knife4j的UI界面。
4、总结
Knife4j通过对Swagger UI界面的定制与优化,提供了更加美观、易用、功能强大的API文档管理工具。它不仅美化了界面设计,还增强了交互体验,支持多语言、实时调试、接口排序与搜索等高级功能。同时,Knife4j的高度定制化特性和对微服务架构的支持,使得它成为Java开发环境下构建高质量API文档的首选工具。
2.2.2 文档生成机制的增强
Knife4j作为Swagger的一个增强工具,在文档生成机制上进行了多方面的扩展与增强。以下是Knife4j对Swagger文档生成机制的增强点:
1. 更好的UI界面与用户体验
- 美观的界面设计:Knife4j在原生Swagger-UI的基础上进行了大量优化,提供了更美观、更直观的UI界面,使得API文档的查阅和测试体验更加友好。
- 实时更新:支持实时更新接口文档,当代码发生变化时,文档内容会自动同步更新,确保文档与实际代码始终保持一致。
- 响应示例折叠/展开:提供响应示例的折叠/展开功能,方便开发者查看和测试API的响应数据。
2. 强大的个性化定制能力
- 个性化配置项:Knife4j支持接口地址、接口description属性、UI增强等个性化配置功能,满足不同团队的个性化需求。
- 离线文档导出:提供离线文档导出功能,方便开发者在没有网络的环境下查阅API文档。
- 全局参数设置:支持全局参数设置,减少在每个接口中重复设置参数的繁琐。
3. 丰富的扩展功能
- 接口排序与筛选:允许用户按照接口分组、标签、路径等多种方式对API进行排序和筛选,方便快速定位所需接口。
- 在线调试:提供在线调试功能,开发者可以直接在Knife4j界面中发送请求并查看响应结果,无需编写额外的测试代码。
- 模型树结构展示:对于复杂的请求或响应模型,Knife4j以树形结构展示其属性,使得模型结构更加清晰易懂。
4. 安全与权限控制
- OAuth2认证支持:Knife4j无缝集成OAuth2认证,支持多种授权类型,便于在安全环境下调试API。
- 生产环境屏蔽:提供生产环境屏蔽功能,可以在生产环境中关闭Swagger/Knife4j的访问,确保API文档的安全性。
5. 易于集成与配置
- 快速集成:Knife4j提供了starter包,使得在Spring Boot项目中集成Knife4j变得非常简单快捷。
- 灵活配置:通过配置文件或注解的方式,可以轻松配置Knife4j的各项参数和功能。
6. 持续的更新与维护
- 活跃的社区支持:Knife4j由国人程序员萧明于2017年开源,至今仍在持续更新和维护中,拥有活跃的社区支持。
- 广泛的兼容性:Knife4j与Swagger保持高度兼容,同时也在不断扩展和优化自身的功能。
综上所述,Knife4j在文档生成机制上通过提供更好的UI界面、强大的个性化定制能力、丰富的扩展功能、安全与权限控制、易于集成与配置以及持续的更新与维护等方面的增强,极大地提升了Swagger文档生成机制的实用性和易用性。
2.2.3 支持Swagger注解以外的扩展机制
Knife4j作为Swagger的增强工具,不仅保留了Swagger的核心功能,如通过注解自动生成API文档,还提供了多种扩展机制来进一步满足开发者的需求。以下是Knife4j支持Swagger注解以外的扩展机制的几个方面:
1. 丰富的UI界面定制
- 界面美化:Knife4j对Swagger UI进行了深度定制和优化,提供了更加美观、易用的界面,增强了用户体验。
- 布局调整:开发者可以根据项目需求,调整文档页面的布局、颜色、字体等,以符合项目的整体风格。
2. 多种注解配置方式
- 扩展注解:除了支持Swagger的原生注解外,Knife4j还提供了额外的注解或配置方式,使开发者能够更加灵活地定义API文档。
- 分组管理:通过配置类,开发者可以对API进行分组管理,使得文档结构更加清晰。
3. 插件扩展机制
- 内置插件:Knife4j内置了多种插件,如权限控制、接口排序、搜索功能等,这些插件可以直接使用,无需额外开发。
- 自定义插件:Knife4j提供了插件开发接口,开发者可以根据自己的需求,编写自定义的插件来扩展Knife4j的功能。
4. 动态配置与属性调整
- 配置文件:Knife4j支持通过配置文件来调整API文档的属性,如文档标题、描述、版本等,无需修改代码即可实现动态更新。
- 动态调整:在部分场景下,开发者可能需要在运行时动态调整API文档的某些属性。Knife4j提供了相应的机制,允许开发者通过编程方式来实现这一需求。
5. 安全性与权限控制
- OAuth2支持:Knife4j无缝集成OAuth2认证,支持多种授权类型,可以在安全环境下调试API。
- 权限管理:开发者可以通过配置或编写自定义插件来实现对API文档的权限管理,确保只有授权用户才能访问敏感信息。
6. 社区与生态支持
- 活跃社区:Knife4j拥有活跃的社区支持,开发者可以在社区中交流经验、提出问题并获得帮助。
- 生态扩展:随着Knife4j的不断发展,越来越多的开发者和团队开始使用它,并为其贡献插件和扩展功能,进一步丰富了Knife4j的生态系统。
综上所述,Knife4j通过丰富的UI界面定制、多种注解配置方式、插件扩展机制、动态配置与属性调整、安全性与权限控制以及社区与生态支持等方面的扩展机制,为开发者提供了更加灵活、强大的API文档生成和管理工具。
2.3 核心技术解析
详见《Knife4j的原理及应用详解(四)》
三、Knife4j的应用
详见《Knife4j的原理及应用详解(五)》
四、Knife4j与其他工具的对比
详见《Knife4j的原理及应用详解(六)》
五、案例分析
详见《Knife4j的原理及应用详解(七)》
六、结论与展望
详见《Knife4j的原理及应用详解(七)》
七、结语
文章至此,已接近尾声!希望此文能够对大家有所启发和帮助。同时,感谢大家的耐心阅读和对本文档的信任。在未来的技术学习和工作中,期待与各位大佬共同进步,共同探索新的技术前沿。最后,再次感谢各位的支持和关注。您的支持是作者创作的最大动力,如果您觉得这篇文章对您有所帮助,请分享给身边的朋友和同事!
相关文章:

Knife4j的原理及应用详解(三)
本系列文章简介: 在当今快速发展的软件开发领域,API(Application Programming Interface,应用程序编程接口)作为不同软件应用之间通信的桥梁,其重要性日益凸显。随着微服务架构的兴起,API的数量…...

Android约束布局的概念与属性(1)
目录 1.相对定位约束2.居中和偏移约束 约束布局(ConstraintLayout)是当前Android Studio默认的布局方式,也是最灵活的一种布局方式。约束布局推荐使用所见即所得的模式进行布局,约束布局的大部分布局可以通…...

阿里巴巴开源自然语音交互框架;在抱抱脸上使用LivePortrait;58种提示技术的工具库
✨ 1: FunAudioLLM FunAudioLLM是一个为人类和大型语言模型(LLMs)之间自然语音交互打造的语音理解和生成基础框架。 FunAudioLLM 是阿里巴巴集团Tongyi SpeechTeam推出的用于增强人类与大语言模型(LLM)自然语音交互的框架。该框…...

《算法笔记》总结No.5——递归
一.分而治之 将原问题划分为若干个规模较小而结构与原问题相同或相似的子问题,然后分别解决这些子问题,最后合并子问题的解,即可得到原问题的解,步骤抽象如下: 分解:将原问题分解为若干子问题解决&#x…...

鸿蒙小练习
bean对象 export class BannerImage{id:numberurl:stringtargetUrl:stringproductId:numberconstructor(id: number, url: string, targetUrl: string, productId: number) {this.id idthis.url urlthis.targetUrl targetUrlthis.productId productId} }export class d…...

谷粒商城-个人笔记(集群部署篇二)
前言 学习视频:Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强学习文档: 谷粒商城-个人笔记(基础篇一)谷粒商城-个人笔记(基础篇二)谷粒商城-个人笔记(基础篇三)谷粒商城-个人笔记(高级篇一)谷粒商城-个…...

Python面试题-7
21. 请解释Python中的元组。 Python中的元组(Tuple)是一种内置的数据结构,它有如下特点: 有序性:元组中的元素是有序的,每个元素都有一个索引,索引从0开始。不可变性:一旦元组被创…...

微信⼩程序的电影推荐系统-计算机毕业设计源码76756
摘 要 随着互联网的普及和移动互联网的发展,人们对于获取信息的便捷性和高效性要求越来越高。电影作为一种受众广泛喜爱的娱乐方式,电影推荐系统的出现为用户提供了更加个性化和精准的电影推荐服务。微信小程序作为一种轻量级应用形式,在用…...

理解与解读李彦宏在2024世界人工智能大会的发言:应用优先于技术
2024年7月4日,世界人工智能大会暨人工智能全球治理高级别会议在上海世博中心举行。百度创始人、董事长兼首席执行官李彦宏在产业发展主论坛上提出了一个引人深思的观点:“大家不要卷模型,要卷应用!”他强调了一个重要的观点&#…...

数字化打破传统,引领企业跨界经营与行业生态盈利
在当今数字化时代,传统的赚货差思路正面临着巨大的挑战。然而,数字化的崛起为企业提供了突破传统束缚的机会,促使其转向跨界经营,并通过行业生态经营获取利润。 首先,数字化打破了传统赚货差思路的局限性。以往&…...

【链表】- 链表相交
1. 对应力扣题目连接 链表相交 2. 实现思路 链表详情: 考虑使用双指针: 解法一: 具体代码,详见3. 实现案例代码解析: 思路:因为链表按照如图的箭头走向,走的总路程是相等的,一…...

【python 学习】快速了解python内置类型
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、内置类型的介绍1.1 类型体系1.2 空类型和None1.3 布尔值 二、内置类型的运算2.1 布尔运算2.2 比较运算符比较…...

npm ERR! code ENOTEMPTY npm ERR! syscall rename npm ERR!
报错: npm ERR! code ENOTEMPTY npm ERR! syscall rename npm ERR! path /home/user/.local/lib/node_modules/pkg npm ERR! dest /home/user/.local/lib/node_modules/.pkg-piikcue3 npm ERR! errno -39 npm ERR! ENOTEMPTY: directory not empty, rename ‘/home/…...

智能井盖采集装置 开启井下安全新篇章
在现代城市的脉络之下,错综复杂的管网系统如同城市的血管,默默支撑着日常生活的有序进行。而管网的监测设备大多都安装在井下,如何给设备供电一直是一个难题,选用市电供电需经过多方审批,选用电池供电需要更换电池包&a…...

C# AGV小车通讯开发的方法
AGV (Automated Guided Vehicle) 小车的通讯开发通常涉及与AGV控制系统或调度系统的数据交换。在C#中实现AGV小车通讯,可以采用多种方法,具体取决于AGV的通信协议和硬件接口。以下是一些常用的开发方法: 1. 串行通讯 (Serial Communication)…...

01-图像基础-颜色空间
1.RGB颜色空间 RGB是一种常用的颜色空间,比如一幅720P的图像,所对应的像素点个数是1280*720,每一个像素点由三个分量构成,分别是R,G,B。 R代表红色分量,G代表绿色分量,B代表蓝色分量,以24位色来…...

双向链表+Map实现LRU
LRU: LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。 核心思想: 基于Map实现k-v存储,双向链表中使用一个虚拟头部和虚拟尾部,虚拟头部的…...

HTML(27)——渐变
渐变是多个颜色逐渐变化的效果,一般用于设置盒子模型 线性渐变 属性:background-image : linear-gradient( 渐变方向 颜色1 终点位置, 颜色2 终点位置, ......); 取值: 渐变方向:可选 to 方位名词角度度数 终点位置:可选 百分…...

2024上半年网络工程师考试《应用技术》试题一
阅读以下说明,回答问题。 【说明】 MPLS基于(1)进行转发,进行MPLS标签交换和报文转发的网络设备称为(2),构成MPLS域(MPSDomain)。位于MPLS域边缘、连接其他网络的LSR称为(3),区域内部的LSR称为核心LSR(CoreLSR)IP报文进入MPLS网络时…...

pnpm介绍
PNPM 是一个 JavaScript 包管理器,类似于 npm 和 Yarn。它的全称是 "Performant npm",主要设计目标是优化包的安装和管理过程,以提升速度和效率。PNPM 的主要特点包括: 符号链接(Symlink)&#x…...

Linux内核的启动过程(非常详细)零基础入门到精通,收藏这一篇就够了
Linux内核的生成过程 内核的生成步骤可以概括如下: ① 先生成 vmlinux,这是一个elf可执行文件。② 然后 objcopy 成 arch/i386/boot/compressed/vmlinux.bin,去掉了原 elf 文件中一些无用的section等信息。③ gzip 后压缩为 arch/i386/boot…...

相关分析 - 肯德尔系数
肯德尔系数(Kendall’s Tau)是一种非参数统计方法,用于衡量两个变量之间的相关性。它是由统计学家莫里斯肯德尔(Maurice Kendall)在1938年提出的。肯德尔系数特别适用于有序数据,可以用来评估两个有序变量之…...

【咨询】企业数字档案馆(室)建设方案-模版范例
导读:本模版来源某国有大型医药行业集团企业数字档案馆(室)建设方案(一期300W、二期250W),本人作为方案的主要参与者,总结其中要点给大家参考。 目录 1、一级提纲总览 2、项目概述 3、总体规…...

selfClass 与 superClass 的区别
在 Objective-C 中,[self class] 和 [super class] 都用于获取对象的类信息,但它们在运行时的行为略有不同。理解它们的区别有助于更好地掌握 Objective-C 的消息传递机制和继承关系。让我们详细解释这两个调用的区别。 [self class] 当你在一个对象方…...

秒懂设计模式--学习笔记(6)【创建篇-建造者模式】
目录 5、建造者模式5.1 介绍5.2 建造步骤的重要性5.3 地产开发商的困惑5.4 建筑施工方5.5 工程总监5.6 项目实施5.7 建造者模式的各角色定义5.8 建造者模式 5、建造者模式 5.1 介绍 建造者模式(Builder)又称为生成器模式,主要用于对复杂对象…...

领略超越王勃的AI颂扬艺术:一睹其惊艳夸赞风采
今日,咱也用国产AI技术,文心一言3.5的文字生成与可灵的图像创作,自动生成一篇文章,提示语文章末下载。 【玄武剑颂星际墨侠】 苍穹为布,星辰织锦,世间万象,皆入我玄武剑公众号之浩瀚画卷。此号…...

Linux走进网络
走进网络之网络解析 目录 走进网络之网络解析 一、认识计算机 1.计算机的发展 2.传输介质 3.客户端与服务器端的概念 交换机 路由器 二、计算机通信与协议 1. 协议的标准化 2. 数据包的传输过程 OSI 协议 ARP协议 3. TCP/IP:四层模型 4. TCP三次握手和四次挥手…...

go语言Gin框架的学习路线(六)
gin的路由器 Gin 是一个用 Go (Golang) 编写的 Web 框架,以其高性能和快速路由能力而闻名。在 Gin 中,路由器是框架的核心组件之一,负责处理 HTTP 请求并将其映射到相应的处理函数上。 以下是 Gin 路由器的一些关键特性和工作原理的简要解释…...

Java面经知识点汇总版
Java面经知识点汇总版 算法 14. 最长公共前缀(写出来即可) Java 计算机基础 数据库 基础 SQL SELECT first_name, last_name, salary FROM employees WHERE department Sales AND salary > (SELECT AVG(salary)FROM employeesWHERE department Sal…...

详细分析Sql Server中的declare基本知识
目录 前言1. 基本知识2. Demo3. 拓展Mysql4. 彩蛋 前言 实战探讨主要来源于触发器的Demo 1. 基本知识 DECLARE 语句用于声明变量 声明的变量可以用于存储临时数据,并在 SQL 查询中多次引用 声明变量:使用 DECLARE 语句声明一个或多个变量变量命名&a…...