Merge branch '3.4.x'
Closes gh-44762
This commit is contained in:
@@ -89,7 +89,7 @@ public class DataSourceHealthContributorAutoConfiguration implements Initializin
|
||||
public HealthContributor dbHealthContributor(ConfigurableListableBeanFactory beanFactory,
|
||||
DataSourceHealthIndicatorProperties dataSourceHealthIndicatorProperties) {
|
||||
Map<String, DataSource> dataSources = SimpleAutowireCandidateResolver.resolveAutowireCandidates(beanFactory,
|
||||
DataSource.class);
|
||||
DataSource.class, false, true);
|
||||
if (dataSourceHealthIndicatorProperties.isIgnoreRoutingDataSources()) {
|
||||
Map<String, DataSource> filteredDatasources = dataSources.entrySet()
|
||||
.stream()
|
||||
|
||||
@@ -72,9 +72,8 @@ public class DataSourcePoolMetricsAutoConfiguration {
|
||||
@Bean
|
||||
DataSourcePoolMetadataMeterBinder dataSourcePoolMetadataMeterBinder(ConfigurableListableBeanFactory beanFactory,
|
||||
ObjectProvider<DataSourcePoolMetadataProvider> metadataProviders) {
|
||||
return new DataSourcePoolMetadataMeterBinder(
|
||||
SimpleAutowireCandidateResolver.resolveAutowireCandidates(beanFactory, DataSource.class),
|
||||
metadataProviders);
|
||||
return new DataSourcePoolMetadataMeterBinder(SimpleAutowireCandidateResolver
|
||||
.resolveAutowireCandidates(beanFactory, DataSource.class, false, true), metadataProviders);
|
||||
}
|
||||
|
||||
static class DataSourcePoolMetadataMeterBinder implements MeterBinder {
|
||||
@@ -141,7 +140,7 @@ public class DataSourcePoolMetricsAutoConfiguration {
|
||||
|
||||
@Override
|
||||
public void bindTo(MeterRegistry registry) {
|
||||
this.dataSources.stream(ObjectProvider.UNFILTERED).forEach((dataSource) -> {
|
||||
this.dataSources.stream(ObjectProvider.UNFILTERED, false).forEach((dataSource) -> {
|
||||
HikariDataSource hikariDataSource = DataSourceUnwrapper.unwrap(dataSource, HikariConfigMXBean.class,
|
||||
HikariDataSource.class);
|
||||
if (hikariDataSource != null) {
|
||||
|
||||
@@ -19,12 +19,15 @@ package org.springframework.boot.actuate.autoconfigure.jdbc;
|
||||
import java.sql.SQLException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import com.zaxxer.hikari.HikariDataSource;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.beans.BeansException;
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.beans.factory.config.BeanPostProcessor;
|
||||
import org.springframework.boot.actuate.autoconfigure.health.HealthContributorAutoConfiguration;
|
||||
import org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthContributorAutoConfiguration.RoutingDataSourceHealthContributor;
|
||||
@@ -41,6 +44,7 @@ import org.springframework.boot.jdbc.DataSourceBuilder;
|
||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
@@ -213,6 +217,16 @@ class DataSourceHealthContributorAutoConfigurationTests {
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void prototypeDataSourceIsIgnored() {
|
||||
this.contextRunner
|
||||
.withUserConfiguration(EmbeddedDataSourceConfiguration.class, PrototypeDataSourceConfiguration.class)
|
||||
.run((context) -> {
|
||||
assertThat(context).doesNotHaveBean(CompositeHealthContributor.class);
|
||||
assertThat(context.getBeansOfType(DataSourceHealthIndicator.class)).hasSize(1);
|
||||
});
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@EnableConfigurationProperties
|
||||
static class DataSourceConfig {
|
||||
@@ -317,4 +331,26 @@ class DataSourceHealthContributorAutoConfigurationTests {
|
||||
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
static class PrototypeDataSourceConfiguration {
|
||||
|
||||
@Bean
|
||||
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
|
||||
DataSource dataSourcePrototype(String username, String password) {
|
||||
return createHikariDataSource(username, password);
|
||||
}
|
||||
|
||||
private HikariDataSource createHikariDataSource(String username, String password) {
|
||||
String url = "jdbc:hsqldb:mem:test-" + UUID.randomUUID();
|
||||
HikariDataSource hikariDataSource = DataSourceBuilder.create()
|
||||
.url(url)
|
||||
.type(HikariDataSource.class)
|
||||
.username(username)
|
||||
.password(password)
|
||||
.build();
|
||||
return hikariDataSource;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@ import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.aop.framework.ProxyFactory;
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.beans.factory.config.BeanPostProcessor;
|
||||
import org.springframework.boot.LazyInitializationBeanFactoryPostProcessor;
|
||||
import org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun;
|
||||
@@ -39,6 +40,7 @@ import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadataProvider;
|
||||
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.springframework.core.Ordered;
|
||||
import org.springframework.core.PriorityOrdered;
|
||||
import org.springframework.jdbc.datasource.DelegatingDataSource;
|
||||
@@ -222,6 +224,19 @@ class DataSourcePoolMetricsAutoConfigurationTests {
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void prototypeDataSourceIsIgnored() {
|
||||
this.contextRunner
|
||||
.withUserConfiguration(OneHikariDataSourceConfiguration.class, PrototypeDataSourceConfiguration.class)
|
||||
.run((context) -> {
|
||||
context.getBean("hikariDataSource", DataSource.class).getConnection();
|
||||
((DataSource) context.getBean("prototypeDataSource", "", "")).getConnection();
|
||||
MeterRegistry registry = context.getBean(MeterRegistry.class);
|
||||
assertThat(registry.get("hikaricp.connections").meter().getId().getTags())
|
||||
.containsExactly(Tag.of("pool", "hikariDataSource"));
|
||||
});
|
||||
}
|
||||
|
||||
private static HikariDataSource createHikariDataSource(String poolName) {
|
||||
String url = "jdbc:hsqldb:mem:test-" + UUID.randomUUID();
|
||||
HikariDataSource hikariDataSource = DataSourceBuilder.create().url(url).type(HikariDataSource.class).build();
|
||||
@@ -334,6 +349,28 @@ class DataSourcePoolMetricsAutoConfigurationTests {
|
||||
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
static class PrototypeDataSourceConfiguration {
|
||||
|
||||
@Bean
|
||||
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
|
||||
DataSource prototypeDataSource(String username, String password) {
|
||||
return createHikariDataSource(username, password);
|
||||
}
|
||||
|
||||
private HikariDataSource createHikariDataSource(String username, String password) {
|
||||
String url = "jdbc:hsqldb:mem:test-" + UUID.randomUUID();
|
||||
HikariDataSource hikariDataSource = DataSourceBuilder.create()
|
||||
.url(url)
|
||||
.type(HikariDataSource.class)
|
||||
.username(username)
|
||||
.password(password)
|
||||
.build();
|
||||
return hikariDataSource;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
static class HikariSealingConfiguration {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user