如何在开启全局懒初始化时让Spring Boot Actuator支持JMX访问
问题原因
全局懒初始化spring.main.lazy-initialization=true会让所有Spring管理的Bean默认启用懒加载,Actuator端点对应的Bean在没有被主动调用的情况下不会完成实例化,也就不会注册到JMX MBean服务器中,因此外部监控无法通过JMX访问到对应的端点。
可行解决方案
方案1:使用LazyInitializationExcludeFilter排除指定Bean的懒加载(兼容所有Spring Boot 2.4+版本)
该方案不需要修改全局懒加载规则,只需要将需要通过JMX暴露的Actuator端点排除在懒加载范围外即可,是兼容性最好的实现方式:
import org.springframework.boot.LazyInitializationExcludeFilter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ActuatorLazyConfig { @Bean public LazyInitializationExcludeFilter requiredEndpointsExcludeFilter() { // 仅排除Health、Metrics两个需要的端点,不影响其他Actuator端点的懒加载逻辑 return (beanName, beanDefinition, beanType) -> beanType != null && ( "org.springframework.boot.actuate.health.HealthEndpoint".equals(beanType.getName()) || "org.springframework.boot.actuate.metrics.MetricsEndpoint".equals(beanType.getName()) ); } }
如果需要所有Actuator端点都提前初始化,可以直接针对@Endpoint注解做统一排除:
import org.springframework.boot.actuate.endpoint.annotation.Endpoint; @Bean public LazyInitializationExcludeFilter allActuatorEndpointsExcludeFilter() { return LazyInitializationExcludeFilter.forAnnotatedClasses(Endpoint.class); }
方案2:通过配置属性直接排除(适合Spring Boot 2.6+版本)
如果使用的Spring Boot版本≥2.6,不需要额外编写代码,直接在application.properties中添加配置即可:
spring.main.lazy-initialization.exclude=\ org.springframework.boot.actuate.health.HealthEndpoint,\ org.springframework.boot.actuate.metrics.MetricsEndpoint
注意:请同时确认已配置Actuator的JMX暴露规则,确保目标端点允许通过JMX对外暴露,示例配置如下:
# 仅暴露health、metrics两个端点到JMX management.endpoints.jmx.exposure.include=health,metrics # 如需暴露所有Actuator端点可改为 management.endpoints.jmx.exposure.include=*
内容的提问来源于stack exchange,提问作者Jirka Janák
相关产品推荐
相关产品推荐

