This commit is contained in:
Stephane Nicoll 2022-07-27 15:10:09 +02:00
parent f0f7f72de9
commit 88e29689b6
13 changed files with 23 additions and 26 deletions

View File

@ -446,7 +446,7 @@ public final class BeanInstanceSupplier<T> extends AutowiredElementResolver impl
try { try {
Class<?>[] actualParameterTypes = (!ClassUtils.isInnerClass(beanClass)) Class<?>[] actualParameterTypes = (!ClassUtils.isInnerClass(beanClass))
? this.parameterTypes : ObjectUtils.addObjectToArray( ? this.parameterTypes : ObjectUtils.addObjectToArray(
this.parameterTypes, beanClass.getEnclosingClass(), 0); this.parameterTypes, beanClass.getEnclosingClass(), 0);
return beanClass.getDeclaredConstructor(actualParameterTypes); return beanClass.getDeclaredConstructor(actualParameterTypes);
} }
catch (NoSuchMethodException ex) { catch (NoSuchMethodException ex) {

View File

@ -90,7 +90,7 @@ class BeanRegistrationCodeGenerator implements BeanRegistrationCode {
generationContext, this, this.constructorOrFactoryMethod, generationContext, this, this.constructorOrFactoryMethod,
this.instancePostProcessors.isEmpty()); this.instancePostProcessors.isEmpty());
builder.add(this.codeFragments.generateSetBeanInstanceSupplierCode(generationContext, builder.add(this.codeFragments.generateSetBeanInstanceSupplierCode(generationContext,
this, instanceSupplierCode, this.instancePostProcessors)); this, instanceSupplierCode, this.instancePostProcessors));
builder.add(this.codeFragments.generateReturnCode(generationContext, this)); builder.add(this.codeFragments.generateReturnCode(generationContext, this));
return builder.build(); return builder.build();
} }

View File

@ -281,7 +281,8 @@ class ConstructorOrFactoryMethodResolver {
return true; return true;
} }
return switch (fallbackMode) { return switch (fallbackMode) {
case ASSIGNABLE_ELEMENT -> isAssignable(valueType).test(extractElementType(parameterType)); case ASSIGNABLE_ELEMENT ->
isAssignable(valueType).test(extractElementType(parameterType));
case TYPE_CONVERSION -> typeConversionFallback(valueType).test(parameterType); case TYPE_CONVERSION -> typeConversionFallback(valueType).test(parameterType);
default -> false; default -> false;
}; };

View File

@ -174,7 +174,7 @@ class InstanceSupplierCodeGenerator {
boolean hasArguments = constructor.getParameterCount() > 0; boolean hasArguments = constructor.getParameterCount() > 0;
CodeBlock arguments = hasArguments CodeBlock arguments = hasArguments
? new AutowiredArgumentsCodeGenerator(declaringClass, constructor) ? new AutowiredArgumentsCodeGenerator(declaringClass, constructor)
.generateCode(constructor.getParameterTypes(), parameterOffset) .generateCode(constructor.getParameterTypes(), parameterOffset)
: NO_ARGS; : NO_ARGS;
CodeBlock newInstance = generateNewInstanceCodeForConstructor(dependsOnBean, CodeBlock newInstance = generateNewInstanceCodeForConstructor(dependsOnBean,
declaringClass, arguments); declaringClass, arguments);
@ -267,7 +267,7 @@ class InstanceSupplierCodeGenerator {
boolean hasArguments = factoryMethod.getParameterCount() > 0; boolean hasArguments = factoryMethod.getParameterCount() > 0;
CodeBlock arguments = hasArguments CodeBlock arguments = hasArguments
? new AutowiredArgumentsCodeGenerator(declaringClass, factoryMethod) ? new AutowiredArgumentsCodeGenerator(declaringClass, factoryMethod)
.generateCode(factoryMethod.getParameterTypes()) .generateCode(factoryMethod.getParameterTypes())
: NO_ARGS; : NO_ARGS;
CodeBlock newInstance = generateNewInstanceCodeForMethod(dependsOnBean, CodeBlock newInstance = generateNewInstanceCodeForMethod(dependsOnBean,
declaringClass, factoryMethodName, arguments); declaringClass, factoryMethodName, arguments);

View File

@ -52,7 +52,7 @@ class AutowiredArgumentsCodeGeneratorTests {
} }
@Test @Test
void generateCodeWhenMulitpleArguments() { void generateCodeWhenMultipleArguments() {
Method method = ReflectionUtils.findMethod(UnambiguousMethods.class, "three", Method method = ReflectionUtils.findMethod(UnambiguousMethods.class, "three",
String.class, Integer.class, Boolean.class); String.class, Integer.class, Boolean.class);
AutowiredArgumentsCodeGenerator generator = new AutowiredArgumentsCodeGenerator( AutowiredArgumentsCodeGenerator generator = new AutowiredArgumentsCodeGenerator(
@ -62,7 +62,7 @@ class AutowiredArgumentsCodeGeneratorTests {
} }
@Test @Test
void generateCodeWhenMulitpleArgumentsWithOffset() { void generateCodeWhenMultipleArgumentsWithOffset() {
Constructor<?> constructor = Outer.Nested.class.getDeclaredConstructors()[0]; Constructor<?> constructor = Outer.Nested.class.getDeclaredConstructors()[0];
AutowiredArgumentsCodeGenerator generator = new AutowiredArgumentsCodeGenerator( AutowiredArgumentsCodeGenerator generator = new AutowiredArgumentsCodeGenerator(
Outer.Nested.class, constructor); Outer.Nested.class, constructor);

View File

@ -62,8 +62,8 @@ class AutowiredFieldValueResolverTests {
@Test @Test
void resolveWhenRegisteredBeanIsNullThrowsException() { void resolveWhenRegisteredBeanIsNullThrowsException() {
assertThatIllegalArgumentException().isThrownBy( assertThatIllegalArgumentException().isThrownBy(() ->
() -> AutowiredFieldValueResolver.forField("string").resolve(null)) AutowiredFieldValueResolver.forField("string").resolve(null))
.withMessage("'registeredBean' must not be null"); .withMessage("'registeredBean' must not be null");
} }

View File

@ -115,7 +115,7 @@ class AutowiredMethodArgumentsResolverTests {
} }
@Test @Test
void resolveRequiredWithMultipleDependencesReturnsValue() { void resolveRequiredWithMultipleDependenciesReturnsValue() {
Environment environment = mock(Environment.class); Environment environment = mock(Environment.class);
this.beanFactory.registerSingleton("test", "testValue"); this.beanFactory.registerSingleton("test", "testValue");
this.beanFactory.registerSingleton("environment", environment); this.beanFactory.registerSingleton("environment", environment);

View File

@ -111,7 +111,7 @@ class BeanDefinitionMethodGeneratorFactoryTests {
} }
@Test @Test
void getBeanDefinitionMethodGeneratorWhenRegisteredBeanIsAotProcessorFilteresBean() { void getBeanDefinitionMethodGeneratorWhenRegisteredBeanIsAotProcessorFiltersBean() {
MockSpringFactoriesLoader springFactoriesLoader = new MockSpringFactoriesLoader(); MockSpringFactoriesLoader springFactoriesLoader = new MockSpringFactoriesLoader();
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
beanFactory.registerBeanDefinition("test1", BeanDefinitionBuilder beanFactory.registerBeanDefinition("test1", BeanDefinitionBuilder
@ -127,7 +127,7 @@ class BeanDefinitionMethodGeneratorFactoryTests {
} }
@Test @Test
void getBeanDefinitionMethodGeneratorWhenRegisteredBeanIsAotProcessorAndFilteresBeanBeanRegistrationExcludeFilterDoesNotFilterBean() { void getBeanDefinitionMethodGeneratorWhenRegisteredBeanIsAotProcessorAndFiltersBeanBeanRegistrationExcludeFilterDoesNotFilterBean() {
MockSpringFactoriesLoader springFactoriesLoader = new MockSpringFactoriesLoader(); MockSpringFactoriesLoader springFactoriesLoader = new MockSpringFactoriesLoader();
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
beanFactory.registerBeanDefinition("test", BeanDefinitionBuilder beanFactory.registerBeanDefinition("test", BeanDefinitionBuilder
@ -179,7 +179,7 @@ class BeanDefinitionMethodGeneratorFactoryTests {
} }
static class TestBeanFactoryInitializationAotProcessorBean implements BeanFactoryInitializationAotProcessor{ static class TestBeanFactoryInitializationAotProcessorBean implements BeanFactoryInitializationAotProcessor {
@Override @Override
public BeanFactoryInitializationAotContribution processAheadOfTime(ConfigurableListableBeanFactory beanFactory) { public BeanFactoryInitializationAotContribution processAheadOfTime(ConfigurableListableBeanFactory beanFactory) {

View File

@ -55,23 +55,21 @@ import static org.assertj.core.api.Assertions.assertThat;
*/ */
class BeanRegistrationsAotContributionTests { class BeanRegistrationsAotContributionTests {
private final MockSpringFactoriesLoader springFactoriesLoader; private final DefaultListableBeanFactory beanFactory;
private DefaultListableBeanFactory beanFactory;
private TestGenerationContext generationContext;
private final BeanDefinitionMethodGeneratorFactory methodGeneratorFactory; private final BeanDefinitionMethodGeneratorFactory methodGeneratorFactory;
private TestGenerationContext generationContext;
private MockBeanFactoryInitializationCode beanFactoryInitializationCode; private MockBeanFactoryInitializationCode beanFactoryInitializationCode;
BeanRegistrationsAotContributionTests() { BeanRegistrationsAotContributionTests() {
this.springFactoriesLoader = new MockSpringFactoriesLoader(); MockSpringFactoriesLoader springFactoriesLoader = new MockSpringFactoriesLoader();
this.beanFactory = new DefaultListableBeanFactory(); this.beanFactory = new DefaultListableBeanFactory();
this.generationContext = new TestGenerationContext();
this.methodGeneratorFactory = new BeanDefinitionMethodGeneratorFactory( this.methodGeneratorFactory = new BeanDefinitionMethodGeneratorFactory(
new AotFactoriesLoader(this.beanFactory, this.springFactoriesLoader)); new AotFactoriesLoader(this.beanFactory, springFactoriesLoader));
this.generationContext = new TestGenerationContext();
this.beanFactoryInitializationCode = new MockBeanFactoryInitializationCode(this.generationContext); this.beanFactoryInitializationCode = new MockBeanFactoryInitializationCode(this.generationContext);
} }

View File

@ -305,7 +305,7 @@ class ConstructorOrFactoryMethodResolverTests {
void beanDefinitionWithClassArrayFactoryMethodArgAndAnotherMatchingConstructor() { void beanDefinitionWithClassArrayFactoryMethodArgAndAnotherMatchingConstructor() {
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition( BeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(
ClassArrayFactoryMethodSampleWithAnotherFactoryMethod.class.getName()) ClassArrayFactoryMethodSampleWithAnotherFactoryMethod.class.getName())
.setFactoryMethod("of").addConstructorArgValue("test1") .setFactoryMethod("of").addConstructorArgValue("test1")
.getBeanDefinition(); .getBeanDefinition();
Executable executable = resolve(beanFactory, beanDefinition); Executable executable = resolve(beanFactory, beanDefinition);

View File

@ -86,7 +86,7 @@ class DefaultBeanRegistrationCodeFragmentsTests {
RegisteredBean registeredBean = registerTestBean(SimpleBean.class); RegisteredBean registeredBean = registerTestBean(SimpleBean.class);
assertThat(createInstance(registeredBean).getTarget(registeredBean, assertThat(createInstance(registeredBean).getTarget(registeredBean,
PrivilegedTestBeanFactoryBean.class.getDeclaredConstructors()[0])).isEqualTo( PrivilegedTestBeanFactoryBean.class.getDeclaredConstructors()[0])).isEqualTo(
PrivilegedTestBeanFactoryBean.class); PrivilegedTestBeanFactoryBean.class);
} }
@Test @Test

View File

@ -32,7 +32,6 @@ public enum EnumWithClassBody {
* With class body. * With class body.
*/ */
TWO { TWO {
@Override @Override
public String toString() { public String toString() {
return "2"; return "2";

View File

@ -147,8 +147,7 @@ class InstanceSupplierCodeGeneratorTests {
compile(beanFactory, beanDefinition, (instanceSupplier, compiled) -> { compile(beanFactory, beanDefinition, (instanceSupplier, compiled) -> {
NumberHolder<?> bean = getBean(beanFactory, beanDefinition, instanceSupplier); NumberHolder<?> bean = getBean(beanFactory, beanDefinition, instanceSupplier);
assertThat(bean).isInstanceOf(NumberHolder.class); assertThat(bean).isInstanceOf(NumberHolder.class);
assertThat(bean).extracting("number").isNull(); // No property assertThat(bean).extracting("number").isNull(); // No property actually set
// actually set
assertThat(compiled.getSourceFile()).contains("NumberHolderFactoryBean::new"); assertThat(compiled.getSourceFile()).contains("NumberHolderFactoryBean::new");
}); });
assertThat(getReflectionHints().getTypeHint(NumberHolderFactoryBean.class)) assertThat(getReflectionHints().getTypeHint(NumberHolderFactoryBean.class))