From 6e9ea85835296ce678b7b18260a967acd891981a Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 31 May 2022 15:05:26 +0200 Subject: [PATCH] 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 --- .../AutoConfigurationPackages.java | 49 +++++++++---------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationPackages.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationPackages.java index 6799241c38..f537a22ccd 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationPackages.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/AutoConfigurationPackages.java @@ -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 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)); - } - - } - }