You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot如何基于application.properties创建同健康检查类的多Bean实例

你要的需求完全可以实现,核心思路是使用列表形式的配置绑定 + 手动动态注册Bean,不需要编写多个重复的健康检查类,具体实现步骤如下:


第一步:调整application.properties配置

将分散的多套配置改成列表结构,后续新增健康检查实例无需修改代码,配置示例:

# actuator 自定义健康检查配置
management.health.custom.checks[0].base-url=http://localhost:10000
management.health.custom.checks[0].name=app1HealthCheckContributor
management.health.custom.checks[1].base-url=http://localhost:10001
management.health.custom.checks[1].name=app2HealthCheckContributor
# 后续新增实例只需要加 checks[2]、checks[3] 对应的配置即可

第二步:编写配置属性绑定类

分别实现单实例配置实体和外层列表配置绑定类:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.List;

// 单个健康检查实例的配置实体
@Data
public class HealthCheckItem {
    private String baseUrl;
    private String name;
}

// 外层列表配置绑定
@Data
@ConfigurationProperties(prefix = "management.health.custom")
public class CustomHealthProperties {
    private List<HealthCheckItem> checks;
}

第三步:编写通用健康检查类

不要加@Component注解,我们后续会手动控制实例化的数量:

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.actuate.health.AbstractHealthIndicator;
import org.springframework.boot.actuate.health.Health;

@Slf4j
public class CommonHealthCheckContributor extends AbstractHealthIndicator {

    private final HealthCheckItem checkItem;

    public CommonHealthCheckContributor(HealthCheckItem checkItem) {
        this.checkItem = checkItem;
    }

    @Override
    protected void doHealthCheck(Health.Builder builder) {
        // 此处编写通用的健康检查逻辑,直接使用checkItem中绑定的配置属性即可
        try {
            // 调用目标应用健康检查接口的逻辑省略
            builder.up()
                .withDetail("baseUrl", checkItem.getBaseUrl())
                .withDetail("status", "运行正常");
        } catch (Exception e) {
            log.error("{} 健康检查失败", checkItem.getName(), e);
            builder.down()
                .withDetail("baseUrl", checkItem.getBaseUrl())
                .withDetail("errorMsg", e.getMessage());
        }
    }
}

第四步:动态注册多个健康检查Bean

编写配置类,读取配置列表后循环注册对应数量的Bean到Spring容器:

import org.springframework.beans.BeansException;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.GenericApplicationContext;

@Configuration
@EnableConfigurationProperties(CustomHealthProperties.class)
public class HealthCheckBeanConfig implements ApplicationContextAware {

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        GenericApplicationContext context = (GenericApplicationContext) applicationContext;
        CustomHealthProperties properties = context.getBean(CustomHealthProperties.class);
        
        // 循环配置列表,逐个注册健康检查Bean
        properties.getChecks().forEach(item -> {
            context.registerBean(
                item.getName(), // Bean名称,对应配置中的name字段
                CommonHealthCheckContributor.class,
                () -> new CommonHealthCheckContributor(item)
            );
        });
    }
}

完成以上步骤后启动项目,调用actuator的health端点即可看到对应数量的健康检查实例结果,全程不需要编写重复的健康检查类。

内容的提问来源于stack exchange,提问作者du-it

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 09:27:04