Skip to content

Commit b7ee1bb

Browse files
schauderodrotbohm
authored andcommitted
DATAJDBC-395 - AbstractJdbcConfiguration no longer registers a bean of type DataAccessStrategy.
This avoids having multiple beans of that type in an ApplicationContext when a custom DataAccessStrategy needs to be provided. Original pull request: #160.
1 parent 275f1a1 commit b7ee1bb

File tree

2 files changed

+54
-21
lines changed

2 files changed

+54
-21
lines changed

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/config/AbstractJdbcConfiguration.java

Lines changed: 51 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.util.Optional;
1919

20+
import org.springframework.beans.factory.ObjectProvider;
2021
import org.springframework.context.ApplicationEventPublisher;
2122
import org.springframework.context.annotation.Bean;
2223
import org.springframework.context.annotation.Configuration;
@@ -51,6 +52,8 @@
5152
@Configuration
5253
public abstract class AbstractJdbcConfiguration {
5354

55+
private DefaultDataAccessStrategy defaultDataAccessStrategy = null;
56+
5457
/**
5558
* Register a {@link RelationalMappingContext} and apply an optional {@link NamingStrategy}.
5659
*
@@ -76,17 +79,28 @@ public JdbcMappingContext jdbcMappingContext(Optional<NamingStrategy> namingStra
7679
*/
7780
@Bean
7881
public JdbcConverter jdbcConverter(RelationalMappingContext mappingContext, NamedParameterJdbcOperations operations,
79-
@Lazy RelationResolver relationResolver) {
82+
ObjectProvider<RelationResolver> relationResolverProvider, Optional<NamingStrategy> namingStrategy,
83+
JdbcConverter jdbcConverter) {
84+
85+
RelationResolver relationResolver = relationResolverProvider.getIfAvailable(() -> dataAccessStrategy( //
86+
operations, //
87+
jdbcConverter, //
88+
jdbcMappingContext(namingStrategy)) //
89+
);
8090

81-
return new BasicJdbcConverter(mappingContext, relationResolver, jdbcCustomConversions(),
82-
new DefaultJdbcTypeFactory(operations.getJdbcOperations()));
91+
return new BasicJdbcConverter( //
92+
mappingContext, //
93+
relationResolver, //
94+
jdbcCustomConversions(), //
95+
new DefaultJdbcTypeFactory(operations.getJdbcOperations()) //
96+
);
8397
}
8498

8599
/**
86100
* Register custom {@link Converter}s in a {@link JdbcCustomConversions} object if required. These
87101
* {@link JdbcCustomConversions} will be registered with the
88-
* {@link #jdbcConverter(RelationalMappingContext, NamedParameterJdbcOperations, RelationResolver)}. Returns an empty
89-
* {@link JdbcCustomConversions} instance by default.
102+
* {@link #jdbcConverter(RelationalMappingContext, NamedParameterJdbcOperations, ObjectProvider, Optional, JdbcConverter)}.
103+
* Returns an empty {@link JdbcCustomConversions} instance by default.
90104
*
91105
* @return must not be {@literal null}.
92106
*/
@@ -106,26 +120,45 @@ public JdbcCustomConversions jdbcCustomConversions() {
106120
*/
107121
@Bean
108122
public JdbcAggregateTemplate jdbcAggregateTemplate(ApplicationEventPublisher publisher,
109-
RelationalMappingContext context, JdbcConverter converter, DataAccessStrategy dataAccessStrategy) {
123+
RelationalMappingContext context, JdbcConverter converter,
124+
ObjectProvider<DataAccessStrategy> dataAccessStrategyProvider, NamedParameterJdbcOperations operations,
125+
Optional<NamingStrategy> namingStrategy, @Lazy JdbcConverter jdbcConverter) {
126+
127+
DataAccessStrategy dataAccessStrategy = dataAccessStrategyProvider.getIfAvailable(() -> dataAccessStrategy( //
128+
operations, //
129+
jdbcConverter, //
130+
jdbcMappingContext(namingStrategy)) //
131+
);
110132

111-
return new JdbcAggregateTemplate(publisher, context, converter, dataAccessStrategy);
133+
return new JdbcAggregateTemplate( //
134+
publisher, //
135+
context, //
136+
converter, //
137+
dataAccessStrategy //
138+
);
112139
}
113140

114141
/**
115-
* Register a {@link DataAccessStrategy} as a bean for reuse in the {@link JdbcAggregateOperations} and the
116-
* {@link RelationalConverter}.
142+
* Create a {@link DataAccessStrategy} for reuse in the {@link JdbcAggregateOperations} and the
143+
* {@link RelationalConverter}. It will return the same instance if called multiple times, regardless of the arguments
144+
* provided. Register a bean of type {@link DataAccessStrategy} if your use case requires a more specialized
145+
* DataAccessStrategy.
117146
*
118-
* @param operations
119-
* @param namingStrategy
120-
* @param jdbcConverter
121-
* @return
147+
* @return Guaranteed to be not {@literal null}.
122148
*/
123-
@Bean
124-
public DataAccessStrategy dataAccessStrategy(NamedParameterJdbcOperations operations,
125-
Optional<NamingStrategy> namingStrategy, JdbcConverter jdbcConverter) {
149+
private DataAccessStrategy dataAccessStrategy(NamedParameterJdbcOperations operations, JdbcConverter jdbcConverter,
150+
JdbcMappingContext context) {
151+
152+
if (defaultDataAccessStrategy == null) {
126153

127-
JdbcMappingContext context = jdbcMappingContext(namingStrategy);
128-
return new DefaultDataAccessStrategy(new SqlGeneratorSource(context), context, jdbcConverter, operations);
154+
defaultDataAccessStrategy = new DefaultDataAccessStrategy( //
155+
new SqlGeneratorSource(context), //
156+
context, //
157+
jdbcConverter, //
158+
operations //
159+
);
160+
}
161+
return defaultDataAccessStrategy;
129162
}
130163

131164
}

src/main/asciidoc/jdbc.adoc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,16 +153,16 @@ References between those should be encoded as simple `id` values, which should m
153153
[[jdbc.entity-persistence.custom-converters]]
154154
=== Custom converters
155155

156-
Custom converters can be registered, for types that are not supported by default, by inheriting your configuration from `JdbcConfiguration` and overwriting the method `jdbcCustomConversions()`.
156+
Custom converters can be registered, for types that are not supported by default, by inheriting your configuration from `AbstractJdbcConfiguration` and overwriting the method `jdbcCustomConversions()`.
157157

158158
====
159159
[source, java]
160160
----
161161
@Configuration
162-
public class DataJdbcConfiguration extends JdbcConfiguration {
162+
public class DataJdbcConfiguration extends AbstractJdbcConfiguration {
163163
164164
@Override
165-
protected JdbcCustomConversions jdbcCustomConversions() {
165+
public JdbcCustomConversions jdbcCustomConversions() {
166166
167167
return new JdbcCustomConversions(Collections.singletonList(TimestampTzToDateConverter.INSTANCE));
168168

0 commit comments

Comments
 (0)