Skip to content

Commit 7ea0cc3

Browse files
committed
Allow BeanRegistrationContributionProvider to access the BeanFactory
Closes gh-28384
1 parent 88eac77 commit 7ea0cc3

File tree

3 files changed

+59
-1
lines changed

3 files changed

+59
-1
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/generator/BeanDefinitionsContribution.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
2929
import org.springframework.beans.factory.support.RootBeanDefinition;
3030
import org.springframework.core.io.support.SpringFactoriesLoader;
31+
import org.springframework.core.io.support.SpringFactoriesLoader.ArgumentResolver;
3132

3233
/**
3334
* A {@link BeanFactoryContribution} that generates the bean definitions of a
@@ -62,7 +63,7 @@ public BeanDefinitionsContribution(DefaultListableBeanFactory beanFactory) {
6263

6364
private static List<BeanRegistrationContributionProvider> initializeProviders(DefaultListableBeanFactory beanFactory) {
6465
List<BeanRegistrationContributionProvider> providers = new ArrayList<>(SpringFactoriesLoader.loadFactories(
65-
BeanRegistrationContributionProvider.class, beanFactory.getBeanClassLoader()));
66+
BeanRegistrationContributionProvider.class, beanFactory.getBeanClassLoader(), ArgumentResolver.from(type -> type.isInstance(beanFactory) ? beanFactory : null)));
6667
providers.add(new DefaultBeanRegistrationContributionProvider(beanFactory));
6768
return providers;
6869
}

spring-beans/src/test/java/org/springframework/beans/factory/generator/BeanDefinitionsContributionTests.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616

1717
package org.springframework.beans.factory.generator;
1818

19+
import java.io.IOException;
20+
import java.net.URL;
21+
import java.util.Enumeration;
1922
import java.util.List;
2023
import java.util.function.BiPredicate;
2124

@@ -28,11 +31,14 @@
2831
import org.springframework.aot.generator.GeneratedType;
2932
import org.springframework.aot.generator.GeneratedTypeContext;
3033
import org.springframework.beans.factory.config.BeanDefinition;
34+
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
3135
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
3236
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
3337
import org.springframework.beans.factory.support.RootBeanDefinition;
3438
import org.springframework.javapoet.ClassName;
3539
import org.springframework.javapoet.support.CodeSnippet;
40+
import org.springframework.lang.Nullable;
41+
import org.springframework.util.Assert;
3642

3743
import static org.assertj.core.api.Assertions.assertThat;
3844
import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -44,6 +50,19 @@
4450
*/
4551
class BeanDefinitionsContributionTests {
4652

53+
@Test
54+
void loadContributorWithConstructorArgumentOnBeanFactory() {
55+
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
56+
beanFactory.setBeanClassLoader(new TestSpringFactoriesClassLoader(
57+
"bean-registration-contribution-provider-constructor.factories"));
58+
BeanDefinitionsContribution contribution = new BeanDefinitionsContribution(beanFactory);
59+
assertThat(contribution).extracting("contributionProviders").asList()
60+
.anySatisfy(provider -> assertThat(provider).isInstanceOfSatisfying(TestConstructorBeanRegistrationContributionProvider.class,
61+
testProvider -> assertThat(testProvider.beanFactory).isSameAs(beanFactory)))
62+
.anySatisfy(provider -> assertThat(provider).isInstanceOf(DefaultBeanRegistrationContributionProvider.class))
63+
.hasSize(2);
64+
}
65+
4766
@Test
4867
void contributeThrowsContributionNotFoundIfNoContributionIsAvailable() {
4968
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
@@ -158,4 +177,40 @@ public BeanFactoryContribution getContributionFor(String beanName, RootBeanDefin
158177
}
159178
}
160179

180+
static class TestConstructorBeanRegistrationContributionProvider implements BeanRegistrationContributionProvider {
181+
182+
private final ConfigurableListableBeanFactory beanFactory;
183+
184+
TestConstructorBeanRegistrationContributionProvider(ConfigurableListableBeanFactory beanFactory) {
185+
Assert.notNull(beanFactory, "BeanFactory must not be null");
186+
this.beanFactory = beanFactory;
187+
}
188+
189+
@Nullable
190+
@Override
191+
public BeanFactoryContribution getContributionFor(String beanName, RootBeanDefinition beanDefinition) {
192+
return null;
193+
}
194+
195+
}
196+
197+
static class TestSpringFactoriesClassLoader extends ClassLoader {
198+
199+
private final String factoriesName;
200+
201+
TestSpringFactoriesClassLoader(String factoriesName) {
202+
super(BeanDefinitionsContributionTests.class.getClassLoader());
203+
this.factoriesName = factoriesName;
204+
}
205+
206+
@Override
207+
public Enumeration<URL> getResources(String name) throws IOException {
208+
if ("META-INF/spring.factories".equals(name)) {
209+
return super.getResources("org/springframework/beans/factory/generator/" + this.factoriesName);
210+
}
211+
return super.getResources(name);
212+
}
213+
214+
}
215+
161216
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
org.springframework.beans.factory.generator.BeanRegistrationContributionProvider= \
2+
org.springframework.beans.factory.generator.BeanDefinitionsContributionTests.TestConstructorBeanRegistrationContributionProvider

0 commit comments

Comments
 (0)