Skip to content

Commit d34e8fa

Browse files
committed
Refine constructor argument retrieval, reduce BeanFactoryAwareRowMapperFactory assumptions and design.
1 parent 55886fd commit d34e8fa

File tree

5 files changed

+43
-34
lines changed

5 files changed

+43
-34
lines changed

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/aot/AotRepositoryFragmentSupport.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,13 @@ public class AotRepositoryFragmentSupport {
9292

9393
private final Lazy<ConcurrentLruCache<Method, ValueEvaluationContextProvider>> contextProviders;
9494

95-
protected AotRepositoryFragmentSupport(RowMapperFactory rowMapperFactory, JdbcAggregateOperations operations,
95+
protected AotRepositoryFragmentSupport(JdbcAggregateOperations operations, RowMapperFactory rowMapperFactory,
9696
RepositoryFactoryBeanSupport.FragmentCreationContext context) {
97-
this(rowMapperFactory, operations, context.getRepositoryMetadata(), context.getValueExpressionDelegate(),
97+
this(operations, rowMapperFactory, context.getRepositoryMetadata(), context.getValueExpressionDelegate(),
9898
context.getProjectionFactory());
9999
}
100100

101-
protected AotRepositoryFragmentSupport(RowMapperFactory rowMapperFactory, JdbcAggregateOperations operations,
101+
protected AotRepositoryFragmentSupport(JdbcAggregateOperations operations, RowMapperFactory rowMapperFactory,
102102
RepositoryMetadata repositoryMetadata, ValueExpressionDelegate valueExpressions,
103103
ProjectionFactory projectionFactory) {
104104

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/aot/JdbcRepositoryContributor.java

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
import org.jspecify.annotations.Nullable;
2121

22-
import org.springframework.beans.factory.BeanFactory;
22+
import org.springframework.beans.factory.config.RuntimeBeanReference;
2323
import org.springframework.core.annotation.MergedAnnotation;
2424
import org.springframework.core.annotation.MergedAnnotations;
2525
import org.springframework.data.jdbc.core.JdbcAggregateOperations;
@@ -29,6 +29,7 @@
2929
import org.springframework.data.jdbc.repository.query.JdbcQueryMethod;
3030
import org.springframework.data.jdbc.repository.query.Modifying;
3131
import org.springframework.data.jdbc.repository.query.Query;
32+
import org.springframework.data.jdbc.repository.query.RowMapperFactory;
3233
import org.springframework.data.jdbc.repository.support.BeanFactoryAwareRowMapperFactory;
3334
import org.springframework.data.relational.core.mapping.RelationalMappingContext;
3435
import org.springframework.data.relational.repository.Lock;
@@ -83,21 +84,29 @@ protected void customizeClass(AotRepositoryClassBuilder classBuilder) {
8384
@Override
8485
protected void customizeConstructor(AotRepositoryConstructorBuilder constructorBuilder) {
8586

86-
constructorBuilder.addParameter("beanFactory", BeanFactory.class, false);
87-
constructorBuilder.addParameter("context", RepositoryFactoryBeanSupport.FragmentCreationContext.class, false);
87+
constructorBuilder.addParameter("operations", JdbcAggregateOperations.class, customizer -> {
88+
89+
customizer.origin(StringUtils.hasText(jdbcAggregateOperationsRef)
90+
? new RuntimeBeanReference(jdbcAggregateOperationsRef, JdbcAggregateOperations.class)
91+
: new RuntimeBeanReference(JdbcAggregateOperations.class));
92+
});
93+
94+
constructorBuilder.addParameter("rowMapperFactory", RowMapperFactory.class, customizer -> {
8895

89-
constructorBuilder.customize(builder -> {
96+
customizer.origin(ctx -> {
9097

91-
if (StringUtils.hasText(jdbcAggregateOperationsRef)) {
92-
builder.addStatement(
93-
"super(new $1T(beanFactory, beanFactory.getBean($2S, $3T.class), beanFactory.getBeanProvider($4T.class).getIfUnique(() -> $4T.EMPTY)), beanFactory.getBean($2S, $3T.class), context)",
94-
BeanFactoryAwareRowMapperFactory.class, jdbcAggregateOperationsRef, JdbcAggregateOperations.class,
98+
String rowMapperFactory = ctx.localVariable("rowMapperFactory");
99+
String operations = ctx.localVariable("operations");
100+
CodeBlock.Builder builder = CodeBlock.builder();
101+
builder.addStatement("$1T $2L = new $1T($4L, $3L, $4L.getBeanProvider($5T.class).getIfUnique(() -> $5T.EMPTY))",
102+
BeanFactoryAwareRowMapperFactory.class, rowMapperFactory, operations, ctx.beanFactory(),
95103
QueryMappingConfiguration.class);
96-
} else {
97-
builder.addStatement("super(new $1T(beanFactory), beanFactory.getBean($2T.class), context)",
98-
BeanFactoryAwareRowMapperFactory.class, JdbcAggregateOperations.class);
99-
}
104+
105+
return AotRepositoryConstructorBuilder.ParameterOrigin.of(rowMapperFactory, builder.build());
106+
});
100107
});
108+
109+
constructorBuilder.addParameter("context", RepositoryFactoryBeanSupport.FragmentCreationContext.class, false);
101110
}
102111

103112
@Override

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/BeanFactoryAwareRowMapperFactory.java

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,6 @@ public class BeanFactoryAwareRowMapperFactory extends DefaultRowMapperFactory {
3535

3636
private final BeanFactory beanFactory;
3737

38-
/**
39-
* Create a {@code BeanFactoryAwareRowMapperFactory} instance using the given {@link BeanFactory}.
40-
* {@link JdbcAggregateOperations} and {@link QueryMappingConfiguration} are resolved from the bean factory.
41-
*
42-
* @param beanFactory
43-
*/
44-
public BeanFactoryAwareRowMapperFactory(BeanFactory beanFactory) {
45-
46-
super(beanFactory.getBean(JdbcAggregateOperations.class), beanFactory
47-
.getBeanProvider(QueryMappingConfiguration.class).getIfAvailable(() -> QueryMappingConfiguration.EMPTY));
48-
49-
this.beanFactory = beanFactory;
50-
}
51-
5238
/**
5339
* Create a {@code BeanFactoryAwareRowMapperFactory} instance using the given {@link BeanFactory},
5440
* {@link JdbcAggregateOperations} and {@link QueryMappingConfiguration}.

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/support/DefaultRowMapperFactory.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.springframework.jdbc.core.ResultSetExtractor;
2323
import org.springframework.jdbc.core.RowMapper;
2424
import org.springframework.jdbc.core.SingleColumnRowMapper;
25+
import org.springframework.util.Assert;
2526

2627
/**
2728
* Default implementation of {@link RowMapperFactory}. Honors the custom mappings defined in
@@ -41,6 +42,10 @@ public class DefaultRowMapperFactory implements RowMapperFactory {
4142

4243
public DefaultRowMapperFactory(JdbcAggregateOperations operations,
4344
QueryMappingConfiguration queryMappingConfiguration) {
45+
46+
Assert.notNull(operations, "JdbcAggregateOperations must not be null");
47+
Assert.notNull(queryMappingConfiguration, "QueryMappingConfiguration must not be null");
48+
4449
this.operations = operations;
4550
this.queryMappingConfiguration = queryMappingConfiguration;
4651
}

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/aot/AotFragmentTestConfigurationSupport.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.lang.reflect.Proxy;
2020
import java.util.Arrays;
2121
import java.util.List;
22+
import java.util.Optional;
2223

2324
import org.mockito.Mockito;
2425

@@ -28,6 +29,7 @@
2829
import org.springframework.beans.factory.config.BeanDefinition;
2930
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
3031
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
32+
import org.springframework.beans.factory.config.RuntimeBeanReference;
3133
import org.springframework.beans.factory.support.AbstractBeanDefinition;
3234
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
3335
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
@@ -41,10 +43,13 @@
4143
import org.springframework.core.test.tools.TestCompiler;
4244
import org.springframework.core.type.AnnotationMetadata;
4345
import org.springframework.data.expression.ValueExpressionParser;
46+
import org.springframework.data.jdbc.core.JdbcAggregateOperations;
4447
import org.springframework.data.jdbc.core.convert.MappingJdbcConverter;
48+
import org.springframework.data.jdbc.core.convert.QueryMappingConfiguration;
4549
import org.springframework.data.jdbc.core.dialect.JdbcDialect;
4650
import org.springframework.data.jdbc.core.mapping.JdbcMappingContext;
4751
import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories;
52+
import org.springframework.data.jdbc.repository.query.RowMapperFactory;
4853
import org.springframework.data.jdbc.repository.support.BeanFactoryAwareRowMapperFactory;
4954
import org.springframework.data.projection.ProjectionFactory;
5055
import org.springframework.data.projection.SpelAwareProxyProjectionFactory;
@@ -94,8 +99,10 @@ EnableJdbcRepositories.class, new DefaultResourceLoader(), new StandardEnvironme
9499
}
95100

96101
@Bean
97-
BeanFactoryAwareRowMapperFactory rowMapperFactory(ApplicationContext context) {
98-
return new BeanFactoryAwareRowMapperFactory(context);
102+
BeanFactoryAwareRowMapperFactory rowMapperFactory(ApplicationContext context,
103+
JdbcAggregateOperations aggregateOperations, Optional<QueryMappingConfiguration> queryMappingConfiguration) {
104+
return new BeanFactoryAwareRowMapperFactory(context, aggregateOperations,
105+
queryMappingConfiguration.orElse(QueryMappingConfiguration.EMPTY));
99106
}
100107

101108
@Override
@@ -105,12 +112,14 @@ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
105112

106113
repositoryContext.setBeanFactory(beanFactory);
107114

108-
new JdbcRepositoryContributor(repositoryContext, dialect,
109-
new MappingJdbcConverter(new JdbcMappingContext(), (identifier, path) -> null)).contribute(generationContext);
115+
JdbcRepositoryContributor jdbcRepositoryContributor = new JdbcRepositoryContributor(repositoryContext, dialect,
116+
new MappingJdbcConverter(new JdbcMappingContext(), (identifier, path) -> null));
117+
jdbcRepositoryContributor.contribute(generationContext);
110118

111119
AbstractBeanDefinition aotGeneratedRepository = BeanDefinitionBuilder
112120
.genericBeanDefinition(repositoryInterface.getName() + "Impl__AotRepository")
113-
.addConstructorArgValue(applicationContext)
121+
.addConstructorArgValue(new RuntimeBeanReference(JdbcAggregateOperations.class))
122+
.addConstructorArgValue(new RuntimeBeanReference(RowMapperFactory.class))
114123
.addConstructorArgValue(
115124
getCreationContext(repositoryContext, beanFactory.getBean(Environment.class), beanFactory))
116125
.getBeanDefinition();

0 commit comments

Comments
 (0)