Commit c0305ecb authored by Dave Syer's avatar Dave Syer

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
parent 24c0fce0
......@@ -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();
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment