Polishing

This commit is contained in:
Juergen Hoeller
2022-12-01 17:46:31 +01:00
parent 4c7b04e32a
commit d5732fed45
6 changed files with 56 additions and 70 deletions

View File

@@ -88,8 +88,7 @@ class BeanDefinitionMethodGeneratorTests {
@Test
void generateBeanDefinitionMethodGeneratesMethod() {
RegisteredBean registeredBean = registerBean(
new RootBeanDefinition(TestBean.class));
RegisteredBean registeredBean = registerBean(new RootBeanDefinition(TestBean.class));
BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(
this.methodGeneratorFactory, registeredBean, null,
Collections.emptyList());
@@ -172,10 +171,8 @@ class BeanDefinitionMethodGeneratorTests {
@Test
void generateBeanDefinitionMethodWhenHasInstancePostProcessorGeneratesMethod() {
RegisteredBean registeredBean = registerBean(
new RootBeanDefinition(TestBean.class));
BeanRegistrationAotContribution aotContribution = (generationContext,
beanRegistrationCode) -> {
RegisteredBean registeredBean = registerBean(new RootBeanDefinition(TestBean.class));
BeanRegistrationAotContribution aotContribution = (generationContext, beanRegistrationCode) -> {
GeneratedMethod generatedMethod = beanRegistrationCode.getMethods().add("postProcess", method ->
method.addModifiers(Modifier.STATIC)
.addParameter(RegisteredBean.class, "registeredBean")
@@ -183,16 +180,14 @@ class BeanDefinitionMethodGeneratorTests {
.returns(TestBean.class).addCode("return new $T($S);", TestBean.class, "postprocessed"));
beanRegistrationCode.addInstancePostProcessor(generatedMethod.toMethodReference());
};
List<BeanRegistrationAotContribution> aotContributions = Collections
.singletonList(aotContribution);
List<BeanRegistrationAotContribution> aotContributions = Collections.singletonList(aotContribution);
BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(
this.methodGeneratorFactory, registeredBean, null, aotContributions);
MethodReference method = generator.generateBeanDefinitionMethod(
this.generationContext, this.beanRegistrationsCode);
compile(method, (actual, compiled) -> {
assertThat(actual.getBeanClass()).isEqualTo(TestBean.class);
InstanceSupplier<?> supplier = (InstanceSupplier<?>) actual
.getInstanceSupplier();
InstanceSupplier<?> supplier = (InstanceSupplier<?>) actual.getInstanceSupplier();
try {
TestBean instance = (TestBean) supplier.get(registeredBean);
assertThat(instance.getName()).isEqualTo("postprocessed");
@@ -204,9 +199,10 @@ class BeanDefinitionMethodGeneratorTests {
});
}
@Test // gh-28748
@Test // gh-28748
void generateBeanDefinitionMethodWhenHasInstancePostProcessorAndFactoryMethodGeneratesMethod() {
this.beanFactory.registerBeanDefinition("testBeanConfiguration", new RootBeanDefinition(TestBeanConfiguration.class));
this.beanFactory.registerBeanDefinition("testBeanConfiguration",
new RootBeanDefinition(TestBeanConfiguration.class));
RootBeanDefinition beanDefinition = new RootBeanDefinition(TestBean.class);
beanDefinition.setFactoryBeanName("testBeanConfiguration");
beanDefinition.setFactoryMethodName("testBean");
@@ -220,8 +216,7 @@ class BeanDefinitionMethodGeneratorTests {
.returns(TestBean.class).addCode("return new $T($S);", TestBean.class, "postprocessed"));
beanRegistrationCode.addInstancePostProcessor(generatedMethod.toMethodReference());
};
List<BeanRegistrationAotContribution> aotContributions = Collections
.singletonList(aotContribution);
List<BeanRegistrationAotContribution> aotContributions = Collections.singletonList(aotContribution);
BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(
this.methodGeneratorFactory, registeredBean, null, aotContributions);
MethodReference method = generator.generateBeanDefinitionMethod(
@@ -244,10 +239,9 @@ class BeanDefinitionMethodGeneratorTests {
@Test
void generateBeanDefinitionMethodWhenHasCodeFragmentsCustomizerGeneratesMethod() {
RegisteredBean registeredBean = registerBean(
new RootBeanDefinition(TestBean.class));
BeanRegistrationAotContribution aotContribution = BeanRegistrationAotContribution
.withCustomCodeFragments(this::customizeBeanDefinitionCode);
RegisteredBean registeredBean = registerBean(new RootBeanDefinition(TestBean.class));
BeanRegistrationAotContribution aotContribution =
BeanRegistrationAotContribution.withCustomCodeFragments(this::customizeBeanDefinitionCode);
List<BeanRegistrationAotContribution> aotContributions = Collections.singletonList(aotContribution);
BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(
this.methodGeneratorFactory, registeredBean, null, aotContributions);
@@ -260,21 +254,16 @@ class BeanDefinitionMethodGeneratorTests {
});
}
private BeanRegistrationCodeFragments customizeBeanDefinitionCode(
BeanRegistrationCodeFragments codeFragments) {
private BeanRegistrationCodeFragments customizeBeanDefinitionCode(BeanRegistrationCodeFragments codeFragments) {
return new BeanRegistrationCodeFragmentsDecorator(codeFragments) {
@Override
public CodeBlock generateNewBeanDefinitionCode(
GenerationContext generationContext,
ResolvableType beanType,
BeanRegistrationCode beanRegistrationCode) {
public CodeBlock generateNewBeanDefinitionCode(GenerationContext generationContext,
ResolvableType beanType, BeanRegistrationCode beanRegistrationCode) {
CodeBlock.Builder code = CodeBlock.builder();
code.addStatement("// I am custom");
code.add(super.generateNewBeanDefinitionCode(generationContext, beanType, beanRegistrationCode));
return code.build();
}
};
}
@@ -301,10 +290,9 @@ class BeanDefinitionMethodGeneratorTests {
beanDefinition.setAttribute("a", "A");
beanDefinition.setAttribute("b", "B");
RegisteredBean registeredBean = registerBean(beanDefinition);
BeanRegistrationAotContribution aotContribution = BeanRegistrationAotContribution
.withCustomCodeFragments(this::customizeAttributeFilter);
List<BeanRegistrationAotContribution> aotContributions = Collections
.singletonList(aotContribution);
BeanRegistrationAotContribution aotContribution =
BeanRegistrationAotContribution.withCustomCodeFragments(this::customizeAttributeFilter);
List<BeanRegistrationAotContribution> aotContributions = Collections.singletonList(aotContribution);
BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(
this.methodGeneratorFactory, registeredBean, null,
aotContributions);
@@ -316,20 +304,15 @@ class BeanDefinitionMethodGeneratorTests {
});
}
private BeanRegistrationCodeFragments customizeAttributeFilter(
BeanRegistrationCodeFragments codeFragments) {
private BeanRegistrationCodeFragments customizeAttributeFilter(BeanRegistrationCodeFragments codeFragments) {
return new BeanRegistrationCodeFragmentsDecorator(codeFragments) {
@Override
public CodeBlock generateSetBeanDefinitionPropertiesCode(
GenerationContext generationContext,
BeanRegistrationCode beanRegistrationCode,
RootBeanDefinition beanDefinition,
public CodeBlock generateSetBeanDefinitionPropertiesCode(GenerationContext generationContext,
BeanRegistrationCode beanRegistrationCode, RootBeanDefinition beanDefinition,
Predicate<String> attributeFilter) {
return super.generateSetBeanDefinitionPropertiesCode(generationContext,
beanRegistrationCode, beanDefinition, "a"::equals);
}
};
}
@@ -471,8 +454,7 @@ class BeanDefinitionMethodGeneratorTests {
@Test
@CompileWithForkedClassLoader
void generateBeanDefinitionMethodWhenPackagePrivateBean() {
RegisteredBean registeredBean = registerBean(
new RootBeanDefinition(PackagePrivateTestBean.class));
RegisteredBean registeredBean = registerBean(new RootBeanDefinition(PackagePrivateTestBean.class));
BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(
this.methodGeneratorFactory, registeredBean, null,
Collections.emptyList());
@@ -502,6 +484,13 @@ class BeanDefinitionMethodGeneratorTests {
testBeanDefinitionMethodInCurrentFile(DocumentBuilderFactory.class, beanDefinition);
}
@Test
void generateBeanDefinitionMethodWhenBeanIsOfPrimitiveType() {
RootBeanDefinition beanDefinition = (RootBeanDefinition) BeanDefinitionBuilder
.rootBeanDefinition(Boolean.class).setFactoryMethod("parseBoolean").addConstructorArgValue("true").getBeanDefinition();
testBeanDefinitionMethodInCurrentFile(Boolean.class, beanDefinition);
}
private void testBeanDefinitionMethodInCurrentFile(Class<?> targetType, RootBeanDefinition beanDefinition) {
RegisteredBean registeredBean = registerBean(new RootBeanDefinition(beanDefinition));
BeanDefinitionMethodGenerator generator = new BeanDefinitionMethodGenerator(
@@ -525,8 +514,7 @@ class BeanDefinitionMethodGeneratorTests {
return RegisteredBean.of(this.beanFactory, beanName);
}
private void compile(MethodReference method,
BiConsumer<RootBeanDefinition, Compiled> result) {
private void compile(MethodReference method, BiConsumer<RootBeanDefinition, Compiled> result) {
this.beanRegistrationsCode.getTypeBuilder().set(type -> {
CodeBlock methodInvocation = method.toInvokeCodeBlock(ArgumentCodeGenerator.none(),
this.beanRegistrationsCode.getClassName());