Take care registering DataSourceInitializer
The DataSourceInitializer is instantiated early by the DataSourceInitializerPostProcessor, so it has to live in isolation (in its own @Configuration) to prevent early instantiation of the DataSourceAutoConfiguration. Fixes gh-1166
This commit is contained in:
@@ -58,17 +58,6 @@ public class DataSourceAutoConfiguration {
|
||||
|
||||
public static final String CONFIGURATION_PREFIX = "spring.datasource";
|
||||
|
||||
@Autowired
|
||||
private DataSourceProperties properties;
|
||||
|
||||
@Autowired(required = false)
|
||||
private DataSource dataSource;
|
||||
|
||||
@Bean
|
||||
public DataSourceInitializer dataSourceAutoConfigurationInitializer() {
|
||||
return new DataSourceInitializer();
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the {@code dataSource} being used by Spring was created from
|
||||
* {@link EmbeddedDataSourceConfiguration}.
|
||||
@@ -93,6 +82,16 @@ public class DataSourceAutoConfiguration {
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@ConditionalOnMissingBean(DataSourceInitializer.class)
|
||||
protected static class DataSourceInitializerConfiguration {
|
||||
|
||||
@Bean
|
||||
public DataSourceInitializer dataSourceInitializer() {
|
||||
return new DataSourceInitializer();
|
||||
}
|
||||
}
|
||||
|
||||
@Conditional(DataSourceAutoConfiguration.NonEmbeddedDatabaseCondition.class)
|
||||
@ConditionalOnMissingBean(DataSource.class)
|
||||
protected static class NonEmbeddedConfiguration {
|
||||
|
||||
@@ -24,8 +24,13 @@ import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.boot.test.EnvironmentTestUtils;
|
||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Primary;
|
||||
import org.springframework.jdbc.core.JdbcOperations;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
import org.springframework.util.ClassUtils;
|
||||
@@ -67,6 +72,19 @@ public class DataSourceInitializerTests {
|
||||
assertEquals(0, this.context.getBeanNamesForType(DataSource.class).length);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTwoDataSources() throws Exception {
|
||||
EnvironmentTestUtils.addEnvironment(this.context,
|
||||
"datasource.one.url=jdbc:hsqldb:mem:/one",
|
||||
"datasource.one.driverClassName=org.hsqldb.Driver",
|
||||
"datasource.two.url=jdbc:hsqldb:mem:/two",
|
||||
"datasource.two.driverClassName=org.hsqldb.Driver");
|
||||
this.context.register(TwoDataSources.class, DataSourceInitializer.class,
|
||||
PropertyPlaceholderAutoConfiguration.class, DataSourceProperties.class);
|
||||
this.context.refresh();
|
||||
assertEquals(2, this.context.getBeanNamesForType(DataSource.class).length);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDataSourceInitialized() throws Exception {
|
||||
EnvironmentTestUtils.addEnvironment(this.context,
|
||||
@@ -125,4 +143,23 @@ public class DataSourceInitializerTests {
|
||||
template.queryForObject("SELECT COUNT(*) from SPAM", Integer.class));
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@EnableConfigurationProperties
|
||||
protected static class TwoDataSources {
|
||||
|
||||
@Bean
|
||||
@Primary
|
||||
@ConfigurationProperties(prefix = "datasource.one")
|
||||
public DataSource oneDataSource() {
|
||||
return DataSourceBuilder.create().build();
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConfigurationProperties(prefix = "datasource.two")
|
||||
public DataSource twoDataSource() {
|
||||
return DataSourceBuilder.create().build();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user