Skip to content

Commit 4560313

Browse files
committed
Merge pull request #28843 from OlgaMaciaszek
* pr/28843: Polish "Handle inferred init/destroy method consistently" Handle inferred init/destroy method consistently Closes gh-28843
2 parents d6345db + 85173b5 commit 4560313

File tree

2 files changed

+30
-15
lines changed

2 files changed

+30
-15
lines changed

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

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@
2121
import java.beans.Introspector;
2222
import java.beans.PropertyDescriptor;
2323
import java.lang.reflect.Method;
24+
import java.util.Arrays;
2425
import java.util.Collections;
2526
import java.util.HashMap;
27+
import java.util.List;
2628
import java.util.Map;
2729
import java.util.Objects;
2830
import java.util.function.BiFunction;
@@ -142,16 +144,14 @@ private void addInitDestroyMethods(Builder builder,
142144
if (!ObjectUtils.isEmpty(methodNames)) {
143145
Class<?> beanType = ClassUtils
144146
.getUserClass(beanDefinition.getResolvableType().toClass());
145-
Builder arguments = CodeBlock.builder();
146-
for (int i = 0; i < methodNames.length; i++) {
147-
String methodName = methodNames[i];
148-
if (!AbstractBeanDefinition.INFER_METHOD.equals(methodName)) {
149-
arguments.add((i != 0) ? ", $S" : "$S", methodName);
150-
addInitDestroyHint(beanType, methodName);
151-
}
152-
}
153-
if (!arguments.isEmpty()) {
154-
builder.addStatement(format, BEAN_DEFINITION_VARIABLE, arguments.build());
147+
List<String> filteredMethodNames = Arrays.stream(methodNames)
148+
.filter(candidate -> !AbstractBeanDefinition.INFER_METHOD.equals(candidate))
149+
.toList();
150+
if (!ObjectUtils.isEmpty(filteredMethodNames)) {
151+
filteredMethodNames.forEach(methodName -> addInitDestroyHint(beanType, methodName));
152+
CodeBlock arguments = CodeBlock.join(filteredMethodNames.stream()
153+
.map(name -> CodeBlock.of("$S", name)).toList(), ", ");
154+
builder.addStatement(format, BEAN_DEFINITION_VARIABLE, arguments);
155155
}
156156
}
157157
}
@@ -274,11 +274,11 @@ private CodeBlock toStringVarArgs(String[] strings) {
274274

275275
private Object toRole(int value) {
276276
return switch (value) {
277-
case BeanDefinition.ROLE_INFRASTRUCTURE -> CodeBlock.builder()
278-
.add("$T.ROLE_INFRASTRUCTURE", BeanDefinition.class).build();
279-
case BeanDefinition.ROLE_SUPPORT -> CodeBlock.builder()
280-
.add("$T.ROLE_SUPPORT", BeanDefinition.class).build();
281-
default -> value;
277+
case BeanDefinition.ROLE_INFRASTRUCTURE -> CodeBlock.builder()
278+
.add("$T.ROLE_INFRASTRUCTURE", BeanDefinition.class).build();
279+
case BeanDefinition.ROLE_SUPPORT -> CodeBlock.builder()
280+
.add("$T.ROLE_SUPPORT", BeanDefinition.class).build();
281+
default -> value;
282282
};
283283
}
284284

spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionPropertiesCodeGeneratorTests.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
*
5858
* @author Phillip Webb
5959
* @author Stephane Nicoll
60+
* @author Olga Maciaszek-Sharma
6061
*/
6162
class BeanDefinitionPropertiesCodeGeneratorTests {
6263

@@ -244,6 +245,13 @@ void setInitMethodWhenMultipleInitMethods() {
244245
assertHasMethodInvokeHints(InitDestroyBean.class, methodNames);
245246
}
246247

248+
@Test
249+
void setInitMethodWithInferredMethodFirst() {
250+
this.beanDefinition.setInitMethodNames(AbstractBeanDefinition.INFER_METHOD, "init");
251+
compile((actual, compiled) -> assertThat(compiled.getSourceFile().getContent())
252+
.contains("beanDefinition.setInitMethodNames(\"init\");"));
253+
}
254+
247255
@Test
248256
void setDestroyMethodWhenDestroyInitMethod() {
249257
this.beanDefinition.setTargetType(InitDestroyBean.class);
@@ -273,6 +281,13 @@ void setDestroyMethodWhenMultipleDestroyMethods() {
273281
assertHasMethodInvokeHints(InitDestroyBean.class, methodNames);
274282
}
275283

284+
@Test
285+
void setDestroyMethodWithInferredMethodFirst() {
286+
this.beanDefinition.setDestroyMethodNames(AbstractBeanDefinition.INFER_METHOD, "destroy");
287+
compile((actual, compiled) -> assertThat(compiled.getSourceFile().getContent())
288+
.contains("beanDefinition.setDestroyMethodNames(\"destroy\");"));
289+
}
290+
276291
private void assertHasMethodInvokeHints(Class<?> beanType, String... methodNames) {
277292
assertThat(methodNames).allMatch(methodName -> RuntimeHintsPredicates.reflection()
278293
.onMethod(beanType, methodName).invoke()

0 commit comments

Comments
 (0)