Rename BeanInstantiationContributor to Contribution

This commit polishes the contribution model where an AOT contributing
bean post processor can return a contribution, rather than a
contributor. This makes it easier to return `null` if no contribution
can be produced now that it is named this way.

See gh-28047
This commit is contained in:
Stephane Nicoll
2022-03-04 09:50:27 +01:00
parent 572d017370
commit 20b17f02a2
6 changed files with 51 additions and 52 deletions

View File

@@ -24,11 +24,12 @@ import org.springframework.aot.hint.ExecutableMode;
import org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.TypeReference;
import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessorTests.ResourceInjectionBean;
import org.springframework.beans.factory.generator.BeanInstantiationContributor;
import org.springframework.beans.factory.generator.BeanInstantiationContribution;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.testfixture.beans.TestBean;
import org.springframework.core.env.Environment;
import org.springframework.javapoet.support.CodeSnippet;
import org.springframework.lang.Nullable;
import static org.assertj.core.api.Assertions.assertThat;
@@ -37,10 +38,10 @@ import static org.assertj.core.api.Assertions.assertThat;
*
* @author Stephane Nicoll
*/
class AutowiredAnnotationBeanInstantiationContributorTests {
class AutowiredAnnotationBeanInstantiationContributionTests {
@Test
void buildAotContributorWithPackageProtectedFieldInjection() {
void contributeWithPackageProtectedFieldInjection() {
CodeContribution contribution = contribute(PackageProtectedFieldInjectionSample.class);
assertThat(CodeSnippet.process(contribution.statements().toCodeBlock())).isEqualTo("""
instanceContext.field("environment", Environment.class)
@@ -58,12 +59,12 @@ class AutowiredAnnotationBeanInstantiationContributorTests {
}
@Test
void buildAotContributorWithPrivateFieldInjection() {
void contributeWithPrivateFieldInjection() {
CodeContribution contribution = contribute(PrivateFieldInjectionSample.class);
assertThat(CodeSnippet.process(contribution.statements().toCodeBlock())).isEqualTo("""
instanceContext.field("environment", Environment.class)
.invoke(beanFactory, (attributes) -> {
Field environmentField = ReflectionUtils.findField(AutowiredAnnotationBeanInstantiationContributorTests.PrivateFieldInjectionSample.class, "environment", Environment.class);
Field environmentField = ReflectionUtils.findField(AutowiredAnnotationBeanInstantiationContributionTests.PrivateFieldInjectionSample.class, "environment", Environment.class);
ReflectionUtils.makeAccessible(environmentField);
ReflectionUtils.setField(environmentField, bean, attributes.get(0));
})""");
@@ -79,7 +80,7 @@ class AutowiredAnnotationBeanInstantiationContributorTests {
}
@Test
void buildAotContributorWithPublicMethodInjection() {
void contributeWithPublicMethodInjection() {
CodeContribution contribution = contribute(PublicMethodInjectionSample.class);
assertThat(CodeSnippet.process(contribution.statements().toCodeBlock())).isEqualTo("""
instanceContext.method("setTestBean", TestBean.class)
@@ -95,7 +96,7 @@ class AutowiredAnnotationBeanInstantiationContributorTests {
}
@Test
void buildAotContributorWithInjectionPoints() {
void contributeWithInjectionPoints() {
CodeContribution contribution = contribute(ResourceInjectionBean.class);
assertThat(CodeSnippet.process(contribution.statements().toCodeBlock())).isEqualTo("""
instanceContext.field("testBean", TestBean.class)
@@ -116,23 +117,24 @@ class AutowiredAnnotationBeanInstantiationContributorTests {
}
@Test
void buildAotContributorWithoutInjectionPoints() {
BeanInstantiationContributor contributor = createAotContributor(String.class);
assertThat(contributor).isNotNull().isSameAs(BeanInstantiationContributor.NO_OP);
void contributeWithoutInjectionPoints() {
BeanInstantiationContribution contributor = createContribution(String.class);
assertThat(contributor).isNull();
}
private DefaultCodeContribution contribute(Class<?> type) {
BeanInstantiationContributor contributor = createAotContributor(type);
BeanInstantiationContribution contributor = createContribution(type);
assertThat(contributor).isNotNull();
DefaultCodeContribution contribution = new DefaultCodeContribution(new RuntimeHints());
contributor.contribute(contribution);
contributor.applyTo(contribution);
return contribution;
}
private BeanInstantiationContributor createAotContributor(Class<?> type) {
@Nullable
private BeanInstantiationContribution createContribution(Class<?> type) {
AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
RootBeanDefinition beanDefinition = new RootBeanDefinition(type);
return bpp.buildAotContributor(beanDefinition, type, "test");
return bpp.contribute(beanDefinition, type, "test");
}

View File

@@ -106,10 +106,10 @@ class DefaultBeanInstantiationGeneratorTests {
}
@Test
void generateUsingNoArgConstructorAndContributorsDoesNotUseMethodReference() {
void generateUsingNoArgConstructorAndContributionsDoesNotUseMethodReference() {
CodeContribution contribution = generate(SimpleConfiguration.class.getDeclaredConstructors()[0],
contrib -> contrib.statements().add(CodeBlock.of("// hello\n")),
BeanInstantiationContributor.NO_OP);
contrib -> {});
assertThat(code(contribution)).isEqualTo("""
(instanceContext) -> {
SimpleConfiguration bean = new SimpleConfiguration();
@@ -119,7 +119,7 @@ class DefaultBeanInstantiationGeneratorTests {
}
@Test
void generateUsingContributorsRegisterHints() {
void generateUsingContributionsRegisterHints() {
CodeContribution contribution = generate(SimpleConfiguration.class.getDeclaredConstructors()[0],
contrib -> {
contrib.statements().add(CodeBlock.of("// hello\n"));
@@ -170,7 +170,7 @@ class DefaultBeanInstantiationGeneratorTests {
}
@Test
void generateUsingMethodAndContributors() {
void generateUsingMethodAndContributions() {
CodeContribution contribution = generate(method(SimpleConfiguration.class, "stringBean"),
contrib -> {
contrib.statements().add(CodeBlock.of("// hello\n"));
@@ -240,9 +240,9 @@ class DefaultBeanInstantiationGeneratorTests {
}
private CodeContribution generate(Executable executable,
BeanInstantiationContributor... beanInstantiationContributors) {
BeanInstantiationContribution... beanInstantiationContributions) {
DefaultBeanInstantiationGenerator generator = new DefaultBeanInstantiationGenerator(executable,
Arrays.asList(beanInstantiationContributors));
Arrays.asList(beanInstantiationContributions));
return generator.generateBeanInstantiation(new RuntimeHints());
}