Skip to content

Commit fd7e763

Browse files
committed
Polishing
1 parent be7029c commit fd7e763

File tree

5 files changed

+69
-94
lines changed

5 files changed

+69
-94
lines changed

framework-docs/modules/ROOT/pages/data-access/jdbc/advanced.adoc

+12-11
Original file line numberDiff line numberDiff line change
@@ -211,19 +211,20 @@ the JDBC driver. If the count is not available, the JDBC driver returns a value
211211
====
212212
In such a scenario, with automatic setting of values on an underlying `PreparedStatement`,
213213
the corresponding JDBC type for each value needs to be derived from the given Java type.
214-
While this usually works well, there is a potential for issues (for example, with Map-contained
215-
`null` values). Spring, by default, calls `ParameterMetaData.getParameterType` in such a
216-
case, which can be expensive with your JDBC driver. You should use a recent driver
214+
While this usually works well, there is a potential for issues (for example, with
215+
Map-contained `null` values). Spring, by default, calls `ParameterMetaData.getParameterType`
216+
in such a case, which can be expensive with your JDBC driver. You should use a recent driver
217217
version and consider setting the `spring.jdbc.getParameterType.ignore` property to `true`
218218
(as a JVM system property or via the
219-
xref:appendix.adoc#appendix-spring-properties[`SpringProperties`] mechanism) if you encounter
220-
a performance issue (as reported on Oracle 12c, JBoss, and PostgreSQL).
221-
222-
Alternatively, you might consider specifying the corresponding JDBC types explicitly,
223-
either through a `BatchPreparedStatementSetter` (as shown earlier), through an explicit type
224-
array given to a `List<Object[]>` based call, through `registerSqlType` calls on a
225-
custom `MapSqlParameterSource` instance, or through a `BeanPropertySqlParameterSource`
226-
that derives the SQL type from the Java-declared property type even for a null value.
219+
xref:appendix.adoc#appendix-spring-properties[`SpringProperties`] mechanism)
220+
if you encounter a specific performance issue for your application.
221+
222+
Alternatively, you could consider specifying the corresponding JDBC types explicitly,
223+
either through a `BatchPreparedStatementSetter` (as shown earlier), through an explicit
224+
type array given to a `List<Object[]>` based call, through `registerSqlType` calls on a
225+
custom `MapSqlParameterSource` instance, through a `BeanPropertySqlParameterSource`
226+
that derives the SQL type from the Java-declared property type even for a null value, or
227+
through providing individual `SqlParameterValue` instances instead of plain null values.
227228
====
228229

229230

spring-aop/src/main/java/org/springframework/aop/scope/ScopedProxyBeanRegistrationAotProcessor.java

+16-25
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2023 the original author or authors.
2+
* Copyright 2002-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -54,6 +54,7 @@ class ScopedProxyBeanRegistrationAotProcessor implements BeanRegistrationAotProc
5454

5555

5656
@Override
57+
@Nullable
5758
public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean) {
5859
Class<?> beanClass = registeredBean.getBeanClass();
5960
if (beanClass.equals(ScopedProxyFactoryBean.class)) {
@@ -79,8 +80,8 @@ private String getTargetBeanName(BeanDefinition beanDefinition) {
7980
}
8081

8182
@Nullable
82-
private BeanDefinition getTargetBeanDefinition(ConfigurableBeanFactory beanFactory,
83-
@Nullable String targetBeanName) {
83+
private BeanDefinition getTargetBeanDefinition(
84+
ConfigurableBeanFactory beanFactory, @Nullable String targetBeanName) {
8485

8586
if (targetBeanName != null && beanFactory.containsBean(targetBeanName)) {
8687
return beanFactory.getMergedBeanDefinition(targetBeanName);
@@ -123,42 +124,32 @@ public CodeBlock generateNewBeanDefinitionCode(GenerationContext generationConte
123124

124125
@Override
125126
public CodeBlock generateSetBeanDefinitionPropertiesCode(
126-
GenerationContext generationContext,
127-
BeanRegistrationCode beanRegistrationCode,
127+
GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
128128
RootBeanDefinition beanDefinition, Predicate<String> attributeFilter) {
129129

130-
RootBeanDefinition processedBeanDefinition = new RootBeanDefinition(
131-
beanDefinition);
132-
processedBeanDefinition
133-
.setTargetType(this.targetBeanDefinition.getResolvableType());
134-
processedBeanDefinition.getPropertyValues()
135-
.removePropertyValue("targetBeanName");
130+
RootBeanDefinition processedBeanDefinition = new RootBeanDefinition(beanDefinition);
131+
processedBeanDefinition.setTargetType(this.targetBeanDefinition.getResolvableType());
132+
processedBeanDefinition.getPropertyValues().removePropertyValue("targetBeanName");
136133
return super.generateSetBeanDefinitionPropertiesCode(generationContext,
137134
beanRegistrationCode, processedBeanDefinition, attributeFilter);
138135
}
139136

140137
@Override
141-
public CodeBlock generateInstanceSupplierCode(GenerationContext generationContext,
142-
BeanRegistrationCode beanRegistrationCode,
143-
Executable constructorOrFactoryMethod,
144-
boolean allowDirectSupplierShortcut) {
138+
public CodeBlock generateInstanceSupplierCode(
139+
GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
140+
Executable constructorOrFactoryMethod, boolean allowDirectSupplierShortcut) {
145141

146142
GeneratedMethod generatedMethod = beanRegistrationCode.getMethods()
147143
.add("getScopedProxyInstance", method -> {
148-
method.addJavadoc(
149-
"Create the scoped proxy bean instance for '$L'.",
144+
method.addJavadoc("Create the scoped proxy bean instance for '$L'.",
150145
this.registeredBean.getBeanName());
151146
method.addModifiers(Modifier.PRIVATE, Modifier.STATIC);
152147
method.returns(ScopedProxyFactoryBean.class);
153-
method.addParameter(RegisteredBean.class,
154-
REGISTERED_BEAN_PARAMETER_NAME);
148+
method.addParameter(RegisteredBean.class, REGISTERED_BEAN_PARAMETER_NAME);
155149
method.addStatement("$T factory = new $T()",
156-
ScopedProxyFactoryBean.class,
157-
ScopedProxyFactoryBean.class);
158-
method.addStatement("factory.setTargetBeanName($S)",
159-
this.targetBeanName);
160-
method.addStatement(
161-
"factory.setBeanFactory($L.getBeanFactory())",
150+
ScopedProxyFactoryBean.class, ScopedProxyFactoryBean.class);
151+
method.addStatement("factory.setTargetBeanName($S)", this.targetBeanName);
152+
method.addStatement("factory.setBeanFactory($L.getBeanFactory())",
162153
REGISTERED_BEAN_PARAMETER_NAME);
163154
method.addStatement("return factory");
164155
});

spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanRegistrationCodeFragmentsDecorator.java

+13-14
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2022 the original author or authors.
2+
* Copyright 2002-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -59,40 +59,39 @@ public ClassName getTarget(RegisteredBean registeredBean, Executable constructor
5959
public CodeBlock generateNewBeanDefinitionCode(GenerationContext generationContext,
6060
ResolvableType beanType, BeanRegistrationCode beanRegistrationCode) {
6161

62-
return this.delegate.generateNewBeanDefinitionCode(generationContext,
63-
beanType, beanRegistrationCode);
62+
return this.delegate.generateNewBeanDefinitionCode(generationContext, beanType, beanRegistrationCode);
6463
}
6564

6665
@Override
67-
public CodeBlock generateSetBeanDefinitionPropertiesCode(GenerationContext generationContext,
68-
BeanRegistrationCode beanRegistrationCode, RootBeanDefinition beanDefinition,
69-
Predicate<String> attributeFilter) {
66+
public CodeBlock generateSetBeanDefinitionPropertiesCode(
67+
GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
68+
RootBeanDefinition beanDefinition, Predicate<String> attributeFilter) {
7069

7170
return this.delegate.generateSetBeanDefinitionPropertiesCode(
7271
generationContext, beanRegistrationCode, beanDefinition, attributeFilter);
7372
}
7473

7574
@Override
76-
public CodeBlock generateSetBeanInstanceSupplierCode(GenerationContext generationContext,
77-
BeanRegistrationCode beanRegistrationCode, CodeBlock instanceSupplierCode,
78-
List<MethodReference> postProcessors) {
75+
public CodeBlock generateSetBeanInstanceSupplierCode(
76+
GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
77+
CodeBlock instanceSupplierCode, List<MethodReference> postProcessors) {
7978

8079
return this.delegate.generateSetBeanInstanceSupplierCode(generationContext,
8180
beanRegistrationCode, instanceSupplierCode, postProcessors);
8281
}
8382

8483
@Override
85-
public CodeBlock generateInstanceSupplierCode(GenerationContext generationContext,
86-
BeanRegistrationCode beanRegistrationCode, Executable constructorOrFactoryMethod,
87-
boolean allowDirectSupplierShortcut) {
84+
public CodeBlock generateInstanceSupplierCode(
85+
GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
86+
Executable constructorOrFactoryMethod, boolean allowDirectSupplierShortcut) {
8887

8988
return this.delegate.generateInstanceSupplierCode(generationContext,
9089
beanRegistrationCode, constructorOrFactoryMethod, allowDirectSupplierShortcut);
9190
}
9291

9392
@Override
94-
public CodeBlock generateReturnCode(GenerationContext generationContext,
95-
BeanRegistrationCode beanRegistrationCode) {
93+
public CodeBlock generateReturnCode(
94+
GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode) {
9695

9796
return this.delegate.generateReturnCode(generationContext, beanRegistrationCode);
9897
}

spring-beans/src/main/java/org/springframework/beans/factory/aot/DefaultBeanRegistrationCodeFragments.java

+21-33
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2023 the original author or authors.
2+
* Copyright 2002-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -41,8 +41,7 @@
4141
import org.springframework.util.ClassUtils;
4242

4343
/**
44-
* Internal {@link BeanRegistrationCodeFragments} implementation used by
45-
* default.
44+
* Internal {@link BeanRegistrationCodeFragments} implementation used by default.
4645
*
4746
* @author Phillip Webb
4847
*/
@@ -55,8 +54,8 @@ class DefaultBeanRegistrationCodeFragments implements BeanRegistrationCodeFragme
5554
private final BeanDefinitionMethodGeneratorFactory beanDefinitionMethodGeneratorFactory;
5655

5756

58-
DefaultBeanRegistrationCodeFragments(BeanRegistrationsCode beanRegistrationsCode,
59-
RegisteredBean registeredBean,
57+
DefaultBeanRegistrationCodeFragments(
58+
BeanRegistrationsCode beanRegistrationsCode, RegisteredBean registeredBean,
6059
BeanDefinitionMethodGeneratorFactory beanDefinitionMethodGeneratorFactory) {
6160

6261
this.beanRegistrationsCode = beanRegistrationsCode;
@@ -66,9 +65,7 @@ class DefaultBeanRegistrationCodeFragments implements BeanRegistrationCodeFragme
6665

6766

6867
@Override
69-
public ClassName getTarget(RegisteredBean registeredBean,
70-
Executable constructorOrFactoryMethod) {
71-
68+
public ClassName getTarget(RegisteredBean registeredBean, Executable constructorOrFactoryMethod) {
7269
Class<?> target = extractDeclaringClass(registeredBean.getBeanType(), constructorOrFactoryMethod);
7370
while (target.getName().startsWith("java.") && registeredBean.isInnerBean()) {
7471
RegisteredBean parent = registeredBean.getParent();
@@ -80,9 +77,8 @@ public ClassName getTarget(RegisteredBean registeredBean,
8077

8178
private Class<?> extractDeclaringClass(ResolvableType beanType, Executable executable) {
8279
Class<?> declaringClass = ClassUtils.getUserClass(executable.getDeclaringClass());
83-
if (executable instanceof Constructor<?>
84-
&& AccessControl.forMember(executable).isPublic()
85-
&& FactoryBean.class.isAssignableFrom(declaringClass)) {
80+
if (executable instanceof Constructor<?> && AccessControl.forMember(executable).isPublic() &&
81+
FactoryBean.class.isAssignableFrom(declaringClass)) {
8682
return extractTargetClassFromFactoryBean(declaringClass, beanType);
8783
}
8884
return executable.getDeclaringClass();
@@ -91,8 +87,7 @@ private Class<?> extractDeclaringClass(ResolvableType beanType, Executable execu
9187
/**
9288
* Extract the target class of a public {@link FactoryBean} based on its
9389
* constructor. If the implementation does not resolve the target class
94-
* because it itself uses a generic, attempt to extract it from the
95-
* bean type.
90+
* because it itself uses a generic, attempt to extract it from the bean type.
9691
* @param factoryBeanType the factory bean type
9792
* @param beanType the bean type
9893
* @return the target class to use
@@ -113,17 +108,15 @@ public CodeBlock generateNewBeanDefinitionCode(GenerationContext generationConte
113108
ResolvableType beanType, BeanRegistrationCode beanRegistrationCode) {
114109

115110
CodeBlock.Builder code = CodeBlock.builder();
116-
RootBeanDefinition mergedBeanDefinition = this.registeredBean.getMergedBeanDefinition();
117-
Class<?> beanClass = (mergedBeanDefinition.hasBeanClass()
118-
? ClassUtils.getUserClass(mergedBeanDefinition.getBeanClass()) : null);
111+
RootBeanDefinition mbd = this.registeredBean.getMergedBeanDefinition();
112+
Class<?> beanClass = (mbd.hasBeanClass() ? ClassUtils.getUserClass(mbd.getBeanClass()) : null);
119113
CodeBlock beanClassCode = generateBeanClassCode(
120114
beanRegistrationCode.getClassName().packageName(),
121115
(beanClass != null ? beanClass : beanType.toClass()));
122116
code.addStatement("$T $L = new $T($L)", RootBeanDefinition.class,
123117
BEAN_DEFINITION_VARIABLE, RootBeanDefinition.class, beanClassCode);
124118
if (targetTypeNecessary(beanType, beanClass)) {
125-
code.addStatement("$L.setTargetType($L)", BEAN_DEFINITION_VARIABLE,
126-
generateBeanTypeCode(beanType));
119+
code.addStatement("$L.setTargetType($L)", BEAN_DEFINITION_VARIABLE, generateBeanTypeCode(beanType));
127120
}
128121
return code.build();
129122
}
@@ -148,18 +141,16 @@ private boolean targetTypeNecessary(ResolvableType beanType, @Nullable Class<?>
148141
if (beanType.hasGenerics()) {
149142
return true;
150143
}
151-
if (beanClass != null
152-
&& this.registeredBean.getMergedBeanDefinition().getFactoryMethodName() != null) {
144+
if (beanClass != null && this.registeredBean.getMergedBeanDefinition().getFactoryMethodName() != null) {
153145
return true;
154146
}
155147
return (beanClass != null && !beanType.toClass().equals(beanClass));
156148
}
157149

158150
@Override
159151
public CodeBlock generateSetBeanDefinitionPropertiesCode(
160-
GenerationContext generationContext,
161-
BeanRegistrationCode beanRegistrationCode, RootBeanDefinition beanDefinition,
162-
Predicate<String> attributeFilter) {
152+
GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
153+
RootBeanDefinition beanDefinition, Predicate<String> attributeFilter) {
163154

164155
return new BeanDefinitionPropertiesCodeGenerator(
165156
generationContext.getRuntimeHints(), attributeFilter,
@@ -169,9 +160,7 @@ public CodeBlock generateSetBeanDefinitionPropertiesCode(
169160
}
170161

171162
@Nullable
172-
protected CodeBlock generateValueCode(GenerationContext generationContext,
173-
String name, Object value) {
174-
163+
protected CodeBlock generateValueCode(GenerationContext generationContext, String name, Object value) {
175164
RegisteredBean innerRegisteredBean = getInnerRegisteredBean(value);
176165
if (innerRegisteredBean != null) {
177166
BeanDefinitionMethodGenerator methodGenerator = this.beanDefinitionMethodGeneratorFactory
@@ -197,9 +186,8 @@ private RegisteredBean getInnerRegisteredBean(Object value) {
197186

198187
@Override
199188
public CodeBlock generateSetBeanInstanceSupplierCode(
200-
GenerationContext generationContext,
201-
BeanRegistrationCode beanRegistrationCode, CodeBlock instanceSupplierCode,
202-
List<MethodReference> postProcessors) {
189+
GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
190+
CodeBlock instanceSupplierCode, List<MethodReference> postProcessors) {
203191

204192
CodeBlock.Builder code = CodeBlock.builder();
205193
if (postProcessors.isEmpty()) {
@@ -219,8 +207,8 @@ public CodeBlock generateSetBeanInstanceSupplierCode(
219207
}
220208

221209
@Override
222-
public CodeBlock generateInstanceSupplierCode(GenerationContext generationContext,
223-
BeanRegistrationCode beanRegistrationCode,
210+
public CodeBlock generateInstanceSupplierCode(
211+
GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
224212
Executable constructorOrFactoryMethod, boolean allowDirectSupplierShortcut) {
225213

226214
return new InstanceSupplierCodeGenerator(generationContext,
@@ -229,8 +217,8 @@ public CodeBlock generateInstanceSupplierCode(GenerationContext generationContex
229217
}
230218

231219
@Override
232-
public CodeBlock generateReturnCode(GenerationContext generationContext,
233-
BeanRegistrationCode beanRegistrationCode) {
220+
public CodeBlock generateReturnCode(
221+
GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode) {
234222

235223
CodeBlock.Builder code = CodeBlock.builder();
236224
code.addStatement("return $L", BEAN_DEFINITION_VARIABLE);

spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassPostProcessor.java

+7-11
Original file line numberDiff line numberDiff line change
@@ -737,12 +737,7 @@ private CodeBlock generatePropertySourceDescriptorCode(PropertySourceDescriptor
737737
}
738738

739739
private CodeBlock handleNull(@Nullable Object value, Supplier<CodeBlock> nonNull) {
740-
if (value == null) {
741-
return CodeBlock.of("null");
742-
}
743-
else {
744-
return nonNull.get();
745-
}
740+
return (value == null ? CodeBlock.of("null") : nonNull.get());
746741
}
747742
}
748743

@@ -757,8 +752,9 @@ public ConfigurationClassProxyBeanRegistrationCodeFragments(BeanRegistrationCode
757752
}
758753

759754
@Override
760-
public CodeBlock generateSetBeanDefinitionPropertiesCode(GenerationContext generationContext,
761-
BeanRegistrationCode beanRegistrationCode, RootBeanDefinition beanDefinition, Predicate<String> attributeFilter) {
755+
public CodeBlock generateSetBeanDefinitionPropertiesCode(
756+
GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
757+
RootBeanDefinition beanDefinition, Predicate<String> attributeFilter) {
762758

763759
CodeBlock.Builder code = CodeBlock.builder();
764760
code.add(super.generateSetBeanDefinitionPropertiesCode(generationContext,
@@ -769,9 +765,9 @@ public CodeBlock generateSetBeanDefinitionPropertiesCode(GenerationContext gener
769765
}
770766

771767
@Override
772-
public CodeBlock generateInstanceSupplierCode(GenerationContext generationContext,
773-
BeanRegistrationCode beanRegistrationCode, Executable constructorOrFactoryMethod,
774-
boolean allowDirectSupplierShortcut) {
768+
public CodeBlock generateInstanceSupplierCode(
769+
GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
770+
Executable constructorOrFactoryMethod, boolean allowDirectSupplierShortcut) {
775771

776772
Executable executableToUse = proxyExecutable(generationContext.getRuntimeHints(), constructorOrFactoryMethod);
777773
return super.generateInstanceSupplierCode(generationContext, beanRegistrationCode,

0 commit comments

Comments
 (0)