Add AOT support for generic constructor argument values
This commit improves compatibility with the core container when running in AOT mode by adding support for generic constructor argument values. Previously, these were ignored altogether. We now have code generation support for them as well as resolution that is similar to what AbstractAutowiredCapableBeanFactory does in a regular runtime. This commit also improves AOT support for XML bean configurations by adding more support for TypedStringValue and inner bean definitions. Closes gh-31420
This commit is contained in:
@@ -30,6 +30,7 @@ import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.springframework.beans.PropertyValue;
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.beans.factory.config.BeanDefinitionHolder;
|
||||
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
|
||||
import org.springframework.beans.factory.config.BeanPostProcessor;
|
||||
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
|
||||
@@ -479,26 +480,32 @@ final class PostProcessorRegistrationDelegate {
|
||||
BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this.beanFactory, beanName, bd);
|
||||
postProcessors.forEach(postProcessor -> postProcessor.postProcessMergedBeanDefinition(bd, beanType, beanName));
|
||||
for (PropertyValue propertyValue : bd.getPropertyValues().getPropertyValueList()) {
|
||||
Object value = propertyValue.getValue();
|
||||
if (value instanceof AbstractBeanDefinition innerBd) {
|
||||
Class<?> innerBeanType = resolveBeanType(innerBd);
|
||||
resolveInnerBeanDefinition(valueResolver, innerBd, (innerBeanName, innerBeanDefinition)
|
||||
-> postProcessRootBeanDefinition(postProcessors, innerBeanName, innerBeanType, innerBeanDefinition));
|
||||
}
|
||||
if (value instanceof TypedStringValue typedStringValue) {
|
||||
resolveTypeStringValue(typedStringValue);
|
||||
}
|
||||
postProcessValue(postProcessors, valueResolver, propertyValue.getValue());
|
||||
}
|
||||
for (ValueHolder valueHolder : bd.getConstructorArgumentValues().getIndexedArgumentValues().values()) {
|
||||
Object value = valueHolder.getValue();
|
||||
if (value instanceof AbstractBeanDefinition innerBd) {
|
||||
Class<?> innerBeanType = resolveBeanType(innerBd);
|
||||
resolveInnerBeanDefinition(valueResolver, innerBd, (innerBeanName, innerBeanDefinition)
|
||||
-> postProcessRootBeanDefinition(postProcessors, innerBeanName, innerBeanType, innerBeanDefinition));
|
||||
}
|
||||
if (value instanceof TypedStringValue typedStringValue) {
|
||||
resolveTypeStringValue(typedStringValue);
|
||||
}
|
||||
postProcessValue(postProcessors, valueResolver, valueHolder.getValue());
|
||||
}
|
||||
for (ValueHolder valueHolder : bd.getConstructorArgumentValues().getGenericArgumentValues()) {
|
||||
postProcessValue(postProcessors, valueResolver, valueHolder.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
private void postProcessValue(List<MergedBeanDefinitionPostProcessor> postProcessors,
|
||||
BeanDefinitionValueResolver valueResolver, @Nullable Object value) {
|
||||
if (value instanceof BeanDefinitionHolder bdh
|
||||
&& bdh.getBeanDefinition() instanceof AbstractBeanDefinition innerBd) {
|
||||
|
||||
Class<?> innerBeanType = resolveBeanType(innerBd);
|
||||
resolveInnerBeanDefinition(valueResolver, innerBd, (innerBeanName, innerBeanDefinition)
|
||||
-> postProcessRootBeanDefinition(postProcessors, innerBeanName, innerBeanType, innerBeanDefinition));
|
||||
}
|
||||
else if (value instanceof AbstractBeanDefinition innerBd) {
|
||||
Class<?> innerBeanType = resolveBeanType(innerBd);
|
||||
resolveInnerBeanDefinition(valueResolver, innerBd, (innerBeanName, innerBeanDefinition)
|
||||
-> postProcessRootBeanDefinition(postProcessors, innerBeanName, innerBeanType, innerBeanDefinition));
|
||||
}
|
||||
else if (value instanceof TypedStringValue typedStringValue) {
|
||||
resolveTypeStringValue(typedStringValue);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user