From 9fbb664db6edb238aa48da93f1a5883b85909df4 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Wed, 11 Mar 2020 13:48:58 +0000 Subject: [PATCH] Avoid eager init when evaluating DevToolsDataSourceCondition Previously, DevToolsDataSourceCondition called getBeanNamesForType(Class) which could trigger unwanted initialization of lazy init singletons and objects created by FactoryBeans. This commit updates DevToolsDataSourceCondition to prohibit eager init when getting the names of the beans of a particular type. Fixes gh-20430 --- .../autoconfigure/DevToolsDataSourceAutoConfiguration.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/autoconfigure/DevToolsDataSourceAutoConfiguration.java b/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/autoconfigure/DevToolsDataSourceAutoConfiguration.java index 6bbffe04eeb..5cc6489ec86 100644 --- a/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/autoconfigure/DevToolsDataSourceAutoConfiguration.java +++ b/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/autoconfigure/DevToolsDataSourceAutoConfiguration.java @@ -180,11 +180,11 @@ public class DevToolsDataSourceAutoConfiguration { @Override public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { ConditionMessage.Builder message = ConditionMessage.forCondition("DevTools DataSource Condition"); - String[] dataSourceBeanNames = context.getBeanFactory().getBeanNamesForType(DataSource.class); + String[] dataSourceBeanNames = context.getBeanFactory().getBeanNamesForType(DataSource.class, true, false); if (dataSourceBeanNames.length != 1) { return ConditionOutcome.noMatch(message.didNotFind("a single DataSource bean").atAll()); } - if (context.getBeanFactory().getBeanNamesForType(DataSourceProperties.class).length != 1) { + if (context.getBeanFactory().getBeanNamesForType(DataSourceProperties.class, true, false).length != 1) { return ConditionOutcome.noMatch(message.didNotFind("a single DataSourceProperties bean").atAll()); } BeanDefinition dataSourceDefinition = context.getRegistry().getBeanDefinition(dataSourceBeanNames[0]);