共计 3746 个字符,预计需要花费 10 分钟才能阅读完成。
敬爱的 Javaer 们,在平时编码的过程中,你是否曾想过编写一个 Java 框架去为开发提效?然而要么编写框架时感觉无从下手,不晓得从哪开始。要么有思路了后对某个性能实现的技术细节不理解,空有想法而无奈实现。如果你遇到了这些问题,看完这篇文章你也能用 ChatGPT 编写一个简略的 JAVA 框架。
构思清晰
首先,你须要明确你的框架要解决什么问题,具备什么个性。这将有助于 ChatGPT 更好的了解你的需要。
例如:我在一个前后端拆散的需要中发现有太多的枚举类的形容须要给前端返回。传统的形式是后端依据枚举类的映射,每个枚举值编写代码映射成形容给前端返回。但这次需要须要给前端返回的枚举形容太多了。这让我和我的小伙伴们感觉无从下手。所以我就思考是否编写一个注解主动帮咱们扫描这些枚举类,而后生成 key 和形容的 map,最终放到容器中去呢?
解决问题:解决前后端拆散过程中须要手动编写代码将枚举 key 的形容映射给前端。
个性:框架有一个注解,注解有三个字段 name,key,和 desc,润饰在枚举类上。框架需提供内部获取枚举 map 的接口。
与 ChatGPT 交换
启动 ChatGPT,向它讲述你的构想和需要。它能够为你生成初始代码、提供构造倡议,甚至帮你解决一些逻辑。
想好了框架要解决的问题和框架的个性之后,接下来就要将框架要解决的问题和个性给总结成一段文字发给 ChatGPT
chatgpt 依据我的需要大略生成了下框架的 demo 版本。能够看到和我构想的还是有些区别的,我想是将枚举放在类上。而后枚举的属性有 name,key,和 desc。
name:代表枚举 map 在最外层 map 中的 key。
key:代表枚举的 key 或值字段。
desc:代表枚举的形容字段。
深刻互动
与 ChatGPT 进行更深刻的交换,询问它对于代码优化、异样解决等方面的倡议。它能够帮你找到更好的解决方案。
接下来须要与 ChatGPT 进一步交换,让 ChatGPT 将之前生成的代码进行优化。
EnumInfo 注解优化前:
优化后:
逐步完善
逐渐疏导 chatgpt 欠缺框架
在 ChatGPT 的帮忙下,逐步完善你的框架。亲自动手编写代码,与 ChatGPT 一起探讨每个细节。
最初能够和 ChatGPT 一步步交换,让它帮你构建一个残缺的框架。
最终缓缓与 ChatGPT 一直对话迭代之后将框架的外围类生成,迭代过程因为太长故省略。
框架外围类阐明
在 ChatGPT 给出外围代码之后,我参考 Spring 模块设计最终初版框架类如下:
PackageScanner:用于扫描给定包中带有指定注解的类的实用工具类。
PropertiesUtils:提供操作属性文件的实用办法的工具类。
EnumInfo:用于标注枚举类的注解,指定枚举项的名称、key 字段和 desc 字段信息。通过在枚举类上增加该注解,能够为枚举项建设索引映射,并指定用于查找 key 和 desc 的字段名称。
EnumContext:枚举上下文类,用于治理枚举定义信息并提供获取枚举信息的办法。
EnumContextFactory:枚举上下文工厂类,用于创立和获取单例的枚举上下文对象。
EnumDefinition:示意枚举定义的类,用于存储枚举类的信息。
EnumDefinitionRegistry:枚举定义注册接口,用于注册、查问和治理枚举定义。
DefaultEnumFactory:默认的枚举定义工厂类,实现了 EnumDefinitionRegistry 接口。
看到这应用 ChatGPT 编写框架局部曾经实现了。大件能够应用 chatgpt 开发本人的 JAVA 框架。但要想把框架理论利用到生产还须要做一些收尾流程。
框架应用测试
在于 ChatGPT 交换,实现框架编写之后须要将框架利用到理论我的项目中。
笔者业务系统管理端在进行前后端拆散的过程中,研发们发现有许多枚举类对应的枚举形容须要给前端返回。
1)一开始构想的是每个枚举类都写代码给前端封装返回文字。然而因为笔者业务系统配置项过多,每个配置项都写代码太过麻烦。
2)于是研发们想是否应用一个对立的接口给前端返回枚举类对应的形容,前端只须要输出枚举类名称就能够取得对应的枚举 key 和形容的映射关系。
于是咱们创立了一个接口,定义了一个 Map 对象给前端返回枚举类的 key 和形容的对应关系。然而因为笔者业务零碎的渠道配置还是太多了。应用这种形式咱们须要初始化这个 Map。初始化 Map 代码如下:
public HashMap<String, Map<Integer, String>> initEnumMap() {enumMap = new HashMap<>();
enumMap.put("前端获取枚举 map 的 key", XXXEnum.getEnumMap());
enumMap.put("前端获取枚举 map 的 key", XXXEnum.getEnumMap());
enumMap.put("前端获取枚举 map 的 key", XXXEnum.getEnumMap());
...
return enumMap;
}
可见,每新增一个枚举类。咱们都须要在动态代码块中将映射关系放入 map 中。并且枚举类须要新增一个获取 key 和形容的映射关系办法。这样还是太麻烦了。并且后续新增映射关系还得更改这个类的代码。
是否将 map 初始化的步骤和枚举类创立 map 的步骤省略呢?
3)于是咱们构想定义一个注解。应用这个注解标记的类,框架扫描这些类。并生成获取枚举 key 和形容的映射关系的办法。最终实现初始化 Map 的过程。对外只提供获取总枚举 Map 的办法即可。用户无需关怀 Map 如何构建。应用这个框架之后,笔者业务零碎这个接口的代码如下:
/**
* 获取枚举
*
* @param enumKey 枚举 key
* @return 返回值 Map<Integer,String>;code, 形容
*/
@RequestMapping("/getEnum")
public Result<Map<String, Map<String, String>>> getEnum(String enumKey) {
try {
// 获取枚举上下文对象
EnumContext enumContext = EnumContextFactory.getEnumContext();
// 获取枚举 map
newEnumMap = enumContext.getEnumIndexMap();
// buid 映射从 ducc 中获取,所以须要手动设置
newEnumMap.put(BUID.getKey(), getBuIdMap());
} catch (Exception e) {log.error("获取枚举 map 出错!enumKey:{}", enumKey, e);
return Result.createFail(e.getMessage());
}
// 如果枚举 key 为空则返回全副
if (StringUtils.isBlank(enumKey)) {return Result.createWithSuc(newEnumMap);
}
// 如果枚举 key 不为空则返回指定值
Map<String, Map<String, String>> resultMap = new HashMap<>();
resultMap.put(enumKey, newEnumMap.get(enumKey));
return Result.createWithSuc(resultMap);
}
4)注解类代码如下:
在这举个测试枚举类的例子
@EnumInfo(name = "StatusEnum", key = "code", desc = "description")
public enum StatusEnum {SUCCESS(200, "Success"),
ERROR(500, "Error");
private final int code;
private final String description;
StatusEnum(int code, String description) {
this.code = code;
this.description = description;
}
public int getCode() {return code;}
public String getDescription() {return description;}
}
当前新增一个枚举类只须要标记 @EnumInfo(name = “StatusEnum”, key = “code”, desc = “description”)。将枚举类的 name,key 字段名称和形容字段名称指定即可。无需批改接口的代码即可给前端返回该枚举的 key 和形容的映射关系。极大的缩小了研发联调工夫及测试回归工夫。
框架性能压测
框架利用到理论生产我的项目中,须要对 ChatGPT 辅助编写的框架进行充沛的测试验证。同时也要对框架的性能进行测试,晓得框架的瓶颈。常见的接口压测工具有 LoadRunner 和 Apache JMeter 等。任选一种压测工具进行压测即可。
笔者将框架利用到我的项目中对外裸露了一个接口,该接口在 4C4G 机器配置下,单机最高可反对 1000QPS,在 1000QPS 下,单机 CPU 使用率达到 30%,零碎负载靠近 0.9,内存使用率与压测前无显著变动。
作者:京东批发 王凤玺
起源:京东云开发者社区 转载请注明起源