Filter single inferred init/destroy methods

Update `BeanDefinitionPropertiesCodeGenerator` to not add
init/destroy method calls for a single inferred name.

Closes gh-28570
This commit is contained in:
Phillip Webb 2022-06-05 16:13:11 -07:00
parent 172102d225
commit 9a9c3ea00e
2 changed files with 18 additions and 1 deletions

View File

@ -151,9 +151,11 @@ class BeanDefinitionPropertiesCodeGenerator {
addInitDestroyHint(beanType, methodName); addInitDestroyHint(beanType, methodName);
} }
} }
if (!arguments.isEmpty()) {
builder.addStatement(format, BEAN_DEFINITION_VARIABLE, arguments.build()); builder.addStatement(format, BEAN_DEFINITION_VARIABLE, arguments.build());
} }
} }
}
private void addInitDestroyHint(Class<?> beanUserClass, String methodName) { private void addInitDestroyHint(Class<?> beanUserClass, String methodName) {
Method method = ReflectionUtils.findMethod(beanUserClass, methodName); Method method = ReflectionUtils.findMethod(beanUserClass, methodName);

View File

@ -37,6 +37,7 @@ import org.springframework.beans.factory.config.BeanReference;
import org.springframework.beans.factory.config.ConstructorArgumentValues.ValueHolder; import org.springframework.beans.factory.config.ConstructorArgumentValues.ValueHolder;
import org.springframework.beans.factory.config.RuntimeBeanNameReference; import org.springframework.beans.factory.config.RuntimeBeanNameReference;
import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.ManagedList; import org.springframework.beans.factory.support.ManagedList;
import org.springframework.beans.factory.support.ManagedMap; import org.springframework.beans.factory.support.ManagedMap;
@ -229,6 +230,13 @@ class BeanDefinitionPropertiesCodeGeneratorTests {
assertHasMethodInvokeHints(InitDestroyBean.class, methodNames); assertHasMethodInvokeHints(InitDestroyBean.class, methodNames);
} }
@Test
void setInitMethodWhenSingleInferredInitMethod() {
this.beanDefinition.setTargetType(InitDestroyBean.class);
this.beanDefinition.setInitMethodName(AbstractBeanDefinition.INFER_METHOD);
testCompiledResult((actual, compiled) -> assertThat(actual.getInitMethodNames()).isNull());
}
@Test @Test
void setInitMethodWhenMultipleInitMethods() { void setInitMethodWhenMultipleInitMethods() {
this.beanDefinition.setTargetType(InitDestroyBean.class); this.beanDefinition.setTargetType(InitDestroyBean.class);
@ -250,6 +258,13 @@ class BeanDefinitionPropertiesCodeGeneratorTests {
assertHasMethodInvokeHints(InitDestroyBean.class, methodNames); assertHasMethodInvokeHints(InitDestroyBean.class, methodNames);
} }
@Test
void setDestroyMethodWhenSingleInferredInitMethod() {
this.beanDefinition.setTargetType(InitDestroyBean.class);
this.beanDefinition.setDestroyMethodName(AbstractBeanDefinition.INFER_METHOD);
testCompiledResult((actual, compiled) -> assertThat(actual.getDestroyMethodNames()).isNull());
}
@Test @Test
void setDestroyMethodWhenMultipleDestroyMethods() { void setDestroyMethodWhenMultipleDestroyMethods() {
this.beanDefinition.setTargetType(InitDestroyBean.class); this.beanDefinition.setTargetType(InitDestroyBean.class);