前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Boot 3 混元 Starter 创建指南

Spring Boot 3 混元 Starter 创建指南

原创
作者头像
花花Binki
发布2024-10-07 23:12:36
2581
发布2024-10-07 23:12:36
举报
文章被收录于专栏:岚的工作随笔
封面
封面

前言

有一天看面试题,他是这样问的:

普通jar包和starter包有什么区别? 续-> 如何创建一个starter?

大部分CRUD同学,包括笔者都没有做过相关项目,自然是不明所以的。有做过相关经验的可能会答出一二。如果是一些专门做第三方库的同学对于此题完全不在话下。

带着问题,我去和AI询问,得到的内容只是知道,但不够理解。比如:

可以自动配置 为什么要自动配置?什么场景下会自动配置?

直到最近,笔者在尝试接入AI到Spring中,才感受到了区别。

官方的调试Demo

代码语言:java
复制
            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注入上下文中。

代码语言:java
复制
@Configuration
public class HunyuanConfig {

    @Bean
    public HunyuanClient getHunyuanClient {
        // doSomeThing
    }
}

如果项目多起来,这样的Config就需要复制一遍又一遍,于是想起来Starter,约定大于配置。

开始制作 Starter

在正式开始之前,需要根据原SDK结构,找出可以自动配置的组件。于是得到下方SDK图解

参照hunyuan-java-sdk v3.1.1110
参照hunyuan-java-sdk v3.1.1110

实际上就是根据各种对象,组合成一条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。最终所需依赖如下:

代码语言:xml
复制
        <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自动发现

如果有之前Spring Boot 2.x源码的经验,可能会熟练的创建

META-INF/spring.factories

但在2.7版本,已经明确废弃该方案。

Spring Boot 2.7.0 M2 Release Notes
Spring Boot 2.7.0 M2 Release Notes

在3.0中,正确的方式是

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

目录结构
目录结构

内部只需要全路径+类名即可

com.binki.hunyuanspringbootstarter.config.HunyuanAutoConfiguration

代码语言:java
复制
@AutoConfiguration
public class HunyuanAutoConfiguration {

交给用户配置

完成上述步骤后,发现凭证所需的id与key写死在了程序中。想要将他交给用户自由设置,需要对属性进行再注入。于是,再写下一个Properties类:

代码语言:java
复制
@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中引入该类,需要再加入一点注释:

代码语言:java
复制
@AutoConfiguration
@EnableConfigurationProperties(HunyuanChatProperties.class)
public class HunyuanAutoConfiguration {
    // 属性注入
    private HunyuanChatProperties hunyuanChatProperties;

    // 构造方法注入
    public HunyuanAutoConfiguration(HunyuanChatProperties hunyuanChatProperties) {
        this.hunyuanChatProperties = hunyuanChatProperties;
    }

追加工具类

为了让上手更容易,可以对代码进行再封装。比如两个参数即可发送请求。

send(client, "java 冒泡排序");

还有,比如为魔术值定义常量类:

代码语言: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

成功的话,你会在你本地的仓库下发现它~

本地仓库
本地仓库
  • 密钥加密 官方的说明中,不建议直接写入。可以配置在环境变量里,java中使用System#getEnv 即可取得
  • 解决提示 新版Spring boot中,log包会冲突。如果出现提示可以自行排除官方SDK的log包。
代码语言:xml
复制
        <!-- 版本在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,仍在优化中。

https://github.com/BinkiOffer/hunyuan-spring-boot-starter

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 官方的调试Demo
  • 开始制作 Starter
    • 新建项目
      • 让Spring Boot自动发现
        • 交给用户配置
          • 追加工具类
            • 剩余工作
            • 写在最后
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档