diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration.java index 422b54f8c6..e07915bb24 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration.java @@ -51,7 +51,7 @@ import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; * @author Phillip Webb */ @Configuration -@ConditionalOnClass(EmbeddedDatabaseType.class) +@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) @EnableConfigurationProperties(DataSourceProperties.class) @Import(Registrar.class) public class DataSourceAutoConfiguration { @@ -73,7 +73,7 @@ public class DataSourceAutoConfiguration { } } - @Conditional(DataSourceAutoConfiguration.EmbeddedDatabaseCondition.class) + @Conditional(DataSourceAutoConfiguration.EmbeddedDataSourceCondition.class) @ConditionalOnMissingBean(DataSource.class) @Import(EmbeddedDataSourceConfiguration.class) protected static class EmbeddedConfiguration { @@ -88,9 +88,10 @@ public class DataSourceAutoConfiguration { public DataSourceInitializer dataSourceInitializer() { return new DataSourceInitializer(); } + } - @Conditional(DataSourceAutoConfiguration.NonEmbeddedDatabaseCondition.class) + @Conditional(DataSourceAutoConfiguration.NonEmbeddedDataSourceCondition.class) @ConditionalOnMissingBean(DataSource.class) protected static class NonEmbeddedConfiguration { @@ -112,7 +113,7 @@ public class DataSourceAutoConfiguration { } @Configuration - @Conditional(DataSourceAutoConfiguration.DatabaseCondition.class) + @Conditional(DataSourceAutoConfiguration.DataSourceAvailableCondition.class) protected static class JdbcTemplateConfiguration { @Autowired(required = false) @@ -133,19 +134,17 @@ public class DataSourceAutoConfiguration { } /** - * Base {@link Condition} for non-embedded database checks. + * {@link Condition} to test is a supported non-embedded {@link DataSource} type is + * available. */ - static class NonEmbeddedDatabaseCondition extends SpringBootCondition { + static class NonEmbeddedDataSourceCondition extends SpringBootCondition { @Override public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { - - ClassLoader dataSourceClassLoader = getDataSourceClassLoader(context); - if (dataSourceClassLoader != null) { - return ConditionOutcome.match("Supported DataSource class found"); + if (getDataSourceClassLoader(context) != null) { + return ConditionOutcome.match("supported DataSource class found"); } - return ConditionOutcome.noMatch("missing supported DataSource"); } @@ -156,20 +155,16 @@ public class DataSourceAutoConfiguration { private ClassLoader getDataSourceClassLoader(ConditionContext context) { Class dataSourceClass = new DataSourceBuilder(context.getClassLoader()) .findType(); - if (dataSourceClass == null) { - return null; - } - return dataSourceClass.getClassLoader(); + return (dataSourceClass == null ? null : dataSourceClass.getClassLoader()); } - } /** - * {@link Condition} to detect when an embedded database is used. + * {@link Condition} to detect when an embedded {@link DataSource} type can be used. */ - static class EmbeddedDatabaseCondition extends SpringBootCondition { + static class EmbeddedDataSourceCondition extends SpringBootCondition { - private final SpringBootCondition nonEmbedded = new NonEmbeddedDatabaseCondition(); + private final SpringBootCondition nonEmbedded = new NonEmbeddedDataSourceCondition(); @Override public ConditionOutcome getMatchOutcome(ConditionContext context, @@ -189,27 +184,25 @@ public class DataSourceAutoConfiguration { } /** - * {@link Condition} to detect when a database is configured. + * {@link Condition} to detect when a {@link DataSource} is available (either because + * the user provided one or because one will be auto-configured) */ - static class DatabaseCondition extends SpringBootCondition { + static class DataSourceAvailableCondition extends SpringBootCondition { - private final SpringBootCondition nonEmbedded = new NonEmbeddedDatabaseCondition(); + private final SpringBootCondition nonEmbedded = new NonEmbeddedDataSourceCondition(); - private final SpringBootCondition embeddedCondition = new EmbeddedDatabaseCondition(); + private final SpringBootCondition embeddedCondition = new EmbeddedDataSourceCondition(); @Override public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { - + if (hasBean(context, DataSource.class)) { + return ConditionOutcome + .match("existing bean configured database detected"); + } if (anyMatches(context, metadata, this.nonEmbedded, this.embeddedCondition)) { return ConditionOutcome.match("existing auto database detected"); } - - if (hasBean(context, DataSource.class)) { - return ConditionOutcome - .match("Existing bean configured database detected"); - } - return ConditionOutcome.noMatch("no existing bean configured database"); } diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceBuilder.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceBuilder.java index 3459539d4c..cecc04a3c0 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceBuilder.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceBuilder.java @@ -112,16 +112,18 @@ public class DataSourceBuilder { return this; } + @SuppressWarnings("unchecked") public Class findType() { if (this.type != null) { return this.type; } for (String name : DATA_SOURCE_TYPE_NAMES) { - if (ClassUtils.isPresent(name, this.classLoader)) { - @SuppressWarnings("unchecked") - Class resolved = (Class) ClassUtils - .resolveClassName(name, this.classLoader); - return resolved; + try { + return (Class) ClassUtils.forName(name, + this.classLoader); + } + catch (Exception ex) { + // Swallow and continue } } return null; diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceProperties.java index d2e7e0e811..de3524f452 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceProperties.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceProperties.java @@ -211,4 +211,5 @@ public class DataSourceProperties implements BeanClassLoaderAware, InitializingB public ClassLoader getClassLoader() { return this.classLoader; } + } diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfiguration.java index c4f6148a74..5f187fbece 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfiguration.java @@ -19,13 +19,10 @@ package org.springframework.boot.autoconfigure.jms; import javax.jms.ConnectionFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration; -import org.springframework.boot.autoconfigure.jms.hornetq.HornetQAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -45,7 +42,6 @@ import org.springframework.jms.core.JmsTemplate; @ConditionalOnClass(JmsTemplate.class) @ConditionalOnBean(ConnectionFactory.class) @EnableConfigurationProperties(JmsProperties.class) -@AutoConfigureAfter({ HornetQAutoConfiguration.class, ActiveMQAutoConfiguration.class }) public class JmsAutoConfiguration { @Autowired