1
1
/*
2
- * Copyright 2012-2020 the original author or authors.
2
+ * Copyright 2012-2023 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
24
24
import oracle .jdbc .OracleConnection ;
25
25
import oracle .ucp .jdbc .PoolDataSourceImpl ;
26
26
27
+ import org .springframework .beans .factory .ObjectProvider ;
28
+ import org .springframework .boot .autoconfigure .condition .ConditionalOnBean ;
27
29
import org .springframework .boot .autoconfigure .condition .ConditionalOnClass ;
28
30
import org .springframework .boot .autoconfigure .condition .ConditionalOnMissingBean ;
29
31
import org .springframework .boot .autoconfigure .condition .ConditionalOnProperty ;
30
32
import org .springframework .boot .context .properties .ConfigurationProperties ;
33
+ import org .springframework .boot .jdbc .DataSourceBuilder ;
31
34
import org .springframework .boot .jdbc .DatabaseDriver ;
32
35
import org .springframework .context .annotation .Bean ;
33
36
import org .springframework .context .annotation .Configuration ;
40
43
* @author Phillip Webb
41
44
* @author Stephane Nicoll
42
45
* @author Fabio Grassi
46
+ * @author Moritz Halbritter
47
+ * @author Andy Wilkinson
43
48
*/
44
49
abstract class DataSourceConfiguration {
45
50
@@ -48,6 +53,17 @@ protected static <T> T createDataSource(DataSourceProperties properties, Class<?
48
53
return (T ) properties .initializeDataSourceBuilder ().type (type ).build ();
49
54
}
50
55
56
+ @ SuppressWarnings ("unchecked" )
57
+ protected static <T > T createDataSource (JdbcConnectionDetails connectionDetails , Class <? extends DataSource > type ,
58
+ ClassLoader classLoader ) {
59
+ return (T ) DataSourceBuilder .create (classLoader )
60
+ .url (connectionDetails .getJdbcUrl ())
61
+ .username (connectionDetails .getUsername ())
62
+ .password (connectionDetails .getPassword ())
63
+ .type (type )
64
+ .build ();
65
+ }
66
+
51
67
/**
52
68
* Tomcat Pool DataSource configuration.
53
69
*/
@@ -58,13 +74,26 @@ protected static <T> T createDataSource(DataSourceProperties properties, Class<?
58
74
matchIfMissing = true )
59
75
static class Tomcat {
60
76
77
+ @ Bean
78
+ @ ConditionalOnBean (JdbcConnectionDetails .class )
79
+ static TomcatJdbcConnectionDetailsBeanPostProcessor tomcatJdbcConnectionDetailsBeanPostProcessor (
80
+ ObjectProvider <JdbcConnectionDetails > connectionDetailsProvider ) {
81
+ return new TomcatJdbcConnectionDetailsBeanPostProcessor (connectionDetailsProvider );
82
+ }
83
+
61
84
@ Bean
62
85
@ ConfigurationProperties (prefix = "spring.datasource.tomcat" )
63
- org .apache .tomcat .jdbc .pool .DataSource dataSource (DataSourceProperties properties ) {
64
- org .apache .tomcat .jdbc .pool .DataSource dataSource = createDataSource (properties ,
65
- org .apache .tomcat .jdbc .pool .DataSource .class );
66
- DatabaseDriver databaseDriver = DatabaseDriver .fromJdbcUrl (properties .determineUrl ());
67
- String validationQuery = databaseDriver .getValidationQuery ();
86
+ org .apache .tomcat .jdbc .pool .DataSource dataSource (DataSourceProperties properties ,
87
+ ObjectProvider <JdbcConnectionDetails > connectionDetailsProvider ) {
88
+ JdbcConnectionDetails connectionDetails = connectionDetailsProvider .getIfAvailable ();
89
+ Class <? extends DataSource > dataSourceType = org .apache .tomcat .jdbc .pool .DataSource .class ;
90
+ org .apache .tomcat .jdbc .pool .DataSource dataSource = (connectionDetails != null )
91
+ ? createDataSource (connectionDetails , dataSourceType , properties .getClassLoader ())
92
+ : createDataSource (properties , dataSourceType );
93
+ String validationQuery ;
94
+ String url = (connectionDetails != null ) ? connectionDetails .getJdbcUrl () : properties .determineUrl ();
95
+ DatabaseDriver databaseDriver = DatabaseDriver .fromJdbcUrl (url );
96
+ validationQuery = databaseDriver .getValidationQuery ();
68
97
if (validationQuery != null ) {
69
98
dataSource .setTestOnBorrow (true );
70
99
dataSource .setValidationQuery (validationQuery );
@@ -84,10 +113,21 @@ org.apache.tomcat.jdbc.pool.DataSource dataSource(DataSourceProperties propertie
84
113
matchIfMissing = true )
85
114
static class Hikari {
86
115
116
+ @ Bean
117
+ @ ConditionalOnBean (JdbcConnectionDetails .class )
118
+ static HikariJdbcConnectionDetailsBeanPostProcessor jdbcConnectionDetailsHikariBeanPostProcessor (
119
+ ObjectProvider <JdbcConnectionDetails > connectionDetailsProvider ) {
120
+ return new HikariJdbcConnectionDetailsBeanPostProcessor (connectionDetailsProvider );
121
+ }
122
+
87
123
@ Bean
88
124
@ ConfigurationProperties (prefix = "spring.datasource.hikari" )
89
- HikariDataSource dataSource (DataSourceProperties properties ) {
90
- HikariDataSource dataSource = createDataSource (properties , HikariDataSource .class );
125
+ HikariDataSource dataSource (DataSourceProperties properties ,
126
+ ObjectProvider <JdbcConnectionDetails > connectionDetailsProvider ) {
127
+ JdbcConnectionDetails connectionDetails = connectionDetailsProvider .getIfAvailable ();
128
+ HikariDataSource dataSource = (connectionDetails != null )
129
+ ? createDataSource (connectionDetails , HikariDataSource .class , properties .getClassLoader ())
130
+ : createDataSource (properties , HikariDataSource .class );
91
131
if (StringUtils .hasText (properties .getName ())) {
92
132
dataSource .setPoolName (properties .getName ());
93
133
}
@@ -106,10 +146,22 @@ HikariDataSource dataSource(DataSourceProperties properties) {
106
146
matchIfMissing = true )
107
147
static class Dbcp2 {
108
148
149
+ @ Bean
150
+ @ ConditionalOnBean (JdbcConnectionDetails .class )
151
+ static Dbcp2JdbcConnectionDetailsBeanPostProcessor dbcp2JdbcConnectionDetailsBeanPostProcessor (
152
+ ObjectProvider <JdbcConnectionDetails > connectionDetailsProvider ) {
153
+ return new Dbcp2JdbcConnectionDetailsBeanPostProcessor (connectionDetailsProvider );
154
+ }
155
+
109
156
@ Bean
110
157
@ ConfigurationProperties (prefix = "spring.datasource.dbcp2" )
111
- org .apache .commons .dbcp2 .BasicDataSource dataSource (DataSourceProperties properties ) {
112
- return createDataSource (properties , org .apache .commons .dbcp2 .BasicDataSource .class );
158
+ org .apache .commons .dbcp2 .BasicDataSource dataSource (DataSourceProperties properties ,
159
+ ObjectProvider <JdbcConnectionDetails > connectionDetailsProvider ) {
160
+ JdbcConnectionDetails connectionDetails = connectionDetailsProvider .getIfAvailable ();
161
+ Class <? extends DataSource > dataSourceType = org .apache .commons .dbcp2 .BasicDataSource .class ;
162
+ return (connectionDetails != null )
163
+ ? createDataSource (connectionDetails , dataSourceType , properties .getClassLoader ())
164
+ : createDataSource (properties , dataSourceType );
113
165
}
114
166
115
167
}
@@ -124,10 +176,21 @@ org.apache.commons.dbcp2.BasicDataSource dataSource(DataSourceProperties propert
124
176
matchIfMissing = true )
125
177
static class OracleUcp {
126
178
179
+ @ Bean
180
+ @ ConditionalOnBean (JdbcConnectionDetails .class )
181
+ static OracleUcpJdbcConnectionDetailsBeanPostProcessor oracleUcpJdbcConnectionDetailsBeanPostProcessor (
182
+ ObjectProvider <JdbcConnectionDetails > connectionDetailsProvider ) {
183
+ return new OracleUcpJdbcConnectionDetailsBeanPostProcessor (connectionDetailsProvider );
184
+ }
185
+
127
186
@ Bean
128
187
@ ConfigurationProperties (prefix = "spring.datasource.oracleucp" )
129
- PoolDataSourceImpl dataSource (DataSourceProperties properties ) throws SQLException {
130
- PoolDataSourceImpl dataSource = createDataSource (properties , PoolDataSourceImpl .class );
188
+ PoolDataSourceImpl dataSource (DataSourceProperties properties ,
189
+ ObjectProvider <JdbcConnectionDetails > connectionDetailsProvider ) throws SQLException {
190
+ JdbcConnectionDetails connectionDetails = connectionDetailsProvider .getIfAvailable ();
191
+ PoolDataSourceImpl dataSource = (connectionDetails != null )
192
+ ? createDataSource (connectionDetails , PoolDataSourceImpl .class , properties .getClassLoader ())
193
+ : createDataSource (properties , PoolDataSourceImpl .class );
131
194
dataSource .setValidateConnectionOnBorrow (true );
132
195
if (StringUtils .hasText (properties .getName ())) {
133
196
dataSource .setConnectionPoolName (properties .getName ());
@@ -146,7 +209,17 @@ PoolDataSourceImpl dataSource(DataSourceProperties properties) throws SQLExcepti
146
209
static class Generic {
147
210
148
211
@ Bean
149
- DataSource dataSource (DataSourceProperties properties ) {
212
+ DataSource dataSource (DataSourceProperties properties ,
213
+ ObjectProvider <JdbcConnectionDetails > connectionDetailsProvider ) {
214
+ JdbcConnectionDetails connectionDetails = connectionDetailsProvider .getIfAvailable ();
215
+ if (connectionDetails != null ) {
216
+ return DataSourceBuilder .create (properties .getClassLoader ())
217
+ .url (connectionDetails .getJdbcUrl ())
218
+ .username (connectionDetails .getUsername ())
219
+ .password (connectionDetails .getPassword ())
220
+ .type (properties .getType ())
221
+ .build ();
222
+ }
150
223
return properties .initializeDataSourceBuilder ().build ();
151
224
}
152
225
0 commit comments