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
相关产品推荐
相关产品推荐

