0

我试图在我的代码中配置 promethues,我只需要创建一个如下所示的 bean。我在想春天是怎么认出来CollectorRegistry的。spring 是如何实例化所有必要的变量CollectorRegistry并设置所有必要的配置的?

@Component
public class TestProm{

 public TestProm(CollectorRegistry registry){ 
  // Some initialization code here
 }
}

@Bean但是,当我尝试通过在我的类中定义 a 以另一种方式定义它时@Configuration,它似乎无法正常工作,因为我自己的构造函数 forCollectorRegistry没有所有必要的属性。

@Configuration
public class PromConfiguration{

@Bean
public TestProm getTestProm() {
 return new TestProm(new CollectorRegistry());
}

}



public class TestProm{
 public TestProm(CollectorRegistry registry){ 
 //Some code here
}
}

CollectorRegistry当我进行客户实现时,如何识别/复制 spring 完成的初始化。

4

1 回答 1

2
  1. spring 如何为 CollectorRegistry 实例化所有必要的变量并设置所有必要的配置?

在第一个示例中,您需要一个类型的 Bean,如果您的类路径上有 Prometheus 依赖项并且启用了自动配置,那么CollectorRegistrySpring 实际上会为您创建这样的 bean :spring-boot-starter-actuator

...
 @EnableAutoConfiguration
 @ConfigurationPropertiesScan
...
public @interface SpringBootApplication

在这种情况下,Spring 将扫描类路径并加载所有配置。您感兴趣的 bean 属于PrometheusMetricsExportAutoConfiguration

@Bean
@ConditionalOnMissingBean
public CollectorRegistry collectorRegistry() {
    return new CollectorRegistry(true);
}

在第二个示例中,实例CollectorRegistry不由 Spring 管理,因为您通过new关键字创建它。但是,它应该像CollectorRegistry默认构造函数一样工作,该构造函数将autoDescribe字段初始化为false. 并且由 Spring(以上述方式)创建的此类的默认 Bean 将此字段设置为true. 所以这个字段的值是你差异的来源。

此外,如果这个实例不是由 Spring 管理的 - 它会阻止它被注入到其他需要它的组件中。由于范围CollectorRegistry是单例(如上所示),其他 bean 可能需要共享实例才能正常工作(例如,某些 bean 可能想要注册/注销收集器)但是如果您使用关键字创建CollectorRegistry这样的实例 -您将不会获得单例实例但是一个不能在其他 bean 之间共享的新实例new

  1. 当我进行自定义实现时,如何识别/复制由 spring 完成的 CollectorRegistry 初始化?

如果你想使用默认的CollectorRegistry(假设你想使用上面描述的方式默认创建的 bean)只需将这种类型的 bean 注入你的 bean 就足够了。

于 2019-11-02T08:15:34.387 回答