有一天看面试题,他是这样问的:
普通jar包和starter包有什么区别? 续-> 如何创建一个starter?
大部分CRUD同学,包括笔者都没有做过相关项目,自然是不明所以的。有做过相关经验的可能会答出一二。如果是一些专门做第三方库的同学对于此题完全不在话下。
带着问题,我去和AI询问,得到的内容只是知道,但不够理解。比如:
可以自动配置 为什么要自动配置?什么场景下会自动配置?
直到最近,笔者在尝试接入AI到Spring中,才感受到了区别。
Credential cred = new Credential("SecretId", "SecretKey");
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("hunyuan.tencentcloudapi.com");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
HunyuanClient client = new HunyuanClient(cred, "", clientProfile);
ChatCompletionsRequest req = new ChatCompletionsRequest();
ChatCompletionsResponse resp = client.ChatCompletions(req);
// 省略输出代码
随着输入控制台中间部分的参数,代码会自动增加逻辑。
如果是自己想根据示例将“AI”融入项目中,大概率会封装HunyuanClient成Bean注入上下文中。
@Configuration
public class HunyuanConfig {
@Bean
public HunyuanClient getHunyuanClient {
// doSomeThing
}
}
如果项目多起来,这样的Config就需要复制一遍又一遍,于是想起来Starter,约定大于配置。
在正式开始之前,需要根据原SDK结构,找出可以自动配置的组件。于是得到下方SDK图解
实际上就是根据各种对象,组合成一条API。突破口就在最左侧。
在 Spring 官方文档中,可以搜到一篇名为Creating Your Own Auto-configuration,在阅读翻译的过程中,我将文档整理了一份,可以参考:Spring boot 如何构建自定义的 Starter
Stater 项目虽然依赖自Spring Boot,但并不能使用脚手架构建。归根结底,他只不过是一个Jar包,由于满足了Spring规则,会在启动时自动配置。
所以,使用Maven 初始化一个简单的项目即可。
关于命名,最新版的守则中,是这样说,如果你的项目叫acme,那么名字就叫acme-spring-boot-starter。因为是为混元大模型构建的项目,所以就叫他hunyuan-spring-boot-starter。
一定要含有spring-boot-starter,如果是子项目,那么在父工程中就需要引入。
由于考虑到本项目需要一些自动配置项,所以还需要引入autoconfigure。最终所需依赖如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure-processor</artifactId>
<version>${spring-boot.version}</version>
<optional>true</optional>
</dependency>
springboot依赖为最新的3.3.4
如果有之前Spring Boot 2.x源码的经验,可能会熟练的创建
META-INF/spring.factories
但在2.7版本,已经明确废弃该方案。
在3.0中,正确的方式是
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
内部只需要全路径+类名即可
com.binki.hunyuanspringbootstarter.config.HunyuanAutoConfiguration
@AutoConfiguration
public class HunyuanAutoConfiguration {
完成上述步骤后,发现凭证所需的id与key写死在了程序中。想要将他交给用户自由设置,需要对属性进行再注入。于是,再写下一个Properties类:
@ConfigurationProperties(HunyuanChatProperties.CONFIG_PREFIX)
public class HunyuanChatProperties {
public static final String CONFIG_PREFIX = "spring.ai.hunyuan.chat";
/** 密钥id */
private String secretId;
/** 密钥 */
private String secretKey;
// getter setter
在application.properties中就有提示了。
想在Config中引入该类,需要再加入一点注释:
@AutoConfiguration
@EnableConfigurationProperties(HunyuanChatProperties.class)
public class HunyuanAutoConfiguration {
// 属性注入
private HunyuanChatProperties hunyuanChatProperties;
// 构造方法注入
public HunyuanAutoConfiguration(HunyuanChatProperties hunyuanChatProperties) {
this.hunyuanChatProperties = hunyuanChatProperties;
}
为了让上手更容易,可以对代码进行再封装。比如两个参数即可发送请求。
send(client, "java 冒泡排序");
还有,比如为魔术值定义常量类:
public class Model {
public final static String TURBO = "hunyuan-turbo";
public final static String PRO = "hunyuan-pro";
public final static String STANDARD = "hunyuan-standard";
使用IDEA的一键操作或者用maven 命令:
mvn clean install
成功的话,你会在你本地的仓库下发现它~
System#getEnv
即可取得 <!-- 版本在maven生效需要时间,如获取不到对应的版本,可以调低版本号 -->
<dependency>
<groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java-hunyuan</artifactId>
<version>3.1.1110</version>
<!-- 消除提示:Standard Commons Logging discovery in action with spring-jcl -->
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
经过一番洗礼,对于需要自动配置的东西和混元SDK都有了认知。希望本文对您有所帮助。
本篇所用工程已经发布到github,仍在优化中。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。