Skip to content

Commit ac521a3

Browse files
committedFeb 15, 2023
Refine instance supplier check in BeanDefinitionMethodGenerator
This commit refines the instance supplier check in BeanDefinitionMethodGenerator constructor in order to allow overriding by an AOT contribution. Closes gh-29556
1 parent 9a4df5a commit ac521a3

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed
 

‎spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGenerator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class BeanDefinitionMethodGenerator {
7878
List<BeanRegistrationAotContribution> aotContributions) {
7979

8080
RootBeanDefinition mbd = registeredBean.getMergedBeanDefinition();
81-
if (mbd.getInstanceSupplier() != null) {
81+
if (mbd.getInstanceSupplier() != null && aotContributions.isEmpty()) {
8282
throw new IllegalArgumentException("Code generation is not supported for bean definitions declaring an instance supplier callback : " + mbd);
8383
}
8484
this.methodGeneratorFactory = methodGeneratorFactory;

‎spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGeneratorTests.java

+19-2
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,23 @@ void generateBeanDefinitionMethodGeneratesMethod() {
105105
});
106106
}
107107

108+
@Test // gh-29556
109+
void generateBeanDefinitionMethodGeneratesMethodWithInstanceSupplier() {
110+
RegisteredBean registeredBean = registerBean(new RootBeanDefinition(TestBean.class, TestBean::new));
111+
BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(
112+
this.methodGeneratorFactory, registeredBean, null,
113+
List.of((generationContext, beanRegistrationCode) -> { }));
114+
MethodReference method = generator.generateBeanDefinitionMethod(
115+
this.generationContext, this.beanRegistrationsCode);
116+
compile(method, (actual, compiled) -> {
117+
SourceFile sourceFile = compiled.getSourceFile(".*BeanDefinitions");
118+
assertThat(sourceFile).contains("Get the bean definition for 'testBean'");
119+
assertThat(sourceFile).contains("beanType = TestBean.class");
120+
assertThat(sourceFile).contains("setInstanceSupplier(TestBean::new)");
121+
assertThat(actual).isInstanceOf(RootBeanDefinition.class);
122+
});
123+
}
124+
108125
@Test
109126
void generateBeanDefinitionMethodWhenHasInnerClassTargetMethodGeneratesMethod() {
110127
this.beanFactory.registerBeanDefinition("testBeanConfiguration", new RootBeanDefinition(
@@ -493,8 +510,8 @@ void generateBeanDefinitionMethodWhenBeanIsOfPrimitiveType() {
493510
testBeanDefinitionMethodInCurrentFile(Boolean.class, beanDefinition);
494511
}
495512

496-
@Test
497-
void throwExceptionWithInstanceSupplier() {
513+
@Test // gh-29556
514+
void throwExceptionWithInstanceSupplierWithoutAotContribution() {
498515
RegisteredBean registeredBean = registerBean(new RootBeanDefinition(TestBean.class, TestBean::new));
499516
assertThatIllegalArgumentException().isThrownBy(() -> new BeanDefinitionMethodGenerator(
500517
this.methodGeneratorFactory, registeredBean, null,

0 commit comments

Comments
 (0)
Please sign in to comment.