Skip to content

refactor(bean): 重构 FastBeanCopier 复制后端并补齐兼容性验证#352

Draft
zhou-hao wants to merge 6 commits into
5.0.xfrom
5.0.x-refactor-copy
Draft

refactor(bean): 重构 FastBeanCopier 复制后端并补齐兼容性验证#352
zhou-hao wants to merge 6 commits into
5.0.xfrom
5.0.x-refactor-copy

Conversation

@zhou-hao
Copy link
Copy Markdown
Member

@zhou-hao zhou-hao commented May 7, 2026

目的

  • 重构 FastBeanCopier 内核,拆分 facade 与 support/backend,降低后续演进耦合。
  • 为 accessor 路径补齐兼容性、性能与跨 classloader 验证,为后续 native image 适配预留 backend 切换空间。

核心变动

  • facade / support 拆分
    • 保留 FastBeanCopier 作为 facade,引入 FastBeanCopierSupport 承载缓存、converter、backend 管理。
    • 抽取 FastBeanCopierBackend,拆分 javassistreflectreflection-accessorasm-accessor 四类实现。
  • accessor 能力下沉
    • 新增 PropertyAccessorPropertyTransferConverterPropertyTransfer 抽象。
    • ReflectionBeanAccessorAsmBeanAccessor 支持属性级 direct transfer / converting transfer。
    • converting transfer 直接调用核心 Converter,去掉 TypeConverter + ResolvableType 运行期适配层。
  • 兼容性补强
    • AsmBeanAccessor 在类型不可见或跨 classloader 冲突场景自动降级到 ReflectionBeanAccessor
    • 修复 javassist backend 在 EnumDict -> number bean copy 场景下的不一致行为。
  • 测试与基准
    • 新增 FastBeanCopierSupportTest,覆盖后端兼容性、null-skip 语义、跨 classloader 场景与性能对比。
    • 新增 FastBeanCopierJmhBenchmark / FastBeanCopierJmhRunner,补充 backend JMH 对比入口。

测试结果

  • 命令:mvn -pl hsweb-core -am -DskipTests test-compile

  • 结果:BUILD SUCCESS

  • 命令:mvn -pl hsweb-core -am -Dtest=FastBeanCopierSupportTest -Dsurefire.failIfNoSpecifiedTests=false test

  • 结果:8 passed, 0 failed, 0 skipped

  • 命令:mvn -pl hsweb-core -am -Dtest=FastBeanCopierTest,FastBeanCopierSupportTest -Dsurefire.failIfNoSpecifiedTests=false test

  • 结果:20 passed, 0 failed, 0 skipped

  • 命令:mvn -pl hsweb-core -am -Dtest=CompareUtilsTest,DiffTest,FastBeanCopierTest,FastBeanCopierSupportTest,AsmBeanAccessorTest,ReflectionBeanAccessorTest,SmartTypeConverterTest -Dsurefire.failIfNoSpecifiedTests=false test

  • 结果:29 passed, 0 failed, 0 skipped

    • 注:本次 surefire 实际执行到 CompareUtilsTestDiffTestFastBeanCopierTestFastBeanCopierSupportTest;accessor 目录下 JUnit5 测试类未被当前测试配置选中。
  • 覆盖率:hsweb-core/target/site/jacoco/jacoco.csv

    • line 42.51%
    • branch 41.66%
    • instruction 42.28%

风险与说明

  • 影响范围:hsweb-core bean copy 主路径、converter 路径、Javassist/反射/accessor backend。
  • 未覆盖项:当前仓库的 surefire 配置未实际执行 accessor 子包中的 JUnit5 测试类,相关能力主要由 FastBeanCopierSupportTest 间接覆盖。
  • 已知限制:
    • asm-accessor 的跨 classloader 场景依赖自动降级到 reflection accessor,而不是在目标 loader 中继续动态定义 ASM 类。
    • 本次未引入 native image 专用 backend,只完成了后续切换所需的 backend 抽象与兼容性收口。

zhou-hao added 6 commits July 4, 2025 22:03
# Conflicts:
#	hsweb-core/pom.xml
#	hsweb-core/src/main/java/org/hswebframework/web/bean/ClassDescription.java
#	hsweb-core/src/main/java/org/hswebframework/web/bean/FastBeanCopier.java
#	pom.xml
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant