From bcb5e84129250842d57adffbcce990b0c8c7fc97 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 29 Sep 2022 14:16:50 +0100 Subject: [PATCH] Avoid using reflection when creating composite health contributors Closes gh-32541 --- ...bitHealthContributorAutoConfiguration.java | 4 ++ ...sandraHealthContributorConfigurations.java | 10 +++- ...aseHealthContributorAutoConfiguration.java | 4 ++ ...iveHealthContributorAutoConfiguration.java | 4 ++ ...iveHealthContributorAutoConfiguration.java | 4 ++ ...ngoHealthContributorAutoConfiguration.java | 4 ++ ...iveHealthContributorAutoConfiguration.java | 4 ++ ...disHealthContributorAutoConfiguration.java | 4 ++ ...iveHealthContributorAutoConfiguration.java | 1 + ...estHealthContributorAutoConfiguration.java | 4 ++ ...astHealthContributorAutoConfiguration.java | 4 ++ ...mpositeHealthContributorConfiguration.java | 50 +++++++++++----- ...mpositeHealthContributorConfiguration.java | 24 +++++++- ...eactiveHealthContributorConfiguration.java | 24 +++++++- ...xDbHealthContributorAutoConfiguration.java | 4 ++ ...JmsHealthContributorAutoConfiguration.java | 4 ++ ...dapHealthContributorAutoConfiguration.java | 4 ++ ...ailHealthContributorAutoConfiguration.java | 4 ++ .../Neo4jHealthContributorConfigurations.java | 10 +++- ...oryHealthContributorAutoConfiguration.java | 1 + ...ntributorConfigurationReflectionTests.java | 56 ++++++++++++++++++ ...teHealthContributorConfigurationTests.java | 6 +- ...ntributorConfigurationReflectionTests.java | 59 +++++++++++++++++++ ...veHealthContributorConfigurationTests.java | 6 +- 24 files changed, 277 insertions(+), 22 deletions(-) create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/CompositeHealthContributorConfigurationReflectionTests.java create mode 100644 spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/CompositeReactiveHealthContributorConfigurationReflectionTests.java diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/amqp/RabbitHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/amqp/RabbitHealthContributorAutoConfiguration.java index eccd25447e4..5a8a4810de8 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/amqp/RabbitHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/amqp/RabbitHealthContributorAutoConfiguration.java @@ -44,6 +44,10 @@ import org.springframework.context.annotation.Bean; public class RabbitHealthContributorAutoConfiguration extends CompositeHealthContributorConfiguration { + public RabbitHealthContributorAutoConfiguration() { + super(RabbitHealthIndicator::new); + } + @Bean @ConditionalOnMissingBean(name = { "rabbitHealthIndicator", "rabbitHealthContributor" }) public HealthContributor rabbitHealthContributor(Map rabbitTemplates) { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraHealthContributorConfigurations.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraHealthContributorConfigurations.java index d3db6482acc..570d5d08f1f 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraHealthContributorConfigurations.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraHealthContributorConfigurations.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2021 the original author or authors. + * Copyright 2012-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,6 +43,10 @@ class CassandraHealthContributorConfigurations { static class CassandraDriverConfiguration extends CompositeHealthContributorConfiguration { + CassandraDriverConfiguration() { + super(CassandraDriverHealthIndicator::new); + } + @Bean @ConditionalOnMissingBean(name = { "cassandraHealthIndicator", "cassandraHealthContributor" }) HealthContributor cassandraHealthContributor(Map sessions) { @@ -56,6 +60,10 @@ class CassandraHealthContributorConfigurations { static class CassandraReactiveDriverConfiguration extends CompositeReactiveHealthContributorConfiguration { + CassandraReactiveDriverConfiguration() { + super(CassandraDriverReactiveHealthIndicator::new); + } + @Bean @ConditionalOnMissingBean(name = { "cassandraHealthIndicator", "cassandraHealthContributor" }) ReactiveHealthContributor cassandraHealthContributor(Map sessions) { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/couchbase/CouchbaseHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/couchbase/CouchbaseHealthContributorAutoConfiguration.java index b06a8da2be7..38a973a08c1 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/couchbase/CouchbaseHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/couchbase/CouchbaseHealthContributorAutoConfiguration.java @@ -49,6 +49,10 @@ import org.springframework.context.annotation.Bean; public class CouchbaseHealthContributorAutoConfiguration extends CompositeHealthContributorConfiguration { + public CouchbaseHealthContributorAutoConfiguration() { + super(CouchbaseHealthIndicator::new); + } + @Bean @ConditionalOnMissingBean(name = { "couchbaseHealthIndicator", "couchbaseHealthContributor" }) public HealthContributor couchbaseHealthContributor(Map clusters) { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/couchbase/CouchbaseReactiveHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/couchbase/CouchbaseReactiveHealthContributorAutoConfiguration.java index 87b43772d2a..53fa4b4db7d 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/couchbase/CouchbaseReactiveHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/couchbase/CouchbaseReactiveHealthContributorAutoConfiguration.java @@ -48,6 +48,10 @@ import org.springframework.context.annotation.Bean; public class CouchbaseReactiveHealthContributorAutoConfiguration extends CompositeReactiveHealthContributorConfiguration { + public CouchbaseReactiveHealthContributorAutoConfiguration() { + super(CouchbaseReactiveHealthIndicator::new); + } + @Bean @ConditionalOnMissingBean(name = { "couchbaseHealthIndicator", "couchbaseHealthContributor" }) public ReactiveHealthContributor couchbaseHealthContributor(Map clusters) { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/data/elasticsearch/ElasticsearchReactiveHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/data/elasticsearch/ElasticsearchReactiveHealthContributorAutoConfiguration.java index 2e4c6295c71..484fede9ae9 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/data/elasticsearch/ElasticsearchReactiveHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/data/elasticsearch/ElasticsearchReactiveHealthContributorAutoConfiguration.java @@ -48,6 +48,10 @@ import org.springframework.data.elasticsearch.client.elc.ReactiveElasticsearchCl public class ElasticsearchReactiveHealthContributorAutoConfiguration extends CompositeReactiveHealthContributorConfiguration { + public ElasticsearchReactiveHealthContributorAutoConfiguration() { + super(ElasticsearchReactiveHealthIndicator::new); + } + @Bean @ConditionalOnMissingBean(name = { "elasticsearchHealthIndicator", "elasticsearchHealthContributor" }) public ReactiveHealthContributor elasticsearchHealthContributor(Map clients) { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/data/mongo/MongoHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/data/mongo/MongoHealthContributorAutoConfiguration.java index b7880f7c95b..8b65a9557d3 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/data/mongo/MongoHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/data/mongo/MongoHealthContributorAutoConfiguration.java @@ -46,6 +46,10 @@ import org.springframework.data.mongodb.core.MongoTemplate; public class MongoHealthContributorAutoConfiguration extends CompositeHealthContributorConfiguration { + public MongoHealthContributorAutoConfiguration() { + super(MongoHealthIndicator::new); + } + @Bean @ConditionalOnMissingBean(name = { "mongoHealthIndicator", "mongoHealthContributor" }) public HealthContributor mongoHealthContributor(Map mongoTemplates) { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/data/mongo/MongoReactiveHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/data/mongo/MongoReactiveHealthContributorAutoConfiguration.java index 805bcd458e7..eefc035b3c6 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/data/mongo/MongoReactiveHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/data/mongo/MongoReactiveHealthContributorAutoConfiguration.java @@ -47,6 +47,10 @@ import org.springframework.data.mongodb.core.ReactiveMongoTemplate; public class MongoReactiveHealthContributorAutoConfiguration extends CompositeReactiveHealthContributorConfiguration { + public MongoReactiveHealthContributorAutoConfiguration() { + super(MongoReactiveHealthIndicator::new); + } + @Bean @ConditionalOnMissingBean(name = { "mongoHealthIndicator", "mongoHealthContributor" }) public ReactiveHealthContributor mongoHealthContributor(Map reactiveMongoTemplates) { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/data/redis/RedisHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/data/redis/RedisHealthContributorAutoConfiguration.java index 41fda7a222f..76453afcdb6 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/data/redis/RedisHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/data/redis/RedisHealthContributorAutoConfiguration.java @@ -47,6 +47,10 @@ import org.springframework.data.redis.connection.RedisConnectionFactory; public class RedisHealthContributorAutoConfiguration extends CompositeHealthContributorConfiguration { + RedisHealthContributorAutoConfiguration() { + super(RedisHealthIndicator::new); + } + @Bean @ConditionalOnMissingBean(name = { "redisHealthIndicator", "redisHealthContributor" }) public HealthContributor redisHealthContributor(Map redisConnectionFactories) { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/data/redis/RedisReactiveHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/data/redis/RedisReactiveHealthContributorAutoConfiguration.java index 489694e6c9d..f2807de840d 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/data/redis/RedisReactiveHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/data/redis/RedisReactiveHealthContributorAutoConfiguration.java @@ -54,6 +54,7 @@ public class RedisReactiveHealthContributorAutoConfiguration extends RedisReactiveHealthContributorAutoConfiguration( Map redisConnectionFactories) { + super(RedisReactiveHealthIndicator::new); this.redisConnectionFactories = redisConnectionFactories; } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/elasticsearch/ElasticsearchRestHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/elasticsearch/ElasticsearchRestHealthContributorAutoConfiguration.java index c76c1e57529..b09f311ac0d 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/elasticsearch/ElasticsearchRestHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/elasticsearch/ElasticsearchRestHealthContributorAutoConfiguration.java @@ -46,6 +46,10 @@ import org.springframework.context.annotation.Bean; public class ElasticsearchRestHealthContributorAutoConfiguration extends CompositeHealthContributorConfiguration { + public ElasticsearchRestHealthContributorAutoConfiguration() { + super(ElasticsearchRestClientHealthIndicator::new); + } + @Bean @ConditionalOnMissingBean(name = { "elasticsearchHealthIndicator", "elasticsearchHealthContributor" }) public HealthContributor elasticsearchHealthContributor(Map clients) { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/hazelcast/HazelcastHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/hazelcast/HazelcastHealthContributorAutoConfiguration.java index 169af71c17e..601f0c19564 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/hazelcast/HazelcastHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/hazelcast/HazelcastHealthContributorAutoConfiguration.java @@ -46,6 +46,10 @@ import org.springframework.context.annotation.Bean; public class HazelcastHealthContributorAutoConfiguration extends CompositeHealthContributorConfiguration { + public HazelcastHealthContributorAutoConfiguration() { + super(HazelcastHealthIndicator::new); + } + @Bean @ConditionalOnMissingBean(name = { "hazelcastHealthIndicator", "hazelcastHealthContributor" }) public HealthContributor hazelcastHealthContributor(Map hazelcastInstances) { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/AbstractCompositeHealthContributorConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/AbstractCompositeHealthContributorConfiguration.java index 7f6ccfd197c..0b0d5837110 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/AbstractCompositeHealthContributorConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/AbstractCompositeHealthContributorConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ package org.springframework.boot.actuate.autoconfigure.health; import java.lang.reflect.Constructor; import java.util.Map; +import java.util.function.Function; import org.springframework.beans.BeanUtils; import org.springframework.core.ResolvableType; @@ -36,16 +37,41 @@ import org.springframework.util.Assert; */ public abstract class AbstractCompositeHealthContributorConfiguration { - private final Class indicatorType; + private final Function indicatorFactory; - private final Class beanType; - - AbstractCompositeHealthContributorConfiguration() { + /** + * Creates a {@code AbstractCompositeHealthContributorConfiguration} that will use + * reflection to create health indicator instances. + * @deprecated since 3.0.0 in favor of + * {@link #AbstractCompositeHealthContributorConfiguration(Function)} + */ + @Deprecated(since = "3.0.0", forRemoval = true) + protected AbstractCompositeHealthContributorConfiguration() { ResolvableType type = ResolvableType.forClass(AbstractCompositeHealthContributorConfiguration.class, getClass()); - this.indicatorType = type.resolveGeneric(1); - this.beanType = type.resolveGeneric(2); + Class indicatorType = type.resolveGeneric(1); + Class beanType = type.resolveGeneric(2); + this.indicatorFactory = (bean) -> { + try { + @SuppressWarnings("unchecked") + Constructor constructor = (Constructor) indicatorType.getDeclaredConstructor(beanType); + return BeanUtils.instantiateClass(constructor, bean); + } + catch (Exception ex) { + throw new IllegalStateException( + "Unable to create health indicator " + indicatorType + " for bean type " + beanType, ex); + } + }; + } + /** + * Creates a {@code AbstractCompositeHealthContributorConfiguration} that will use the + * given {@code indicatorFactory} to create health indicator instances. + * @param indicatorFactory the function to create health indicators + * @since 3.0.0 + */ + protected AbstractCompositeHealthContributorConfiguration(Function indicatorFactory) { + this.indicatorFactory = indicatorFactory; } protected final C createContributor(Map beans) { @@ -58,16 +84,8 @@ public abstract class AbstractCompositeHealthContributorConfiguration beans); - @SuppressWarnings("unchecked") protected I createIndicator(B bean) { - try { - Constructor constructor = (Constructor) this.indicatorType.getDeclaredConstructor(this.beanType); - return BeanUtils.instantiateClass(constructor, bean); - } - catch (Exception ex) { - throw new IllegalStateException( - "Unable to create health indicator " + this.indicatorType + " for bean type " + this.beanType, ex); - } + return this.indicatorFactory.apply(bean); } } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/CompositeHealthContributorConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/CompositeHealthContributorConfiguration.java index 8ac500c7af4..4f6dcdf5eca 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/CompositeHealthContributorConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/CompositeHealthContributorConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package org.springframework.boot.actuate.autoconfigure.health; import java.util.Map; +import java.util.function.Function; import org.springframework.boot.actuate.health.CompositeHealthContributor; import org.springframework.boot.actuate.health.HealthContributor; @@ -35,6 +36,27 @@ import org.springframework.boot.actuate.health.HealthIndicator; public abstract class CompositeHealthContributorConfiguration extends AbstractCompositeHealthContributorConfiguration { + /** + * Creates a {@code CompositeHealthContributorConfiguration} that will use reflection + * to create {@link HealthIndicator} instances. + * @deprecated since 3.0.0 in favor of + * {@link #CompositeHealthContributorConfiguration(Function)} + */ + @Deprecated(since = "3.0.0", forRemoval = true) + public CompositeHealthContributorConfiguration() { + super(); + } + + /** + * Creates a {@code CompositeHealthContributorConfiguration} that will use the given + * {@code indicatorFactory} to create {@link HealthIndicator} instances. + * @param indicatorFactory the function to create health indicator instances + * @since 3.0.0 + */ + public CompositeHealthContributorConfiguration(Function indicatorFactory) { + super(indicatorFactory); + } + @Override protected final HealthContributor createComposite(Map beans) { return CompositeHealthContributor.fromMap(beans, this::createIndicator); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/CompositeReactiveHealthContributorConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/CompositeReactiveHealthContributorConfiguration.java index 8d14c0d4d86..1699b866744 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/CompositeReactiveHealthContributorConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/health/CompositeReactiveHealthContributorConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package org.springframework.boot.actuate.autoconfigure.health; import java.util.Map; +import java.util.function.Function; import org.springframework.boot.actuate.health.CompositeReactiveHealthContributor; import org.springframework.boot.actuate.health.ReactiveHealthContributor; @@ -35,6 +36,27 @@ import org.springframework.boot.actuate.health.ReactiveHealthIndicator; public abstract class CompositeReactiveHealthContributorConfiguration extends AbstractCompositeHealthContributorConfiguration { + /** + * Creates a {@code CompositeReactiveHealthContributorConfiguration} that will use + * reflection to create {@link ReactiveHealthIndicator} instances. + * @deprecated since 3.0.0 in favor of + * {@link #CompositeReactiveHealthContributorConfiguration(Function)} + */ + @Deprecated(since = "3.0.0", forRemoval = true) + public CompositeReactiveHealthContributorConfiguration() { + super(); + } + + /** + * Creates a {@code CompositeReactiveHealthContributorConfiguration} that will use the + * given {@code indicatorFactory} to create {@link ReactiveHealthIndicator} instances. + * @param indicatorFactory the function to create health indicator instances + * @since 3.0.0 + */ + public CompositeReactiveHealthContributorConfiguration(Function indicatorFactory) { + super(indicatorFactory); + } + @Override protected final ReactiveHealthContributor createComposite(Map beans) { return CompositeReactiveHealthContributor.fromMap(beans, this::createIndicator); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/influx/InfluxDbHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/influx/InfluxDbHealthContributorAutoConfiguration.java index 3d66ef948ed..7f93279fde8 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/influx/InfluxDbHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/influx/InfluxDbHealthContributorAutoConfiguration.java @@ -45,6 +45,10 @@ import org.springframework.context.annotation.Bean; public class InfluxDbHealthContributorAutoConfiguration extends CompositeHealthContributorConfiguration { + public InfluxDbHealthContributorAutoConfiguration() { + super(InfluxDbHealthIndicator::new); + } + @Bean @ConditionalOnMissingBean(name = { "influxDbHealthIndicator", "influxDbHealthContributor" }) public HealthContributor influxDbHealthContributor(Map influxDbs) { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/jms/JmsHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/jms/JmsHealthContributorAutoConfiguration.java index 70327943b95..53490552eb1 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/jms/JmsHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/jms/JmsHealthContributorAutoConfiguration.java @@ -45,6 +45,10 @@ import org.springframework.context.annotation.Bean; public class JmsHealthContributorAutoConfiguration extends CompositeHealthContributorConfiguration { + public JmsHealthContributorAutoConfiguration() { + super(JmsHealthIndicator::new); + } + @Bean @ConditionalOnMissingBean(name = { "jmsHealthIndicator", "jmsHealthContributor" }) public HealthContributor jmsHealthContributor(Map connectionFactories) { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/ldap/LdapHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/ldap/LdapHealthContributorAutoConfiguration.java index 6e7e0a3094a..e5de5e4b9fe 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/ldap/LdapHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/ldap/LdapHealthContributorAutoConfiguration.java @@ -45,6 +45,10 @@ import org.springframework.ldap.core.LdapOperations; public class LdapHealthContributorAutoConfiguration extends CompositeHealthContributorConfiguration { + public LdapHealthContributorAutoConfiguration() { + super(LdapHealthIndicator::new); + } + @Bean @ConditionalOnMissingBean(name = { "ldapHealthIndicator", "ldapHealthContributor" }) public HealthContributor ldapHealthContributor(Map ldapOperations) { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/mail/MailHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/mail/MailHealthContributorAutoConfiguration.java index 7976423a58d..89b61c72fe3 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/mail/MailHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/mail/MailHealthContributorAutoConfiguration.java @@ -44,6 +44,10 @@ import org.springframework.mail.javamail.JavaMailSenderImpl; public class MailHealthContributorAutoConfiguration extends CompositeHealthContributorConfiguration { + public MailHealthContributorAutoConfiguration() { + super(MailHealthIndicator::new); + } + @Bean @ConditionalOnMissingBean(name = { "mailHealthIndicator", "mailHealthContributor" }) public HealthContributor mailHealthContributor(Map mailSenders) { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/neo4j/Neo4jHealthContributorConfigurations.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/neo4j/Neo4jHealthContributorConfigurations.java index e53e14d27cb..1f797f6bc7d 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/neo4j/Neo4jHealthContributorConfigurations.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/neo4j/Neo4jHealthContributorConfigurations.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,6 +43,10 @@ class Neo4jHealthContributorConfigurations { @Configuration(proxyBeanMethods = false) static class Neo4jConfiguration extends CompositeHealthContributorConfiguration { + Neo4jConfiguration() { + super(Neo4jHealthIndicator::new); + } + @Bean @ConditionalOnMissingBean(name = { "neo4jHealthIndicator", "neo4jHealthContributor" }) HealthContributor neo4jHealthContributor(Map drivers) { @@ -56,6 +60,10 @@ class Neo4jHealthContributorConfigurations { static class Neo4jReactiveConfiguration extends CompositeReactiveHealthContributorConfiguration { + Neo4jReactiveConfiguration() { + super(Neo4jReactiveHealthIndicator::new); + } + @Bean @ConditionalOnMissingBean(name = { "neo4jHealthIndicator", "neo4jHealthContributor" }) ReactiveHealthContributor neo4jHealthContributor(Map drivers) { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/r2dbc/ConnectionFactoryHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/r2dbc/ConnectionFactoryHealthContributorAutoConfiguration.java index a97321cd292..90e8bc53605 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/r2dbc/ConnectionFactoryHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/r2dbc/ConnectionFactoryHealthContributorAutoConfiguration.java @@ -49,6 +49,7 @@ public class ConnectionFactoryHealthContributorAutoConfiguration private final Map connectionFactory; ConnectionFactoryHealthContributorAutoConfiguration(Map connectionFactory) { + super(ConnectionFactoryHealthIndicator::new); this.connectionFactory = connectionFactory; } diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/CompositeHealthContributorConfigurationReflectionTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/CompositeHealthContributorConfigurationReflectionTests.java new file mode 100644 index 00000000000..6b174b10500 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/CompositeHealthContributorConfigurationReflectionTests.java @@ -0,0 +1,56 @@ +/* + * Copyright 2012-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.actuate.autoconfigure.health; + +import org.springframework.boot.actuate.autoconfigure.health.CompositeHealthContributorConfigurationReflectionTests.TestHealthIndicator; +import org.springframework.boot.actuate.health.AbstractHealthIndicator; +import org.springframework.boot.actuate.health.Health.Builder; +import org.springframework.boot.actuate.health.HealthContributor; + +/** + * Tests for {@link CompositeHealthContributorConfiguration} using reflection to create + * indicator instances. + * + * @author Phillip Webb + */ +@Deprecated(since = "3.0.0", forRemoval = true) +class CompositeHealthContributorConfigurationReflectionTests + extends AbstractCompositeHealthContributorConfigurationTests { + + @Override + protected AbstractCompositeHealthContributorConfiguration newComposite() { + return new ReflectiveTestCompositeHealthContributorConfiguration(); + } + + static class ReflectiveTestCompositeHealthContributorConfiguration + extends CompositeHealthContributorConfiguration { + + } + + static class TestHealthIndicator extends AbstractHealthIndicator { + + TestHealthIndicator(TestBean testBean) { + } + + @Override + protected void doHealthCheck(Builder builder) throws Exception { + builder.up(); + } + + } + +} diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/CompositeHealthContributorConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/CompositeHealthContributorConfigurationTests.java index ceb40b3dea1..10c22851598 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/CompositeHealthContributorConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/CompositeHealthContributorConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,6 +37,10 @@ class CompositeHealthContributorConfigurationTests static class TestCompositeHealthContributorConfiguration extends CompositeHealthContributorConfiguration { + TestCompositeHealthContributorConfiguration() { + super(TestHealthIndicator::new); + } + } static class TestHealthIndicator extends AbstractHealthIndicator { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/CompositeReactiveHealthContributorConfigurationReflectionTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/CompositeReactiveHealthContributorConfigurationReflectionTests.java new file mode 100644 index 00000000000..e03f5787557 --- /dev/null +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/CompositeReactiveHealthContributorConfigurationReflectionTests.java @@ -0,0 +1,59 @@ +/* + * Copyright 2012-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.actuate.autoconfigure.health; + +import reactor.core.publisher.Mono; + +import org.springframework.boot.actuate.autoconfigure.health.CompositeReactiveHealthContributorConfigurationReflectionTests.TestReactiveHealthIndicator; +import org.springframework.boot.actuate.health.AbstractReactiveHealthIndicator; +import org.springframework.boot.actuate.health.Health; +import org.springframework.boot.actuate.health.Health.Builder; +import org.springframework.boot.actuate.health.ReactiveHealthContributor; + +/** + * Tests for {@link CompositeReactiveHealthContributorConfiguration} using reflection to + * create indicator instances. + * + * @author Phillip Webb + */ +@Deprecated(since = "3.0.0", forRemoval = true) +class CompositeReactiveHealthContributorConfigurationReflectionTests extends + AbstractCompositeHealthContributorConfigurationTests { + + @Override + protected AbstractCompositeHealthContributorConfiguration newComposite() { + return new TestCompositeReactiveHealthContributorConfiguration(); + } + + static class TestCompositeReactiveHealthContributorConfiguration + extends CompositeReactiveHealthContributorConfiguration { + + } + + static class TestReactiveHealthIndicator extends AbstractReactiveHealthIndicator { + + TestReactiveHealthIndicator(TestBean testBean) { + } + + @Override + protected Mono doHealthCheck(Builder builder) { + return Mono.just(builder.up().build()); + } + + } + +} diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/CompositeReactiveHealthContributorConfigurationTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/CompositeReactiveHealthContributorConfigurationTests.java index ce8ca3bc3d9..778a4ad78f0 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/CompositeReactiveHealthContributorConfigurationTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/health/CompositeReactiveHealthContributorConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2022 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,6 +40,10 @@ class CompositeReactiveHealthContributorConfigurationTests extends static class TestCompositeReactiveHealthContributorConfiguration extends CompositeReactiveHealthContributorConfiguration { + TestCompositeReactiveHealthContributorConfiguration() { + super(TestReactiveHealthIndicator::new); + } + } static class TestReactiveHealthIndicator extends AbstractReactiveHealthIndicator {