diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/generator/BeanDefinitionsContribution.java b/spring-beans/src/main/java/org/springframework/beans/factory/generator/BeanDefinitionsContribution.java index cb07da8a17..fa4cd09795 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/generator/BeanDefinitionsContribution.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/generator/BeanDefinitionsContribution.java @@ -28,6 +28,7 @@ import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.core.io.support.SpringFactoriesLoader; +import org.springframework.core.io.support.SpringFactoriesLoader.ArgumentResolver; /** * A {@link BeanFactoryContribution} that generates the bean definitions of a @@ -62,7 +63,7 @@ public class BeanDefinitionsContribution implements BeanFactoryContribution { private static List initializeProviders(DefaultListableBeanFactory beanFactory) { List providers = new ArrayList<>(SpringFactoriesLoader.loadFactories( - BeanRegistrationContributionProvider.class, beanFactory.getBeanClassLoader())); + BeanRegistrationContributionProvider.class, beanFactory.getBeanClassLoader(), ArgumentResolver.from(type -> type.isInstance(beanFactory) ? beanFactory : null))); providers.add(new DefaultBeanRegistrationContributionProvider(beanFactory)); return providers; } diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/generator/BeanDefinitionsContributionTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/generator/BeanDefinitionsContributionTests.java index 6ab9e57e37..68e605f62c 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/generator/BeanDefinitionsContributionTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/generator/BeanDefinitionsContributionTests.java @@ -16,6 +16,9 @@ package org.springframework.beans.factory.generator; +import java.io.IOException; +import java.net.URL; +import java.util.Enumeration; import java.util.List; import java.util.function.BiPredicate; @@ -28,11 +31,14 @@ import org.springframework.aot.generator.DefaultGeneratedTypeContext; import org.springframework.aot.generator.GeneratedType; import org.springframework.aot.generator.GeneratedTypeContext; 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.DefaultListableBeanFactory; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.javapoet.ClassName; import org.springframework.javapoet.support.CodeSnippet; +import org.springframework.lang.Nullable; +import org.springframework.util.Assert; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -44,6 +50,19 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; */ class BeanDefinitionsContributionTests { + @Test + void loadContributorWithConstructorArgumentOnBeanFactory() { + DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); + beanFactory.setBeanClassLoader(new TestSpringFactoriesClassLoader( + "bean-registration-contribution-provider-constructor.factories")); + BeanDefinitionsContribution contribution = new BeanDefinitionsContribution(beanFactory); + assertThat(contribution).extracting("contributionProviders").asList() + .anySatisfy(provider -> assertThat(provider).isInstanceOfSatisfying(TestConstructorBeanRegistrationContributionProvider.class, + testProvider -> assertThat(testProvider.beanFactory).isSameAs(beanFactory))) + .anySatisfy(provider -> assertThat(provider).isInstanceOf(DefaultBeanRegistrationContributionProvider.class)) + .hasSize(2); + } + @Test void contributeThrowsContributionNotFoundIfNoContributionIsAvailable() { DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); @@ -158,4 +177,40 @@ class BeanDefinitionsContributionTests { } } + static class TestConstructorBeanRegistrationContributionProvider implements BeanRegistrationContributionProvider { + + private final ConfigurableListableBeanFactory beanFactory; + + TestConstructorBeanRegistrationContributionProvider(ConfigurableListableBeanFactory beanFactory) { + Assert.notNull(beanFactory, "BeanFactory must not be null"); + this.beanFactory = beanFactory; + } + + @Nullable + @Override + public BeanFactoryContribution getContributionFor(String beanName, RootBeanDefinition beanDefinition) { + return null; + } + + } + + static class TestSpringFactoriesClassLoader extends ClassLoader { + + private final String factoriesName; + + TestSpringFactoriesClassLoader(String factoriesName) { + super(BeanDefinitionsContributionTests.class.getClassLoader()); + this.factoriesName = factoriesName; + } + + @Override + public Enumeration getResources(String name) throws IOException { + if ("META-INF/spring.factories".equals(name)) { + return super.getResources("org/springframework/beans/factory/generator/" + this.factoriesName); + } + return super.getResources(name); + } + + } + } diff --git a/spring-beans/src/test/resources/org/springframework/beans/factory/generator/bean-registration-contribution-provider-constructor.factories b/spring-beans/src/test/resources/org/springframework/beans/factory/generator/bean-registration-contribution-provider-constructor.factories new file mode 100644 index 0000000000..e63c90b2f9 --- /dev/null +++ b/spring-beans/src/test/resources/org/springframework/beans/factory/generator/bean-registration-contribution-provider-constructor.factories @@ -0,0 +1,2 @@ +org.springframework.beans.factory.generator.BeanRegistrationContributionProvider= \ +org.springframework.beans.factory.generator.BeanDefinitionsContributionTests.TestConstructorBeanRegistrationContributionProvider \ No newline at end of file