diff --git a/src/main/java/com/yunhai/formcenter/config/AnswerReconcileConfiguration.java b/src/main/java/com/yunhai/formcenter/config/AnswerReconcileConfiguration.java index 7e073ad..a0806aa 100644 --- a/src/main/java/com/yunhai/formcenter/config/AnswerReconcileConfiguration.java +++ b/src/main/java/com/yunhai/formcenter/config/AnswerReconcileConfiguration.java @@ -4,8 +4,6 @@ import com.yunhai.formcenter.service.AnswerReconcileService; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.Scheduled; @@ -27,20 +25,15 @@ import org.springframework.scheduling.annotation.Scheduled; public class AnswerReconcileConfiguration { /** - * 字段注入而非构造器注入:answerReconcileProperties 这个 @Bean 定义在本类里, - * 构造器注入会形成 Configuration→Service→DispatchClient→Properties→Configuration - * 的构造环(容器直接拒绝启动,2026-10-22 160 部署实测)。字段注入把对 Service 的 - * 依赖推迟到属性填充阶段,环自然解开;@Scheduled 回调运行时该字段必已就绪。 + * 字段注入而非构造器注入:本类与 Service/DispatchClient/Properties 之间曾有构造环 + * (Boot 2.6+ 默认禁环拒启,2026-10-22 160 部署实测)。环的物理解法是把 + * answerReconcileProperties @Bean 拆到无依赖的 {@link AnswerReconcilePropertiesConfiguration}; + * 字段注入保留——它把对 Service 的依赖推迟到属性填充阶段,让本类可以先于 Service 完成 + * 自身装配。@Scheduled 回调运行时该字段必已就绪。 */ @org.springframework.beans.factory.annotation.Autowired private AnswerReconcileService reconcileService; - @Bean - @ConfigurationProperties(prefix = "fc.answer.reconcile") - public AnswerReconcileProperties answerReconcileProperties() { - return new AnswerReconcileProperties(); - } - /** 清单物化与派发共用一个扫描闹钟:每 tick 最多推进一条任务(这就是任务级单并发) */ @Scheduled(fixedDelayString = "${fc.answer.reconcile.scan-interval-ms:15000}", initialDelayString = "${fc.answer.reconcile.scan-initial-delay-ms:45000}") diff --git a/src/main/java/com/yunhai/formcenter/config/AnswerReconcilePropertiesConfiguration.java b/src/main/java/com/yunhai/formcenter/config/AnswerReconcilePropertiesConfiguration.java new file mode 100644 index 0000000..fa7e754 --- /dev/null +++ b/src/main/java/com/yunhai/formcenter/config/AnswerReconcilePropertiesConfiguration.java @@ -0,0 +1,25 @@ +package com.yunhai.formcenter.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 对账运行参数的注册位(TASK_3;2026-10-22 从 {@link AnswerReconcileConfiguration} 拆出)。 + * + *
原 @Bean 挂在 {@link AnswerReconcileConfiguration} 里,而那个类又要注入 + * {@code AnswerReconcileService}——Service 与 {@code AnswerReconcileDispatchClient} + * 都要注入本 Properties,于是形成 Configuration→Service→DispatchClient→Configuration + * 构造环。Spring Boot 2.6+ 默认禁止一切循环引用(字段注入也不豁免),160 部署实测 + * 直接拒绝启动。本类无任何依赖,环从物理上消失;bean 名与类型都不变, + * 所有注入点零改动。
+ */ +@Configuration +public class AnswerReconcilePropertiesConfiguration { + + @Bean + @ConfigurationProperties(prefix = "fc.answer.reconcile") + public AnswerReconcileConfiguration.AnswerReconcileProperties answerReconcileProperties() { + return new AnswerReconcileConfiguration.AnswerReconcileProperties(); + } +}