
后端认证鉴权企业应用【免费下载链接】hsweb-frameworkhsweb (haʊs wɛb) 是一个基于spring-boot 2.x开发 ,首个使用全响应式编程的企业级后台管理系统基础项目。项目地址https://gitcode.com/gh_mirrors/hs/hsweb-framework点击查看免费下载hsweb-core是 hsweb-framework 的基础模块定位是系统核心、通用工具提供了整个框架中被反复依赖的三件高频工具基于字节码生成的高效 Bean 复制器FastBeanCopier、基于枚举实现的数据字典体系EnumDict以及支持字段脱敏的ToString工具。读完本篇你将掌握这三个工具的完整用法、存储与序列化的底层约定以及它们在hsweb-core源码中的实现原理从而在企业级后台项目中直接落地复制、字典、脱敏三类通用能力。一、模块定位hsweb-core/README.md 将本模块概括为系统核心、通用工具等。从源码目录结构看见 org/hswebframework/web模块内容覆盖 Bean 操作bean包、数据字典dict包、上下文context包、i18n、ID 生成器、事件、异常分析与回收器等是hsweb-commons、hsweb-authorization、hsweb-system等上层模块的公共底座。本篇聚焦 README 中明确列出的三个核心能力Bean 复制、数据字典与 ToString。二、FastBeanCopier高性能 Bean 复制基本用法README 给出的核心 API 只有两行即可覆盖绝大多数复制场景源码见 FastBeanCopier.java//将source对象中的属性复制到target中. FastBeanCopier.copy(source, target); //将source对象中的属性复制到target中.不复制id字段 FastBeanCopier.copy(source, target, id);copy的第三个参数String... ignore用于排除不需要复制的属性内部会转换为SetString后传入复制逻辑FastBeanCopier.java#L108-L130。除最简形式外源码还提供了一组重载copy(S source, ClassT target, String... ignore)自动实例化目标对象后复制copy(S source, SupplierT target, String... ignore)通过 Supplier 提供目标对象copy(S source, T target, Converter converter, String... ignore)自定义类型转换器。Cloneable 约定README 特别强调——如果属性类实现了Cloneable接口复制时会调用其clone()方法因此实现了Cloneable就必须重写clone方法并声明为public。这一点在源码中可以直接印证ClassProperty.createGetterFunction()在源与目标类型相同时若类型实现了Cloneable生成的复制代码就是getter().clone()FastBeanCopier.java#L592-L602。原理javassist 动态生成复制类而非反射README 的概括是使用工具类Proxy通过javassist去动态构造一个类通过原生的方式调用 get/set 方法而不是通过低效的反射。落到源码上这条链路是缓存查找FastBeanCopier持有静态ConcurrentHashMapCacheKey, Copier CACHE以源类型 目标类型组成的CacheKey为键FastBeanCopier.java#L42-L44。getCopier(source, target, true)通过computeIfAbsent保证同一对类型只会动态生成一次 Copier后续调用直接命中缓存因此首次构建、后续零反射。代码拼装createCopierCode遍历源类与目标类的PropertyDescriptor要求读、写方法均存在并按声明字段顺序排序为每个同名字段生成形如if(!ignore.contains(xx)){ target.setX(source.getX()); }的纯 Java 代码片段FastBeanCopier.java#L372-L444。字节码生成Proxy.java 是一个URLClassLoader构造函数中用 javassist 的ClassPool.makeClass创建以类名$ProxyN命名的新类Proxy.java#L115-L153addMethod(code)将上一步拼出的代码作为方法注入Proxy.java#L155-L160最后getTargetClass()调用toBytecode()并用defineClass完成加载Proxy.java#L253-L267。由此得到一次编译期开销换运行期纯方法调用的设计这也是其相对BeanUtils.copyProperties每次反射在批量场景下的优势来源。源码中的扩展能力README 未展开、但源码已实现并值得知道的能力包括类型转换当源字段与目标字段类型不一致时生成的代码会调用converter.convert(value, targetType, genericType)。默认实现DefaultConverterFastBeanCopier.java#L760-L949支持Date与字符串/数字互转、字符串按逗号拆分转集合、数字解析、枚举含EnumDict按值或名称匹配、数组构造、集合泛型逐项转换、Bean 转 Map、以及最终兜底的 Apache Commons BeanUtils 转换器。这对应了 README 中支持复杂结构、类型转换、集合泛型的说法。Bean 与 Map 互转source或target为Map时直接走putAll/逐键写入路径FastBeanCopier.java#L138-L150对易扩展对象Extendable还包装了ExtendableToMapCopier、MapToExtendableCopier、ExtendableToBeanCopier可将多余字段写入扩展区FastBeanCopier.java#L256-L262。Record 支持JDK 14 的 record 不可变源码单独维护了RECORD_CACHE与RecordCopier按组件名重新构造新实例FastBeanCopier.java#L157-L194。冷启动并发测试类 FastBeanCopierColdStartContentionTest.java 专门验证多线程并发首次copy时缓存构建的正确性常规功能则由 FastBeanCopierTest.java、FastBeanCopierBeanTest.java 覆盖可作为行为基准参考。三、数据字典用枚举定义并管理字典定义枚举字典README 的标准做法是定义一个枚举并实现EnumDict接口AllArgsConstructor Getter Dict(value data-status) //定义一个id,默认为由枚举类名转换而来 public enum DataStatusEnum implements EnumDictByte { ENABLED((byte) 1, 正常), DISABLED((byte) 0, 禁用), LOCK((byte) -1, 锁定), DELETED((byte) -10, 删除); private Byte value; private String text; }说明Dict注解Dict.java的属性为value字典 ID、alias别名与comments备注可用于方法、字段或类型。不显式指定 ID 时DefaultDictDefineRepository.parseEnumDict 会将枚举简单名按驼峰转下划线、下划线换连字符生成 ID如DataStatusEnum→data-status并把类名本身作为别名。在实体中使用单选与多选Data public class User { private String id; //单选 private DataStatusEnum status; //多选 private DataStatusEnum[] statusArr; }README 明确了三种存储约定这也是使用枚举字典前必须理解的规则单选持久化时自动存储字典的value值数据库字段类型应与value字段类型一致上例为字节型数字。多选且选项数小于 64 个值会经过位运算EnumDict的 mask 机制后以单个数字存储查询也用位运算过滤例如where().in(statusArr, 0, -1)生成where status_arr {bit} ! {bit}形式的 SQL因此数据库字段应为数字类型。选项数大于等于 64 个需要自行实现存储与查询可改用中间表或采用hsweb-system/hsweb-system-dictionary模块的实现。需要注意 README 的限定第 1、2 项的持久化行为由 hsweb 自带的 dao 实现负责完成如果项目没有使用该 dao 层则只会用到字典的模型与序列化能力。位运算 API 与 64 项上限EnumDict.java 中每个选项的掩码由getMask() 1L index()决定index()默认取ordinal()。这带来一条硬约束枚举选项数量不得超过 64 个且定义顺序不能随意变动源码 Javadoc 中也有相同警告。常用静态方法如下方法语义toMask(dict...)将若干选项合并为一个 maskin(target, dict...)目标值是否包含任一给定选项选项 ≥64 时自动退化为集合包含判断maskIn(mask, dict...)mask 是否全部包含给定选项maskInAny(mask, dict...)mask 是否至少包含一个给定选项getByMask(type, mask)由存储值还原选项列表选项 ≥64 时抛出UnsupportedOperationExceptionfindByValue / findByText / find按值、文本或宽松匹配查找返回Optional此外eq(Object)提供宽松的等价判断同一对象、值相等、数字忽略类型、value/text 忽略大小写、支持集合/Map 入参可推断它被广泛用于参数绑定与查询比较场景EnumDict.java#L94-L124。JSON 序列化约定EnumDict默认在序列化为 JSON 时以对象形式输出{value:..., text:...}text 会走 i18n 解析对应JsonValue标注的getWriteJSONObject()EnumDict.java#L305-L317。如需改回只输出 value的紧凑形式可以通过 JVM 参数关闭java -jar -Dhsweb.enum.dict.disableWriteJSONObjecttrue反序列化方向则由内置的EnumDictJSONDeserializer处理同时适配 fastjson 与 Jackson支持数字按值或 ordinal、字符串按 value/name/text忽略大小写、对象取value键回退text键等形态无法匹配时在参数绑定场景抛出ValidationException。EnumDictTest.java 验证了E1、e1、0三种输入都能正确还原为TestEnum.E1。国际化字典 I18nEnumDict若字典文本需要多语言可实现 I18nEnumDict.java其getI18nCode()默认返回全限定类名.枚举名并按resources/i18n/{path}/{name}_zh_CN.properties约定加载消息文件例如com.domain.dict.DeviceState.online在线约定中{name}不能包含下划线且不同文件不能完全重名见该接口 Javadoc 中的正反示例。字典注册DictDefineRepositoryREADME 指出所有的字典都会注册到DictDefineRepository可通过此类去获取字典以提供给前端或者其他地方使用。 默认实现 DefaultDictDefineRepository.java 用ConcurrentHashMap按 ID 保存解析结果提供响应式的getDefine(id)Mono与getAllDefine()Flux前端字典下拉、表单校验等能力即以此为数据源。四、ToStringBean 转字符串与字段脱敏ToString.java 提供Bean 转 String的能力包括字段脱敏打码。README 的标准用法Getter Setter public class MyEntity { //敏感字段,在ToString的时候会给字段打码.比如: 185*****234 org.hswebframework.web.bean.ToString.Ignore private String userPhone; public String toString() { return org.hswebframework.web.bean.ToString.toString(this); } }结合源码可以补充以下细节Ignore注解支持打在类或字段上cover()默认true脱敏遮盖value()可指定额外忽略的属性类级标注可让整个类型的字段默认被处理ToString.java#L38-L47。默认行为DEFAULT_FEATURE启用了coverIgnoreProperty排除字段用*遮盖与nullPropertyToEmptynull 字符串转、null 集合转[]两项ToString.java#L15-L19可通过类/字段上的Features注解调整。Feature 全集empty、ignoreNullProperty、nullPropertyToEmpty、coverIgnoreProperty、disableNestProperty关闭嵌套对象递归 toString、jsonFormat、writeClassnameToString.java#L56-L105。脱敏算法默认 Operator DefaultToStringOperator.java 对标记字段调用coverString(str, 80)保留约 80% 的字符、中间打码如18502314087 185****087每个类型的 Operator 通过静态cache缓存避免重复构建属性描述符。典型落地场景是把日志打印、异常信息中的实体对象统一收敛到toString(this)敏感字段自动脱敏避免手机号、姓名等信息在日志中裸露。五、适用前提小结三个工具均为hsweb-core的静态工具/接口不依赖 Spring 容器即可完成复制与字典判断setBeanFactory允许注入自定义BeanFactory以控制目标对象实例化FastBeanCopier.java#L59-L62。枚举字典的数据库 value 存储与位运算查询依赖 hsweb 自带的 dao 实现未使用时仅模型、比较与 JSON 序列化能力可用。多选位运算方案要求选项数小于 64 且顺序稳定超限场景请改用中间表或hsweb-system/hsweb-system-dictionary方案。版本行为请以当前仓库源码为准本文所有路径均位于 hsweb-core 模块内可直接对照阅读。赞分享后端认证鉴权企业应用【免费下载链接】hsweb-frameworkhsweb (haʊs wɛb) 是一个基于spring-boot 2.x开发 ,首个使用全响应式编程的企业级后台管理系统基础项目。项目地址https://gitcode.com/gh_mirrors/hs/hsweb-framework点击查看免费下载相关推荐终极指南如何高效集成hsweb-framework的权限、字典与文件管理模块终极指南如何高效集成hsweb framework的权限、字典与文件管理模块 hsweb framework是一个基于spring boot 2.x开发的企业后端认证鉴权企业应用企业级数据字典终极指南hsweb-framework如何实现数据标准化管理企业级数据字典终极指南hsweb framework如何实现数据标准化管理 在当今企业级应用开发中数据字典功能是确保数据一致性和标准化的关键要素。hsweb后端认证鉴权企业应用hsweb-framework 自定义数据权限扩展指南DataAccessConfigConverter 与 DataAccessHandler 实战hsweb framework 自定义数据权限扩展指南DataAccessConfigConverter 与 DataAccessHandler 实战 在 h后端认证鉴权企业应用上一篇tf_efficientnetv2_b1.in1k核心功能全解析图像分类、特征映射与嵌入提取下一篇终极指南Activiti流程事件溯源实战——从EventDispatcher到状态重建全解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考