Skip to content

Commit c0305ec

Browse files
author
Dave Syer
committed
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
1 parent 24c0fce commit c0305ec

File tree

2 files changed

+47
-11
lines changed

2 files changed

+47
-11
lines changed

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration.java

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -58,17 +58,6 @@ public class DataSourceAutoConfiguration {
5858

5959
public static final String CONFIGURATION_PREFIX = "spring.datasource";
6060

61-
@Autowired
62-
private DataSourceProperties properties;
63-
64-
@Autowired(required = false)
65-
private DataSource dataSource;
66-
67-
@Bean
68-
public DataSourceInitializer dataSourceAutoConfigurationInitializer() {
69-
return new DataSourceInitializer();
70-
}
71-
7261
/**
7362
* Determines if the {@code dataSource} being used by Spring was created from
7463
* {@link EmbeddedDataSourceConfiguration}.
@@ -93,6 +82,16 @@ protected static class EmbeddedConfiguration {
9382

9483
}
9584

85+
@Configuration
86+
@ConditionalOnMissingBean(DataSourceInitializer.class)
87+
protected static class DataSourceInitializerConfiguration {
88+
89+
@Bean
90+
public DataSourceInitializer dataSourceInitializer() {
91+
return new DataSourceInitializer();
92+
}
93+
}
94+
9695
@Conditional(DataSourceAutoConfiguration.NonEmbeddedDatabaseCondition.class)
9796
@ConditionalOnMissingBean(DataSource.class)
9897
protected static class NonEmbeddedConfiguration {

spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitializerTests.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,13 @@
2424
import org.junit.Before;
2525
import org.junit.Test;
2626
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
27+
import org.springframework.boot.context.properties.ConfigurationProperties;
28+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
2729
import org.springframework.boot.test.EnvironmentTestUtils;
2830
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
31+
import org.springframework.context.annotation.Bean;
32+
import org.springframework.context.annotation.Configuration;
33+
import org.springframework.context.annotation.Primary;
2934
import org.springframework.jdbc.core.JdbcOperations;
3035
import org.springframework.jdbc.core.JdbcTemplate;
3136
import org.springframework.util.ClassUtils;
@@ -67,6 +72,19 @@ public void testDefaultDataSourceDoesNotExists() throws Exception {
6772
assertEquals(0, this.context.getBeanNamesForType(DataSource.class).length);
6873
}
6974

75+
@Test
76+
public void testTwoDataSources() throws Exception {
77+
EnvironmentTestUtils.addEnvironment(this.context,
78+
"datasource.one.url=jdbc:hsqldb:mem:/one",
79+
"datasource.one.driverClassName=org.hsqldb.Driver",
80+
"datasource.two.url=jdbc:hsqldb:mem:/two",
81+
"datasource.two.driverClassName=org.hsqldb.Driver");
82+
this.context.register(TwoDataSources.class, DataSourceInitializer.class,
83+
PropertyPlaceholderAutoConfiguration.class, DataSourceProperties.class);
84+
this.context.refresh();
85+
assertEquals(2, this.context.getBeanNamesForType(DataSource.class).length);
86+
}
87+
7088
@Test
7189
public void testDataSourceInitialized() throws Exception {
7290
EnvironmentTestUtils.addEnvironment(this.context,
@@ -125,4 +143,23 @@ public void testDataSourceInitializedWithMultipleScripts() throws Exception {
125143
template.queryForObject("SELECT COUNT(*) from SPAM", Integer.class));
126144
}
127145

146+
@Configuration
147+
@EnableConfigurationProperties
148+
protected static class TwoDataSources {
149+
150+
@Bean
151+
@Primary
152+
@ConfigurationProperties(prefix = "datasource.one")
153+
public DataSource oneDataSource() {
154+
return DataSourceBuilder.create().build();
155+
}
156+
157+
@Bean
158+
@ConfigurationProperties(prefix = "datasource.two")
159+
public DataSource twoDataSource() {
160+
return DataSourceBuilder.create().build();
161+
}
162+
163+
}
164+
128165
}

0 commit comments

Comments
 (0)