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:
Dave Syer
2014-06-26 09:48:15 +01:00
parent 24c0fce0f0
commit c0305ecbbb
2 changed files with 47 additions and 11 deletions

View File

@@ -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 {

View File

@@ -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();
}
}
}