Adapt BasePackages bean definition for AOT processing
This commit adapts how the BasePackages bean is registered so that AOT processing works with it out-of-the-box. Previously we were using an instance supplier with the accumulated base packages. This commit changes that to set a constructor argument values. Closes gh-31223
This commit is contained in:
@@ -19,10 +19,9 @@ package org.springframework.boot.autoconfigure;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.function.Supplier;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
@@ -30,8 +29,9 @@ import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.beans.factory.BeanFactory;
|
||||
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.beans.factory.config.ConstructorArgumentValues;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
||||
import org.springframework.beans.factory.support.GenericBeanDefinition;
|
||||
import org.springframework.beans.factory.support.RootBeanDefinition;
|
||||
import org.springframework.boot.context.annotation.DeterminableImports;
|
||||
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
|
||||
import org.springframework.core.annotation.AnnotationAttributes;
|
||||
@@ -92,11 +92,27 @@ public abstract class AutoConfigurationPackages {
|
||||
*/
|
||||
public static void register(BeanDefinitionRegistry registry, String... packageNames) {
|
||||
if (registry.containsBeanDefinition(BEAN)) {
|
||||
BasePackagesBeanDefinition beanDefinition = (BasePackagesBeanDefinition) registry.getBeanDefinition(BEAN);
|
||||
beanDefinition.addBasePackages(packageNames);
|
||||
addBasePackages(registry.getBeanDefinition(BEAN), packageNames);
|
||||
}
|
||||
else {
|
||||
registry.registerBeanDefinition(BEAN, new BasePackagesBeanDefinition(packageNames));
|
||||
RootBeanDefinition beanDefinition = new RootBeanDefinition(BasePackages.class);
|
||||
beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
addBasePackages(beanDefinition, packageNames);
|
||||
registry.registerBeanDefinition(BEAN, beanDefinition);
|
||||
}
|
||||
}
|
||||
|
||||
private static void addBasePackages(BeanDefinition beanDefinition, String[] additionalBasePackages) {
|
||||
ConstructorArgumentValues constructorArgumentValues = beanDefinition.getConstructorArgumentValues();
|
||||
if (constructorArgumentValues.hasIndexedArgumentValue(0)) {
|
||||
String[] existingPackages = (String[]) constructorArgumentValues.getIndexedArgumentValue(0, String[].class)
|
||||
.getValue();
|
||||
constructorArgumentValues.addIndexedArgumentValue(0,
|
||||
Stream.concat(Stream.of(existingPackages), Stream.of(additionalBasePackages)).distinct()
|
||||
.toArray(String[]::new));
|
||||
}
|
||||
else {
|
||||
constructorArgumentValues.addIndexedArgumentValue(0, additionalBasePackages);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -204,25 +220,4 @@ public abstract class AutoConfigurationPackages {
|
||||
|
||||
}
|
||||
|
||||
static final class BasePackagesBeanDefinition extends GenericBeanDefinition {
|
||||
|
||||
private final Set<String> basePackages = new LinkedHashSet<>();
|
||||
|
||||
BasePackagesBeanDefinition(String... basePackages) {
|
||||
setBeanClass(BasePackages.class);
|
||||
setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
|
||||
addBasePackages(basePackages);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Supplier<?> getInstanceSupplier() {
|
||||
return () -> new BasePackages(StringUtils.toStringArray(this.basePackages));
|
||||
}
|
||||
|
||||
private void addBasePackages(String[] additionalBasePackages) {
|
||||
this.basePackages.addAll(Arrays.asList(additionalBasePackages));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user