Skip to content

Commit 9fa85a9

Browse files
committed
Merge pull request #6449 from kazuki43zoo/multi-datasource
* multi-datasource: Add JdbcTemplate only on single DataSource Add TransactionManager only on single DataSource
2 parents 496b3a8 + 5ecb68b commit 9fa85a9

11 files changed

+382
-63
lines changed

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

-27
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,6 @@
4747
import org.springframework.core.Ordered;
4848
import org.springframework.core.annotation.Order;
4949
import org.springframework.core.type.AnnotatedTypeMetadata;
50-
import org.springframework.jdbc.core.JdbcOperations;
51-
import org.springframework.jdbc.core.JdbcTemplate;
52-
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
53-
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
5450
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
5551

5652
/**
@@ -108,29 +104,6 @@ protected static class PooledDataSourceConfiguration {
108104

109105
}
110106

111-
@Configuration
112-
@Conditional(DataSourceAutoConfiguration.DataSourceAvailableCondition.class)
113-
protected static class JdbcTemplateConfiguration {
114-
115-
private final DataSource dataSource;
116-
117-
public JdbcTemplateConfiguration(DataSource dataSource) {
118-
this.dataSource = dataSource;
119-
}
120-
121-
@Bean
122-
@ConditionalOnMissingBean(JdbcOperations.class)
123-
public JdbcTemplate jdbcTemplate() {
124-
return new JdbcTemplate(this.dataSource);
125-
}
126-
127-
@Bean
128-
@ConditionalOnMissingBean(NamedParameterJdbcOperations.class)
129-
public NamedParameterJdbcTemplate namedParameterJdbcTemplate() {
130-
return new NamedParameterJdbcTemplate(this.dataSource);
131-
}
132-
}
133-
134107
@Configuration
135108
@ConditionalOnProperty(prefix = "spring.datasource", name = "jmx-enabled")
136109
@ConditionalOnClass(name = "org.apache.tomcat.jdbc.pool.DataSourceProxy")

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020

2121
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
2222
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
23-
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2423
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2524
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
25+
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
2626
import org.springframework.context.annotation.Bean;
2727
import org.springframework.context.annotation.Configuration;
2828
import org.springframework.core.Ordered;
@@ -46,7 +46,7 @@
4646
public class DataSourceTransactionManagerAutoConfiguration {
4747

4848
@Configuration
49-
@ConditionalOnBean(DataSource.class)
49+
@ConditionalOnSingleCandidate(DataSource.class)
5050
static class DataSourceTransactionManagerConfiguration {
5151

5252
private final DataSource dataSource;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
* Copyright 2012-2016 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.jdbc;
18+
19+
import javax.sql.DataSource;
20+
21+
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
22+
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
23+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
24+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
25+
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
26+
import org.springframework.context.annotation.Bean;
27+
import org.springframework.context.annotation.Configuration;
28+
import org.springframework.jdbc.core.JdbcOperations;
29+
import org.springframework.jdbc.core.JdbcTemplate;
30+
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
31+
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
32+
33+
/**
34+
* {@link EnableAutoConfiguration Auto-configuration} for {@link JdbcTemplate} and
35+
* {@link NamedParameterJdbcTemplate}.
36+
*
37+
* @author Dave Syer
38+
* @author Phillip Webb
39+
* @author Stephane Nicoll
40+
* @author Kazuki Shimizu
41+
* @since 1.4.0
42+
*/
43+
@Configuration
44+
@ConditionalOnClass(DataSource.class)
45+
@ConditionalOnSingleCandidate(DataSource.class)
46+
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
47+
public class JdbcTemplateAutoConfiguration {
48+
49+
private final DataSource dataSource;
50+
51+
public JdbcTemplateAutoConfiguration(DataSource dataSource) {
52+
this.dataSource = dataSource;
53+
}
54+
55+
@Bean
56+
@ConditionalOnMissingBean(JdbcOperations.class)
57+
public JdbcTemplate jdbcTemplate() {
58+
return new JdbcTemplate(this.dataSource);
59+
}
60+
61+
@Bean
62+
@ConditionalOnMissingBean(NamedParameterJdbcOperations.class)
63+
public NamedParameterJdbcTemplate namedParameterJdbcTemplate() {
64+
return new NamedParameterJdbcTemplate(this.dataSource);
65+
}
66+
67+
}

spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\
4949
org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\
5050
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
5151
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
52+
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
5253
org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
5354
org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
5455
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\

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

-31
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,6 @@
4242
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
4343
import org.springframework.context.annotation.Bean;
4444
import org.springframework.context.annotation.Configuration;
45-
import org.springframework.jdbc.core.JdbcTemplate;
46-
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
4745

4846
import static org.assertj.core.api.Assertions.assertThat;
4947
import static org.mockito.Mockito.mock;
@@ -228,35 +226,6 @@ public void testDefaultDataSourceCanBeOverridden() throws Exception {
228226
assertThat(dataSource).isInstanceOf(BasicDataSource.class);
229227
}
230228

231-
@Test
232-
public void testJdbcTemplateExists() throws Exception {
233-
this.context.register(DataSourceAutoConfiguration.class,
234-
PropertyPlaceholderAutoConfiguration.class);
235-
this.context.refresh();
236-
JdbcTemplate jdbcTemplate = this.context.getBean(JdbcTemplate.class);
237-
assertThat(jdbcTemplate).isNotNull();
238-
assertThat(jdbcTemplate.getDataSource()).isNotNull();
239-
}
240-
241-
@Test
242-
public void testJdbcTemplateExistsWithCustomDataSource() throws Exception {
243-
this.context.register(TestDataSourceConfiguration.class,
244-
DataSourceAutoConfiguration.class,
245-
PropertyPlaceholderAutoConfiguration.class);
246-
this.context.refresh();
247-
JdbcTemplate jdbcTemplate = this.context.getBean(JdbcTemplate.class);
248-
assertThat(jdbcTemplate).isNotNull();
249-
assertThat(jdbcTemplate.getDataSource() instanceof BasicDataSource).isTrue();
250-
}
251-
252-
@Test
253-
public void testNamedParameterJdbcTemplateExists() throws Exception {
254-
this.context.register(DataSourceAutoConfiguration.class,
255-
PropertyPlaceholderAutoConfiguration.class);
256-
this.context.refresh();
257-
assertThat(this.context.getBean(NamedParameterJdbcOperations.class)).isNotNull();
258-
}
259-
260229
@SuppressWarnings("unchecked")
261230
private <T extends DataSource> T autoConfigureDataSource(Class<T> expectedType,
262231
final String... hiddenPackages) {

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import org.junit.Before;
2929
import org.junit.Test;
3030

31-
import org.springframework.beans.factory.UnsatisfiedDependencyException;
31+
import org.springframework.beans.factory.BeanCreationException;
3232
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
3333
import org.springframework.boot.context.properties.ConfigurationProperties;
3434
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -223,7 +223,7 @@ public void testDataSourceInitializedWithSchemaCredentials() {
223223
fail("User does not exist");
224224
}
225225
catch (Exception ex) {
226-
assertThat(ex).isInstanceOf(UnsatisfiedDependencyException.class);
226+
assertThat(ex).isInstanceOf(BeanCreationException.class);
227227
}
228228
}
229229

@@ -245,7 +245,7 @@ public void testDataSourceInitializedWithDataCredentials() {
245245
fail("User does not exist");
246246
}
247247
catch (Exception ex) {
248-
assertThat(ex).isInstanceOf(UnsatisfiedDependencyException.class);
248+
assertThat(ex).isInstanceOf(BeanCreationException.class);
249249
}
250250
}
251251

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

+22
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
*
3737
* @author Dave Syer
3838
* @author Stephane Nicoll
39+
* @author Kazuki Shimizu
3940
*/
4041
public class DataSourceTransactionManagerAutoConfigurationTests {
4142

@@ -84,6 +85,27 @@ public void testExistingTransactionManager() {
8485
.isEqualTo(this.context.getBean("myTransactionManager"));
8586
}
8687

88+
@Test
89+
public void testMultiDataSource() throws Exception {
90+
this.context.register(MultiDataSourceConfiguration.class,
91+
DataSourceTransactionManagerAutoConfiguration.class);
92+
this.context.refresh();
93+
assertThat(this.context.getBeansOfType(PlatformTransactionManager.class))
94+
.isEmpty();
95+
assertThat(this.context.getBean(AbstractTransactionManagementConfiguration.class))
96+
.isNotNull();
97+
}
98+
99+
@Test
100+
public void testMultiDataSourceUsingPrimary() throws Exception {
101+
this.context.register(MultiDataSourceUsingPrimaryConfiguration.class,
102+
DataSourceTransactionManagerAutoConfiguration.class);
103+
this.context.refresh();
104+
assertThat(this.context.getBean(DataSourceTransactionManager.class)).isNotNull();
105+
assertThat(this.context.getBean(AbstractTransactionManagementConfiguration.class))
106+
.isNotNull();
107+
}
108+
87109
@EnableTransactionManagement
88110
protected static class SwitchTransactionsOn {
89111

0 commit comments

Comments
 (0)