Align AOT contributions for injection with the runtime behavior
Bean post processors that use InjectionMetadata checks if a property value for the element it is about to inject is set and skip it, so that the property value is used. Previously, the AOT contribution for the same behavior did not check if a matching property value is set and therefore override the user-defined value. This commit introduces an additional method that filters the injected element list so that only the elements that should be processed are defined. Closes gh-30476
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2022 the original author or authors.
|
||||
* Copyright 2002-2023 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -65,11 +65,15 @@ class AutowiredAnnotationBeanRegistrationAotContributionTests {
|
||||
|
||||
private final DefaultListableBeanFactory beanFactory;
|
||||
|
||||
private final AutowiredAnnotationBeanPostProcessor beanPostProcessor;
|
||||
|
||||
|
||||
AutowiredAnnotationBeanRegistrationAotContributionTests() {
|
||||
this.generationContext = new TestGenerationContext();
|
||||
this.beanRegistrationCode = new MockBeanRegistrationCode(this.generationContext);
|
||||
this.beanFactory = new DefaultListableBeanFactory();
|
||||
this.beanPostProcessor = new AutowiredAnnotationBeanPostProcessor();
|
||||
this.beanPostProcessor.setBeanFactory(this.beanFactory);
|
||||
}
|
||||
|
||||
|
||||
@@ -185,10 +189,19 @@ class AutowiredAnnotationBeanRegistrationAotContributionTests {
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void contributeWhenMethodInjectionHasMatchingPropertyValue() {
|
||||
RootBeanDefinition beanDefinition = new RootBeanDefinition(InjectionBean.class);
|
||||
beanDefinition.getPropertyValues().addPropertyValue("counter", 42);
|
||||
this.beanFactory.registerBeanDefinition("test", beanDefinition);
|
||||
BeanRegistrationAotContribution contribution = this.beanPostProcessor
|
||||
.processAheadOfTime(RegisteredBean.of(this.beanFactory, "test"));
|
||||
assertThat(contribution).isNull();
|
||||
}
|
||||
|
||||
private RegisteredBean getAndApplyContribution(Class<?> beanClass) {
|
||||
RegisteredBean registeredBean = registerBean(beanClass);
|
||||
BeanRegistrationAotContribution contribution = new AutowiredAnnotationBeanPostProcessor()
|
||||
.processAheadOfTime(registeredBean);
|
||||
BeanRegistrationAotContribution contribution = this.beanPostProcessor.processAheadOfTime(registeredBean);
|
||||
assertThat(contribution).isNotNull();
|
||||
contribution.applyTo(this.generationContext, this.beanRegistrationCode);
|
||||
return registeredBean;
|
||||
@@ -229,4 +242,15 @@ class AutowiredAnnotationBeanRegistrationAotContributionTests {
|
||||
result.accept(compiled.getInstance(BiFunction.class), compiled));
|
||||
}
|
||||
|
||||
static class InjectionBean {
|
||||
|
||||
private Integer counter;
|
||||
|
||||
@Autowired
|
||||
public void setCounter(Integer counter) {
|
||||
this.counter = counter;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user