spring boot 源码解析40-CounterService,GaugeService默认自动装配解析
2018-01-25 15:08
981 查看
前言
本文我们来分析CounterService,GaugeService的自动装配.关于其装配的实现是区分jdk版本的.其自动装配是在MetricRepositoryAutoConfiguration中,该类的说明如下:创建面向用户的GaugeService和CounterService的实例,同时创建repositories来存储数据.
Java 7 使用的是InMemoryMetricRepository或者CounterBuffers 而在Java 8 使用的是GaugeBuffers.存储的值可以通过Exporter 来导出.
如果Spring Messaging添加到项目中并且创建了1个名为metricsChannel的MessageChannel,则所有metric更新的事件会发送到这个channel中.可以通过订阅该channel来进行额外的处理
如果在类路径下存在Dropwizard’s metrics 的jar包,则MetricRegistry会被创建.默认情况下的counter,gauge就不会创建.(关于这个我们在上篇文章中有说明)
默认情况下所有的度量会更新到MetricWriter的实例中,通过metriccopyexporter.每5秒进行一次.(可以使用spring.metrics.export.enabled=false来禁用)
接下来我们就来分析吧.
解析
MetricRepositoryAutoConfiguration 中声明3个静态配置类:LegacyMetricRepositoryConfiguration:
其声明了如下注解:
@Configuration @ConditionalOnJava(value = JavaVersion.EIGHT, range = Range.OLDER_THAN) @ConditionalOnMissingBean(name = "actuatorMetricRepository")
@Configuration –> 配置类
@ConditionalOnJava(value = JavaVersion.EIGHT, range = Range.OLDER_THAN) –> 在jdk1.8之前的环境中生效
@ConditionalOnMissingBean(name = “actuatorMetricRepository”)–> BeanFactory中不存在id为actuatorMetricRepository的bean时生效
声明了如下2个@Bean方法:
actuatorMetricRepository,代码如下:
@Bean @ExportMetricReader @ActuatorMetricWriter public InMemoryMetricRepository actuatorMetricRepository() { return new InMemoryMetricRepository(); }
actuatorMultiMetricRepository,代码如下:
@Bean @ExportMetricReader @ActuatorMetricWriter public InMemoryMultiMetricRepository actuatorMultiMetricRepository( InMemoryMetricRepository actuatorMetricRepository) { return new InMemoryMultiMetricRepository(actuatorMetricRepository); }
关于这部分的内容我们在之前的文章中有介绍.
FastMetricServicesConfiguration:
该类声明了如下注解:
@Configuration @ConditionalOnJava(JavaVersion.EIGHT) @ConditionalOnMissingBean(GaugeService.class)
@Configuration–> 配置类
@ConditionalOnJava(JavaVersion.EIGHT) –> 在jdk1.8及jdk1.8以上的环境中生效
@ConditionalOnMissingBean(GaugeService.class) –> BeanFactory中不存在GaugeService类型的bean时生效.
声明了如下几个@Bean方法:
counterBuffers:
@Bean @ConditionalOnMissingBean public CounterBuffers counterBuffers() { return new CounterBuffers(); }
@Bean –> 注册1个id为counterBuffers,类型为CounterBuffers的bean
@ConditionalOnMissingBean–>BeanFactory中不存在CounterBuffers类型的bean时生效.
gaugeBuffers:
@Bean @ConditionalOnMissingBean public GaugeBuffers gaugeBuffers() { return new GaugeBuffers(); }
@Bean –> 注册1个id为gaugeBuffers,类型为GaugeBuffers的bean
@ConditionalOnMissingBean–>BeanFactory中不存在GaugeBuffers类型的bean时生效.
actuatorMetricReader:
@Bean @ExportMetricReader @ConditionalOnMissingBean public BufferMetricReader actuatorMetricReader(CounterBuffers counters, GaugeBuffers gauges) { return new BufferMetricReader(counters, gauges); }
@Bean –> 注册1个id为actuatorMetricReader,类型为BufferMetricReader的bean
@ConditionalOnMissingBean–>BeanFactory中不存在BufferMetricReader类型的bean时生效.
@ExportMetricReader –> Qualifier注解
关于这个类的作用,我们后续会进行说明
counterService:
@Bean @ConditionalOnMissingBean(CounterService.class) public BufferCounterService counterService(CounterBuffers writer) { return new BufferCounterService(writer); }
@Bean –> 注册1个id为counterService,类型为BufferCounterService的bean
@ConditionalOnMissingBean–>BeanFactory中不存在CounterService类型的bean时生效.
gaugeService:
@Bean @ConditionalOnMissingBean(GaugeService.class) public BufferGaugeService gaugeService(GaugeBuffers writer) { return new BufferGaugeService(writer); }
@Bean –> 注册1个id为gaugeService,类型为BufferGaugeService的bean
@ConditionalOnMissingBean(GaugeService.class)–> BeanFactory中不存在BufferGaugeService类型的bean时生效.
LegacyMetricServicesConfiguration:
该类声明了如下注解:
@Configuration @ConditionalOnJava(value = JavaVersion.EIGHT, range = Range.OLDER_THAN) @ConditionalOnMissingBean(GaugeService.class)
@Configuration –> 配置类
@ConditionalOnJava(value = JavaVersion.EIGHT, range = Range.OLDER_THAN) –> 在jdk1.8之前的环境中生效
@ConditionalOnMissingBean(GaugeService.class) –> BeanFactory中不存在GaugeService类型的bean时生效.
该类的字段,构造器如下:
private final MetricWriter writer; // 此时注入的是InMemoryMetricRepository LegacyMetricServicesConfiguration(@ActuatorMetricWriter MetricWriter writer) { this.writer = writer; }
声明了如下几个@Bean方法:
counterService:
@Bean @ConditionalOnMissingBean(CounterService.class) public DefaultCounterService counterService() { return new DefaultCounterService(this.writer); }
@Bean –> 注册1个id为counterService,类型为DefaultCounterService的bean
@ConditionalOnMissingBean(CounterService.class)–> BeanFactory中不存在CounterService类型的bean时生效.
gaugeService:
@Bean @ConditionalOnMissingBean(GaugeService.class) public DefaultGaugeService gaugeService() { return new DefaultGaugeService(this.writer); }
@Bean –> 注册1个id为gaugeService,类型为DefaultGaugeService的bean
@ConditionalOnMissingBean(GaugeService.class)–> BeanFactory中不存在GaugeService类型的bean时生效.
注意,在本文中提到的类,除了BufferMetricReader,InMemoryMultiMetricRepository 之外,其他的类都在之前的文章中有详细的介绍.
相关文章推荐
- spring boot 源码解析38-GaugeService详解
- Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)
- 【Spring Boot】SpringBoot-自动配置源码解析
- Spring源码解析-autowiring自动装配的实现
- spring boot 源码解析14-默认错误页面处理流程, 自定义,及EnableAutoConfigurationImportSelector处理
- springboot源码解析:自己实现一个springboot自动配置
- spring boot 源码解析36-ConditionalOnEnabledEndpoint
- spring boot 源码解析58-总结
- Spring自动装配模式三:byType的解析
- spring源码剖析(二)Spring默认标签解析及注册实现
- 关于SpringBoot中基于条件的自动装配
- Spring自动装配模式三:byType的解析
- Spring源码解析:默认标签的解析过程
- java定时器无法自动注入的问题解析(原来Spring定时器可以这样注入service)
- spring boot 源码解析20-spring boot aop自动化配置
- 异常解决篇:Spring Boot默认错误返回格式变成数组@RequestBody无法解析Json格式
- spring boot 源码解析54-AbstractHandlerMethodMapping
- spring源码解析之默认配置文件名/WEB-INF/applicationContext.xml
- Spring自动装配模式四:constructor的解析
- 【附3】springboot源码解析 - 构建SpringApplication