Springboot 源码分析 —— @Endpoint 注解生效原理解析

本文深入探讨Springboot中@Endpoint注解的生效机制,从WebMvcEndpointManagementContextConfiguration、EndpointAutoConfiguration到请求处理流程,详细阐述了如何通过DispatcherServlet、HandlerMapping以及PathMappedEndpoints等组件实现端点的映射和处理。通过分析,读者可以更好地理解actuator端点的工作方式。
摘要由CSDN通过智能技术生成

1 WebMvcEndpointManagementContextConfiguration

  • 这里是向容器注入自定义的 HandlerMapping,供 DispatcherServlet 调用
  • DispatcherServlet 根据各个 HandlerMapping 做实际的请求分发
@ManagementContextConfiguration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass(DispatcherServlet.class)
@ConditionalOnBean({
    DispatcherServlet.class, WebEndpointsSupplier.class })
@EnableConfigurationProperties(CorsEndpointProperties.class)
public class WebMvcEndpointManagementContextConfiguration {
   

   //1.1 
   @Bean
   @ConditionalOnMissingBean
   public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(...) {
   
       //向容器注入 WebMvcEndpointHandlerMapping,由 DispatcherServlet 调用,转发请求到真实的 endpoint 中的 特定 operation 中
   }

   //1.2 
   @Bean
   @ConditionalOnMissingBean
   public ControllerEndpointHandlerMapping controllerEndpointHandlerMapping(...) {
   
       //向容器注入 ControllerEndpointHandlerMapping,由 DispatcherServlet 调用,转发请求到真实的 endpoint
   }
}

1.1 webEndpointServletHandlerMapping

@Bean
@ConditionalOnMissingBean
public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(...) {
       
    List<ExposableEndpoint<?>> allEndpoints = new ArrayList<>();
    //获取所有的 web 类型 endpoints(@Endpoint、@WebEndpoint 注解)
    //这里可能会触发 endpoints 的初始化,但是应该是被 5 给抢先了
    Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();
    allEndpoints.addAll(webEndpoints);
    //获取所有 servlet 类型 endpoints(@ServletEndpoint 注解)
    allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
    //获取所有 controller 类型 endpoints(@ControllerEndpoint 注解)
    allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
    //web endpoint 的 base path
    String basePath = webEndpointProperties.getBasePath();
    EndpointMapping endpointMapping = new EndpointMapping(basePath);
    //当 bathPath 为空,且 endpoint 的端口和server 端口一样,才不暴露
    boolean shouldRegisterLinksMapping = 是否暴露 /actuator 发现页面;
    return new WebMvcEndpointHandlerMapping(...);
}

1.2 ControllerEndpointHandlerMapping

  • 同 1.1
@Bean
@ConditionalOnMissingBean
public ControllerEndpointHandlerMapping controllerEndpointHandlerMapping(...) {
   
    EndpointMapping endpointMapping = new EndpointMapping(webEndpointProprties.getBasePath());
    return new ControllerEndpointHandlerMapping(...);
}

2 EndpointAutoConfiguration

@Configuration(proxyBeanMethods = false)
public class EndpointAutoConfiguration {
   
   @Bean
   @ConditionalOnMissingBean 
   public ParameterValueMapper endpointOperationParameterMapper(...) {
   
       //方法参数:@EndpointConverter ObjectProvider<Converter<?, ?>> converters
       //方法参数:@EndpointConverter ObjectProvider<GenericConverter> genericConverters
		//获取容器中的 @EndpointConverter(Converter,GenericConverter),用于 @Endpoint 输入参数的类型转换
        //如果没有,则使用默认的 ApplicationConversionService
        //如果有,则使用 它们,来设置 ApplicationConversionService
   }
   @Bean
   @ConditionalOnMissingBean
   //返回可缓存的 endpoint 的缓存时间 
   //management.endpoint.endpointName.cache.time-to-live=xx 来配置 endpointName 的缓存时间
   public CachingOperationInvokerAdvisor endpointCachingOperationInvokerAdvisor(Environment environment) {
   
      return new CachingOperationInvokerAdvisor(new EndpointIdTimeToLivePropertyFunction(environment));
   }
}

3 WebEndpointAutoConfiguration

  • 生成 endpoint 相关信息
@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication
@AutoConfigureAfter(EndpointAutoConfiguration.class)
@EnableConfigurationProperties(WebEndpointProperties.class)
public class WebEndpointAutoConfiguration {
   

   @Bean
   //health,info 等路径的重定义,如:
   //management.endpoints.path-mapping.health=healthcheck
   //management.endpoints.path-mapping.info=myInfo
   public PathMapper webEndpointPathMapper() {
   
      return new MappingWebEndpointPathMapper(this.properties.getPathMapping());
   }
   @Bean
   @ConditionalOnMissingBean
   public EndpointMediaTypes endpointMediaTypes() {
   
      return EndpointMediaTypes.DEFAULT;
   }
   @Bean
   @ConditionalOnMissingBean(WebEndpointsSupplier.class)
   public WebEndpointDiscoverer webEndpointDiscoverer(...) {
   
      //方法参数如下: 
      //1. ParameterValueMapper,2.EndpointMediaTypes,3.PathMapper:info->Myinfo
      //4. OperationInvokerAdvisor,5.EndpointFilter<ExposableWebEndpoint>
      //通过如上参数创建 discoverer 类
      return new WebEndpointDiscoverer(...);
   }
   @Bean
   @ConditionalOnMissingBean(ControllerEndpointsSupplier.class)
   public ControllerEndpointDiscoverer controllerEndpointDiscoverer(...) {
   
      //同上 
      return new ControllerEndpointDiscoverer(...)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值