API项目4:开发SDK

news2024/10/21 15:49:55

面临另一个问题

作为开发者,每次调用接口都需要自己生成时间戳,编写签名算法,生成随机数等等,这些都是相当繁琐的工作。

因此,要想办法让开发者能够以最简单的方式调用接口。开发者只需要关心传递哪些参数以及他们的密钥等信息就可以轻松地进行调用。

实际上,RPC(远程过程调用)就是为了实现这一目的而设计的。它就是追求简单化调用的理想情况。类似的例子是小程序开发或者调用第三方 API,如腾讯云的 API,它们都提供了相应的 SDK。

开发 SDK

Starter

现在的问题是如何开发这样一个 SDK?为了让开发者更方便使用 SDK,我们给它提供一个 starter

为什么需要 Starter?

理想情况:开发者只需要关心调用哪些接口、传递哪些参数,就跟调用自己写的代码一样简单。

开发 starter 的好处:开发者引入之后,可以直接在 application.yml 中写配置,自动创建客户端。

 

找到pom.xml,在这里看到引入 mybatis、redis、 swagger 接口文档的时候,都使用了 starter。

 使用 starter 之后,我们有哪些好处?

比如,对于 Redis 的 starter,我们可以直接在 application.yml 配置文件中进行相关配置。我们可以在配置文件中简单地定义一个连接到 Redis 的配置块。

Spring Configuration Processor:它的作用就是帮助开发者自动生成配置的代码提示。

好处是无需手动编写繁琐的配置代码或者创建客户端实例。通过引入适当的 starter,开发者可以直接在 application.yml 中进行配置,自动创建相应的客户端。

使得开发过程更加简单便捷,无需过多关注底层实现细节,而是专注于配置和使用

Starter 开发流程

开发

创建一个新项目 —— 项目名:suapi-client-sdk

选择依赖:Lombok、Spring Configuration Processor 

下面这个东西要删掉,不然会报错(一定要删掉);

这个是 maven 构建项目的方式,我们现在是要构建依赖包,而不是直接运行 jar 包的项目。

项目之默认会生成一个 Spring Boot 的主类。我们并不打算运行一个 Web 项目,而是提供一个现成的客户端对象给用户使用。删掉主类,创建配置类。

目标是为用户生成一个可用的客户端对象,我们希望用户能够通过引入 starter 的方式直接使用客户端,而不需要手动创建,所以我们需要编写一个配置类。

在配置类中打上几个注解,加上两个参数accessKey secretKey。

// 通过 @Configuration 注解,将该类标记为一个配置类,告诉 Spring 这是一个用于配置的类
@Configuration
// 能够读取application.yml的配置,读取到配置之后,把这个读到的配置设置到我们这里的属性中,
// 这里给所有的配置加上前缀为"suapi.client"
@ConfigurationProperties("suapi.client")
// @Data 注解是一个 Lombok 注解,自动生成了类的getter、setter方法
@Data
// @ComponentScan 注解用于自动扫描组件,使得 Spring 能够自动注册相应的 Bean
@ComponentScan
public class SuApiClientConfig {
    private String accessKey;
    
    private String secretKey;
}

现在我们要给用户提供 ApiClient,把 suapi-interface 项目中的 client包、model包、utils包复制

粘贴到 suapi-client-sdk 项目中。

回到 suapi-client-sdk 项目 中的 SuApiClientConfig配置类, 写一下生成客户端的方法。

这个地方不像之前在 suapi-interface 项目中写死在 Main.java 里,只是测试。

现在就是通过读取这个配置拿到这两个值。用这两个值去得到这样一个客户端实例。

现在,如果我们引入这个库并配置好了 accessKey 和 secretKey 的相关属性,Spring Boot 将自动为我们生成一个客户端对象。然后,我们可以在项目中使用这个对象了。

还要做一件事情

①在 resources 目录下创建一个目录 META-INF

②在 META-INF 目录创建一个文件 spring.factories

spring.factories:定义了 Spring Boot 的自动配置。它是一个标准的 Java Properties 文件,用于指定要自动配置的类。这个文件中的每一行都是一个配置项,包含两个部分:配置项的全限定类名和对应的自动配置类。它们之间使用等号(=)进行分隔。在 Spring Boot 应用启动时,它会加载这个 spring.factories 文件,并根据其中的配置项自动进行相应的配置。

③在 spring.factories文件内编写配置项为自动引入配置的类。 

上述配置项指定了要自动配置的类 

Spring Boot 将会在应用启动时自动加载和实例化 YuApiClientConfig,并将其应用于我们的应用程序中。我们就可以使用自动配置生成的 suApiClient 对象,而无需手动创建和配置

install

点击右侧菜单栏中的 maven,点击 Lifecycle → install,把它安装为本地的依赖。

使用

来到 interface 项目

引入我们写好的依赖

点击 application.yml 进行配置 

编写测试方法 

@SpringBootTest
class SuapiInterfaceApplicationTests {

    @Resource
    private SuApiClient suApiClient;

    @Test
    void contextLoads() {
        // 调用suApiClient的getNameByGet方法,并传入参数,将返回的结果赋值给result变量
        String result = suApiClient.getNameByGet("sujie");
        // 创建一个User对象
        User user = new User();
        // 设置User对象的username属性
        user.setUsername("sujie");
        // 调用yuApiClient的getUserNameByPost方法,并传入user对象作为参数,将返回的结果赋值给usernameByPost变量
        String usernameByPost = suApiClient.getUserNameByPost(user);
        // 打印result变量的值
        System.out.println(result);
        // 打印usernameByPost变量的值
        System.out.println(usernameByPost);

    }

}

无敌大踩坑!!!

@ComponentScan不会自动创建带有 @ConfigurationProperties注解的类的 bean

@EnableConfigurationProperties 确保 @ConfigurationProperties 类能够正确处理,在 Spring Boot 应用启动阶段,起到激活和管理的作用。

为什么?

@ComponentScan不会自动创建带有@ConfigurationProperties注解的类的 bean 主要有以下原因:

一、设计目的不同

1. @ComponentScan的主要目的是扫描并注册带有特定注解(如@Component、@Service、@Repository等)的类作为 Spring 的组件。这些注解通常标识的是业务逻辑相关的类或者服务类,它们在应用中扮演着具体的角色,如处理业务逻辑、提供数据访问等。

2. @ConfigurationProperties主要用于将外部配置属性绑定到一个 Java 对象上,它的重点在于属性的绑定和配置管理,而不是作为一个独立的业务组件被自动注册。

二、职责分离

Spring 框架遵循了职责分离的原则。@ComponentScan专注于发现和注册业务相关的组件,而配置属性的处理通常需要额外的步骤来确保正确的绑定和验证。如果@ComponentScan自动创建带有@ConfigurationProperties的类的 bean,可能会导致一些不确定性和潜在的错误。

例如,如果一个配置属性类被错误地自动注册为 bean,可能会在应用中引起意外的行为,尤其是当这个类的作用和预期的业务组件不同时。

三、灵活性考虑

不自动创建@ConfigurationProperties类的 bean 给予了开发者更多的灵活性。开发者可以根据具体的需求选择是否将配置属性类注册为 bean。如果需要将其作为一个 bean 使用,可以通过添加@Component注解或者使用@EnableConfigurationProperties注解来明确地进行注册,这样可以更好地控制应用的配置和行为。

解决方法

在xxxInterfaceApplication启动类上

加@EnableConfigurationProperties(xxxApiClientConfig.class)

总结

开发一个 starter 关键步骤只有几个。

首先确认所需依赖。

然后写 META-INF,指定配置注册类。

通过这个注解来读取到配置信息。

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

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

相关文章

如何通过计算巢在阿里云一键部署FlowiseAI

什么是FlowiseAI FlowiseAI 是一个开源的低代码开发工具,专为开发者构建定制的语言学习模型(LLM)应用而设计。 通过其拖放式界面,用户可以轻松创建和管理AI驱动的交互式应用,如聊天机器人和数据分析工具。 它基于Lang…

网站分享 | 六个插件搜索下载网站

网站分享: 今天分享几个搜索插件的网站。 🔧 Chrome Web Store —— 官方插件库,选择最多 谷歌官方的 Chrome 插件商店,拥有丰富的插件供你选择。无论你是办公党、学生党,还是娱乐爱好者,这里都能找到提…

第 4 章:Vue 中的 ajax

1. 解决开发环境 Ajax 跨域问题 vue脚手架配置代理 原理图: 1.1 方法一 在vue.config.js中添加如下配置: devServer:{proxy:"http://localhost:5000" // 这个5000 是请求目标的端口号 }说明: 优点:配置简单&…

杰理AC632N---发射功率问题

AC632N的发射功率SDK默认0dbm左右,在实际做产品时,如果使用SDK默认的发射功率,则测试到的发射功率达不到规格书上面的8dbm. 查看代码流程发现SDK中修改发射功率的文职如下: 修改到level 10 则是最大功率8dbm , 使用频谱仪可以测得…

OpenAI 最新发布的 o1 模型在 ARC-AGI-Pub 数据集上的测试结果与分析

在过去的24小时内,我们有幸获得了 OpenAI 新发布的 o1-preview 和 o1-mini 模型的使用权限。这些模型经过特别训练,旨在模拟推理过程,并在给出最终答案之前给予更多时间生成和修正推理步骤。 成百上千的人都在问,o1 在 ARC 奖项上…

linux线程 | 线程的控制(一)

前言:本节内容为线程的控制。在本篇文章中, 博主不仅将会带友友们认识接口, 使用接口。 而且也会剖析底层,带领友友们理解线程的底层原理。 相信友友们学完本节内容, 一定会对线程的控制有一个很好的把握。 那么&#…

Gin框架官方文档详解03:HTML渲染

官方文档:https://gin-gonic.com/zh-cn/docs/ 注:强烈建议没用过Gin的读者先阅读第一节:第一个Gin应用。 目录 一、简单渲染二、使用不同目录下名称相同的模板三、自定义模板渲染器四、自定义分隔符五、自定义模板函数六、总结 一、简单渲染 …

数通--5

一、链路聚合 背景:带宽不够,加线,但是stp判断是环路,阻塞,等于没加线。通过链路聚合解决(如果我把千兆换成万兆,老子有钱任性的话,没得说) 现在我要的不是备份而是带宽…

电能表预付费系统-标准传输规范(STS)(4)

5.4 TokenCarrier 到 MeterApplicationProcess 的数据流 The flow of data from the TokenCarrier to the MeterApplicationProcess is shown in Figure 4.此数据流见图 4。 图 4 TokenCarrier 到 MeterApplicationProcess 的数据 The token entry process from the TokenCarr…

抢单超卖? 并发问题解决思路

1. 问题介绍 在用户抢单或者商品售卖的过程中,正常情况下是一人一件,但是当网络流量剧增时多个用户同时抢到一个商品应该如何分配?假设这样一个场景A商品库存是100个,但是秒杀的过程中,一共卖出去500个A商品。对于卖家…

AXI GPIO按键控制——ZYNQ学习笔记4

一、AXI GPIO接口简介 是什么?是PL部分的一个IP软核,实现通用输入输出接口的功能,并通过AXI协议实现与处理系统通信,方便控制与拓展GPIO接口。 AXI GPIO IP 核为 AXI 接口提供了一个通用的输入/输出接口。 与 PS 端的 GPIO 不同&…

【YOLO系列】YOLO11原理和深入解析——待完善

文章目录 前言一、主要新增特性二、主要改进2.1 C3K2网络结构2.2 C2PSA网络结构2.3 Head部分 三、对比与性能优势四、X-AnyLabeling4.1 目标检测:4.2 实例分割:4.3 图像分类:4.4 姿态估计:4.5 旋转目标检测: 五、总结 …

Vue+Vant实现7天日历展示,并在切换日期时实时变换

效果图&#xff1a; 主要使用 moment.js 插件完成 HTML部分 <div class"day-content"><div class"day-content-t"><div>{{ monthVal }}</div><div click"onCalendar()">更多>></div></div><…

HTTP vs WebSocket

本文将对比介绍HTTP 和 WebSocket &#xff01; 相关文章&#xff1a; 1.HTTP 详解 2.WebSocket 详解 一、HTTP&#xff1a;请求/响应的主流协议 HTTP&#xff08;超文本传输协议&#xff09;是用于发送和接收网页数据的标准协议。它最早于1991年由Tim Berners-Lee提出来&…

【C++】二叉搜索树的概念与实现

目录 二叉搜索树 概念 key类型 概念 代码实现 key_value类型 概念 代码实现 二叉搜索树 概念 ⼆叉搜索树⼜称⼆叉排序树&#xff0c;它或者是⼀棵空树&#xff0c;或者是具有以下性质的⼆叉树: 左子树的值默认小于根节点&#xff0c;右子树的值默认大于根节点 。 ⼆…

具备技术三:通用类型any实现

一、背景 一个连接必须拥有请求接收与解析的上下文。 上下文的结构不能固定&#xff0c;因为服务器支持的协议很多&#xff0c;不同协议有不同的上下文结构&#xff0c;所以必须拥有一个容器保存不同的类型结构数据。 二、设计思路 目标&#xff1a;一个容器保存各种不同数…

opencv学习:CascadeClassifier和detectMultiScale算法进行人脸识别

CascadeClassifier CascadeClassifier 是 OpenCV 提供的一个用于对象检测的类&#xff0c;它基于Haar特征和AdaBoost算法。它能够识别图像中的特定对象&#xff0c;比如人脸、眼睛、微笑等。CascadeClassifier 需要一个预训练的XML分类器文件&#xff0c;该文件包含了用于检测…

SHA1算法学习

SHA-1&#xff08;安全哈希算法1&#xff09;是一种加密哈希函数&#xff0c;它接受一个输入并生成一个160位&#xff08;20字节&#xff09;的哈希值&#xff0c;通常表示为一个40位的十六进制数。 SHA1的特点 输入与输出&#xff1a;SHA-1可以接受几乎任意大小的输入&#…

21世纪20年代最伟大的情侣:泰勒斯威夫特和特拉维斯凯尔西每张照片都在秀恩爱

在时代的长河中&#xff0c;每一代都毫无例外地拥有属于自己的 it couple&#xff08;当红情侣&#xff09;&#xff0c;他们成为了那个特定时期大众瞩目的焦点和津津乐道的话题。 千禧年间&#xff0c;确实涌现出了诸多令人瞩目的情侣组合。就像汤姆克鲁斯和凯蒂霍尔姆斯&…

【H2O2|全栈】更多关于HTML(2)HTML5新增内容

目录 HTML5新特性 前言 准备工作 语义化标签 概念 新内容 案例 多媒体标签 音频标签audio 视频标签 video 新增部分input表单属性 预告和回顾 后话 HTML5新特性 前言 本系列博客是对入门专栏的HTML知识的补充&#xff0c;并伴随一些补充案例。 这一期主要介绍H…