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 142c1d41e7..c6771a0663 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 @@ -22,6 +22,7 @@ import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; +import java.util.function.Supplier; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -29,7 +30,6 @@ 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.boot.context.annotation.DeterminableImports; @@ -92,27 +92,14 @@ public abstract class AutoConfigurationPackages { */ public static void register(BeanDefinitionRegistry registry, String... packageNames) { if (registry.containsBeanDefinition(BEAN)) { - BeanDefinition beanDefinition = registry.getBeanDefinition(BEAN); - ConstructorArgumentValues constructorArguments = beanDefinition.getConstructorArgumentValues(); - constructorArguments.addIndexedArgumentValue(0, addBasePackages(constructorArguments, packageNames)); + BasePackagesBeanDefinition beanDefinition = (BasePackagesBeanDefinition) registry.getBeanDefinition(BEAN); + beanDefinition.addBasePackages(packageNames); } else { - GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); - beanDefinition.setBeanClass(BasePackages.class); - beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(0, packageNames); - beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - registry.registerBeanDefinition(BEAN, beanDefinition); + registry.registerBeanDefinition(BEAN, new BasePackagesBeanDefinition(packageNames)); } } - private static String[] addBasePackages(ConstructorArgumentValues constructorArguments, String[] packageNames) { - String[] existing = (String[]) constructorArguments.getIndexedArgumentValue(0, String[].class).getValue(); - Set merged = new LinkedHashSet<>(); - merged.addAll(Arrays.asList(existing)); - merged.addAll(Arrays.asList(packageNames)); - return StringUtils.toStringArray(merged); - } - /** * {@link ImportBeanDefinitionRegistrar} to store the base package from the importing * configuration. @@ -217,4 +204,25 @@ public abstract class AutoConfigurationPackages { } + static final class BasePackagesBeanDefinition extends GenericBeanDefinition { + + private 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)); + } + + } + } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/domain/EntityScanPackages.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/domain/EntityScanPackages.java index 2c88e56220..eee79004b0 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/domain/EntityScanPackages.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/domain/EntityScanPackages.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -23,11 +23,11 @@ import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; +import java.util.function.Supplier; 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.context.annotation.ImportBeanDefinitionRegistrar; @@ -109,29 +109,15 @@ public class EntityScanPackages { Assert.notNull(registry, "Registry must not be null"); Assert.notNull(packageNames, "PackageNames must not be null"); if (registry.containsBeanDefinition(BEAN)) { - BeanDefinition beanDefinition = registry.getBeanDefinition(BEAN); - ConstructorArgumentValues constructorArguments = beanDefinition.getConstructorArgumentValues(); - constructorArguments.addIndexedArgumentValue(0, addPackageNames(constructorArguments, packageNames)); + EntityScanPackagesBeanDefinition beanDefinition = (EntityScanPackagesBeanDefinition) registry + .getBeanDefinition(BEAN); + beanDefinition.addPackageNames(packageNames); } else { - GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); - beanDefinition.setBeanClass(EntityScanPackages.class); - beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(0, - StringUtils.toStringArray(packageNames)); - beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - registry.registerBeanDefinition(BEAN, beanDefinition); + registry.registerBeanDefinition(BEAN, new EntityScanPackagesBeanDefinition(packageNames)); } } - private static String[] addPackageNames(ConstructorArgumentValues constructorArguments, - Collection packageNames) { - String[] existing = (String[]) constructorArguments.getIndexedArgumentValue(0, String[].class).getValue(); - Set merged = new LinkedHashSet<>(); - merged.addAll(Arrays.asList(existing)); - merged.addAll(packageNames); - return StringUtils.toStringArray(merged); - } - /** * {@link ImportBeanDefinitionRegistrar} to store the base package from the importing * configuration. @@ -162,4 +148,25 @@ public class EntityScanPackages { } + static class EntityScanPackagesBeanDefinition extends GenericBeanDefinition { + + private Set packageNames = new LinkedHashSet<>(); + + EntityScanPackagesBeanDefinition(Collection packageNames) { + setBeanClass(EntityScanPackages.class); + setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + addPackageNames(packageNames); + } + + @Override + public Supplier getInstanceSupplier() { + return () -> new EntityScanPackages(StringUtils.toStringArray(this.packageNames)); + } + + private void addPackageNames(Collection additionalPackageNames) { + this.packageNames.addAll(additionalPackageNames); + } + + } + } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitializationConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitializationConfiguration.java index fd6e68c6d1..9da2bca593 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitializationConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceInitializationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -17,8 +17,9 @@ package org.springframework.boot.autoconfigure.jdbc; import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; @@ -46,8 +47,10 @@ class DataSourceInitializationConfiguration { public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { if (!registry.containsBeanDefinition(BEAN_NAME)) { - GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); - beanDefinition.setBeanClass(DataSourceInitializerPostProcessor.class); + AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder + .genericBeanDefinition(DataSourceInitializerPostProcessor.class, + DataSourceInitializerPostProcessor::new) + .getBeanDefinition(); beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); // We don't need this one to be post processed otherwise it can cause a // cascade of bean instantiation that we would rather avoid. diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/DataSourceInitializedPublisher.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/DataSourceInitializedPublisher.java index 9896a82af3..e2583e8cbe 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/DataSourceInitializedPublisher.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/DataSourceInitializedPublisher.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -29,8 +29,9 @@ import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.boot.autoconfigure.jdbc.DataSourceSchemaCreatedEvent; import org.springframework.boot.jdbc.EmbeddedDatabaseConnection; import org.springframework.context.ApplicationContext; @@ -133,8 +134,8 @@ class DataSourceInitializedPublisher implements BeanPostProcessor { public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { if (!registry.containsBeanDefinition(BEAN_NAME)) { - GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); - beanDefinition.setBeanClass(DataSourceInitializedPublisher.class); + AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition( + DataSourceInitializedPublisher.class, DataSourceInitializedPublisher::new).getBeanDefinition(); beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); // We don't need this one to be post processed otherwise it can cause a // cascade of bean instantiation that we would rather avoid. diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/BoundConfigurationProperties.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/BoundConfigurationProperties.java index 0233fee615..fdb806123a 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/BoundConfigurationProperties.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/BoundConfigurationProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -21,8 +21,8 @@ import java.util.LinkedHashMap; import java.util.Map; import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.boot.context.properties.source.ConfigurationProperty; import org.springframework.boot.context.properties.source.ConfigurationPropertyName; import org.springframework.context.ApplicationContext; @@ -81,8 +81,9 @@ public class BoundConfigurationProperties { static void register(BeanDefinitionRegistry registry) { Assert.notNull(registry, "Registry must not be null"); if (!registry.containsBeanDefinition(BEAN_NAME)) { - GenericBeanDefinition definition = new GenericBeanDefinition(); - definition.setBeanClass(BoundConfigurationProperties.class); + BeanDefinition definition = BeanDefinitionBuilder + .genericBeanDefinition(BoundConfigurationProperties.class, BoundConfigurationProperties::new) + .getBeanDefinition(); definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); registry.registerBeanDefinition(BEAN_NAME, definition); } diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata.java index 6499b9af3e..4035016246 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata.java @@ -24,8 +24,8 @@ import java.util.Map; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -83,8 +83,8 @@ public class ConfigurationBeanFactoryMetadata implements ApplicationContextAware static void register(BeanDefinitionRegistry registry) { if (!registry.containsBeanDefinition(BEAN_NAME)) { - GenericBeanDefinition definition = new GenericBeanDefinition(); - definition.setBeanClass(ConfigurationBeanFactoryMetadata.class); + BeanDefinition definition = BeanDefinitionBuilder.genericBeanDefinition( + ConfigurationBeanFactoryMetadata.class, ConfigurationBeanFactoryMetadata::new).getBeanDefinition(); definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); registry.registerBeanDefinition(ConfigurationBeanFactoryMetadata.BEAN_NAME, definition); } diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBinder.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBinder.java index 7c5d64cbfe..9124ccb241 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBinder.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBinder.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -26,8 +26,10 @@ import org.springframework.beans.PropertyEditorRegistry; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.beans.factory.support.GenericBeanDefinition; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.context.properties.bind.BindHandler; import org.springframework.boot.context.properties.bind.BindResult; import org.springframework.boot.context.properties.bind.Bindable; @@ -186,17 +188,20 @@ class ConfigurationPropertiesBinder { static void register(BeanDefinitionRegistry registry) { if (!registry.containsBeanDefinition(FACTORY_BEAN_NAME)) { - GenericBeanDefinition definition = new GenericBeanDefinition(); - definition.setBeanClass(ConfigurationPropertiesBinder.Factory.class); + AbstractBeanDefinition definition = BeanDefinitionBuilder + .genericBeanDefinition(ConfigurationPropertiesBinder.Factory.class, + ConfigurationPropertiesBinder.Factory::new) + .getBeanDefinition(); definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); registry.registerBeanDefinition(ConfigurationPropertiesBinder.FACTORY_BEAN_NAME, definition); } if (!registry.containsBeanDefinition(BEAN_NAME)) { - GenericBeanDefinition definition = new GenericBeanDefinition(); - definition.setBeanClass(ConfigurationPropertiesBinder.class); + AbstractBeanDefinition definition = BeanDefinitionBuilder + .genericBeanDefinition(ConfigurationPropertiesBinder.class, + () -> ((DefaultListableBeanFactory) registry) + .getBean(FACTORY_BEAN_NAME, ConfigurationPropertiesBinder.Factory.class).create()) + .getBeanDefinition(); definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - definition.setFactoryBeanName(FACTORY_BEAN_NAME); - definition.setFactoryMethodName("create"); registry.registerBeanDefinition(ConfigurationPropertiesBinder.BEAN_NAME, definition); } } diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBindingPostProcessor.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBindingPostProcessor.java index 742078b655..96bf642192 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBindingPostProcessor.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBindingPostProcessor.java @@ -20,8 +20,8 @@ import org.springframework.beans.BeansException; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.boot.context.properties.ConfigurationPropertiesBean.BindMethod; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -107,8 +107,10 @@ public class ConfigurationPropertiesBindingPostProcessor public static void register(BeanDefinitionRegistry registry) { Assert.notNull(registry, "Registry must not be null"); if (!registry.containsBeanDefinition(BEAN_NAME)) { - GenericBeanDefinition definition = new GenericBeanDefinition(); - definition.setBeanClass(ConfigurationPropertiesBindingPostProcessor.class); + BeanDefinition definition = BeanDefinitionBuilder + .genericBeanDefinition(ConfigurationPropertiesBindingPostProcessor.class, + ConfigurationPropertiesBindingPostProcessor::new) + .getBeanDefinition(); definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); registry.registerBeanDefinition(BEAN_NAME, definition); } diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/ServletComponentScanRegistrar.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/ServletComponentScanRegistrar.java index 6b6fa26ca5..accda1edaa 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/ServletComponentScanRegistrar.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/ServletComponentScanRegistrar.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 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. @@ -17,11 +17,12 @@ package org.springframework.boot.web.servlet; import java.util.Arrays; +import java.util.Collection; import java.util.LinkedHashSet; import java.util.Set; +import java.util.function.Supplier; import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.beans.factory.config.ConstructorArgumentValues.ValueHolder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; @@ -52,20 +53,15 @@ class ServletComponentScanRegistrar implements ImportBeanDefinitionRegistrar { } private void updatePostProcessor(BeanDefinitionRegistry registry, Set packagesToScan) { - BeanDefinition definition = registry.getBeanDefinition(BEAN_NAME); - ValueHolder constructorArguments = definition.getConstructorArgumentValues().getGenericArgumentValue(Set.class); - @SuppressWarnings("unchecked") - Set mergedPackages = (Set) constructorArguments.getValue(); - mergedPackages.addAll(packagesToScan); - constructorArguments.setValue(mergedPackages); + ServletComponentRegisteringPostProcessorBeanDefinition definition = (ServletComponentRegisteringPostProcessorBeanDefinition) registry + .getBeanDefinition(BEAN_NAME); + definition.addPackageNames(packagesToScan); } private void addPostProcessor(BeanDefinitionRegistry registry, Set packagesToScan) { - GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); - beanDefinition.setBeanClass(ServletComponentRegisteringPostProcessor.class); - beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(packagesToScan); - beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - registry.registerBeanDefinition(BEAN_NAME, beanDefinition); + ServletComponentRegisteringPostProcessorBeanDefinition definition = new ServletComponentRegisteringPostProcessorBeanDefinition( + packagesToScan); + registry.registerBeanDefinition(BEAN_NAME, definition); } private Set getPackagesToScan(AnnotationMetadata metadata) { @@ -83,4 +79,25 @@ class ServletComponentScanRegistrar implements ImportBeanDefinitionRegistrar { return packagesToScan; } + static final class ServletComponentRegisteringPostProcessorBeanDefinition extends GenericBeanDefinition { + + private Set packageNames = new LinkedHashSet<>(); + + ServletComponentRegisteringPostProcessorBeanDefinition(Collection packageNames) { + setBeanClass(ServletComponentRegisteringPostProcessor.class); + setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + addPackageNames(packageNames); + } + + @Override + public Supplier getInstanceSupplier() { + return () -> new ServletComponentRegisteringPostProcessor(this.packageNames); + } + + private void addPackageNames(Collection additionalPackageNames) { + this.packageNames.addAll(additionalPackageNames); + } + + } + }