fix: answerReconcileProperties @Bean 拆到无依赖独立配置类——Boot 2.6+ 默认禁止一切循环引用,字段注入不豁免(160 复验仍拒启)
build / build-push (push) Successful in 50s

已用 MqDisabledContextIT(@SpringBootTest 全上下文)验证装配通过:Tomcat 起来+健康检查 UP。
This commit is contained in:
chenxing
2026-10-22 10:44:04 +08:00
parent 885b47226f
commit a00f97f0ec
2 changed files with 30 additions and 12 deletions
@@ -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}")
@@ -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} 拆出)。
*
* <p>原 @Bean 挂在 {@link AnswerReconcileConfiguration} 里,而那个类又要注入
* {@code AnswerReconcileService}——Service 与 {@code AnswerReconcileDispatchClient}
* 都要注入本 Properties,于是形成 Configuration→Service→DispatchClient→Configuration
* 构造环。Spring Boot 2.6+ 默认禁止一切循环引用(字段注入也不豁免),160 部署实测
* 直接拒绝启动。本类无任何依赖,环从物理上消失;bean 名与类型都不变,
* 所有注入点零改动。</p>
*/
@Configuration
public class AnswerReconcilePropertiesConfiguration {
@Bean
@ConfigurationProperties(prefix = "fc.answer.reconcile")
public AnswerReconcileConfiguration.AnswerReconcileProperties answerReconcileProperties() {
return new AnswerReconcileConfiguration.AnswerReconcileProperties();
}
}