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
This commit is contained in:
Sébastien Deleuze
2023-02-15 09:31:50 +01:00
parent 9a4df5a97d
commit ac521a366a
2 changed files with 20 additions and 3 deletions

View File

@@ -78,7 +78,7 @@ class BeanDefinitionMethodGenerator {
List<BeanRegistrationAotContribution> aotContributions) {
RootBeanDefinition mbd = registeredBean.getMergedBeanDefinition();
if (mbd.getInstanceSupplier() != null) {
if (mbd.getInstanceSupplier() != null && aotContributions.isEmpty()) {
throw new IllegalArgumentException("Code generation is not supported for bean definitions declaring an instance supplier callback : " + mbd);
}
this.methodGeneratorFactory = methodGeneratorFactory;

View File

@@ -105,6 +105,23 @@ class BeanDefinitionMethodGeneratorTests {
});
}
@Test // gh-29556
void generateBeanDefinitionMethodGeneratesMethodWithInstanceSupplier() {
RegisteredBean registeredBean = registerBean(new RootBeanDefinition(TestBean.class, TestBean::new));
BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(
this.methodGeneratorFactory, registeredBean, null,
List.of((generationContext, beanRegistrationCode) -> { }));
MethodReference method = generator.generateBeanDefinitionMethod(
this.generationContext, this.beanRegistrationsCode);
compile(method, (actual, compiled) -> {
SourceFile sourceFile = compiled.getSourceFile(".*BeanDefinitions");
assertThat(sourceFile).contains("Get the bean definition for 'testBean'");
assertThat(sourceFile).contains("beanType = TestBean.class");
assertThat(sourceFile).contains("setInstanceSupplier(TestBean::new)");
assertThat(actual).isInstanceOf(RootBeanDefinition.class);
});
}
@Test
void generateBeanDefinitionMethodWhenHasInnerClassTargetMethodGeneratesMethod() {
this.beanFactory.registerBeanDefinition("testBeanConfiguration", new RootBeanDefinition(
@@ -493,8 +510,8 @@ class BeanDefinitionMethodGeneratorTests {
testBeanDefinitionMethodInCurrentFile(Boolean.class, beanDefinition);
}
@Test
void throwExceptionWithInstanceSupplier() {
@Test // gh-29556
void throwExceptionWithInstanceSupplierWithoutAotContribution() {
RegisteredBean registeredBean = registerBean(new RootBeanDefinition(TestBean.class, TestBean::new));
assertThatIllegalArgumentException().isThrownBy(() -> new BeanDefinitionMethodGenerator(
this.methodGeneratorFactory, registeredBean, null,