您的位置:首页 > 编程语言 > Java开发

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 源码