diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanInstanceSupplier.java b/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanInstanceSupplier.java index d408a7b6fdb7..020164115da0 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanInstanceSupplier.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanInstanceSupplier.java @@ -237,33 +237,28 @@ AutowiredArguments resolveArguments(RegisteredBean registeredBean) { private AutowiredArguments resolveArguments(RegisteredBean registeredBean, Executable executable) { Assert.isInstanceOf(AbstractAutowireCapableBeanFactory.class, registeredBean.getBeanFactory()); - String beanName = registeredBean.getBeanName(); - Class beanClass = registeredBean.getBeanClass(); - AbstractAutowireCapableBeanFactory beanFactory = - (AbstractAutowireCapableBeanFactory) registeredBean.getBeanFactory(); - RootBeanDefinition mergedBeanDefinition = registeredBean.getMergedBeanDefinition(); + int startIndex = (executable instanceof Constructor constructor && ClassUtils.isInnerClass(constructor.getDeclaringClass())) ? 1 : 0; int parameterCount = executable.getParameterCount(); Object[] resolved = new Object[parameterCount - startIndex]; Assert.isTrue(this.shortcuts == null || this.shortcuts.length == resolved.length, () -> "'shortcuts' must contain " + resolved.length + " elements"); + + ConstructorArgumentValues argumentValues = resolveArgumentValues(registeredBean); Set autowiredBeans = new LinkedHashSet<>(resolved.length); - ConstructorArgumentValues argumentValues = resolveArgumentValues(beanFactory, - beanName, mergedBeanDefinition); for (int i = startIndex; i < parameterCount; i++) { MethodParameter parameter = getMethodParameter(executable, i); - DependencyDescriptor dependencyDescriptor = new DependencyDescriptor(parameter, true); - String shortcut = (this.shortcuts != null) ? this.shortcuts[i - startIndex] : null; + DependencyDescriptor descriptor = new DependencyDescriptor(parameter, true); + String shortcut = (this.shortcuts != null ? this.shortcuts[i - startIndex] : null); if (shortcut != null) { - dependencyDescriptor = new ShortcutDependencyDescriptor( - dependencyDescriptor, shortcut, beanClass); + descriptor = new ShortcutDependencyDescriptor(descriptor, shortcut, registeredBean.getBeanClass()); } ValueHolder argumentValue = argumentValues.getIndexedArgumentValue(i, null); - resolved[i - startIndex] = resolveArgument(registeredBean,autowiredBeans, - dependencyDescriptor, argumentValue); + resolved[i - startIndex] = resolveArgument(registeredBean, descriptor, argumentValue, autowiredBeans); } - registerDependentBeans(beanFactory, beanName, autowiredBeans); + registerDependentBeans(registeredBean.getBeanFactory(), registeredBean.getBeanName(), autowiredBeans); + return AutowiredArguments.of(resolved); } @@ -277,15 +272,14 @@ private MethodParameter getMethodParameter(Executable executable, int index) { throw new IllegalStateException("Unsupported executable: " + executable.getClass().getName()); } - private ConstructorArgumentValues resolveArgumentValues( - AbstractAutowireCapableBeanFactory beanFactory, String beanName, - RootBeanDefinition mergedBeanDefinition) { - + private ConstructorArgumentValues resolveArgumentValues(RegisteredBean registeredBean) { ConstructorArgumentValues resolved = new ConstructorArgumentValues(); - if (mergedBeanDefinition.hasConstructorArgumentValues()) { + RootBeanDefinition beanDefinition = registeredBean.getMergedBeanDefinition(); + if (beanDefinition.hasConstructorArgumentValues() && + registeredBean.getBeanFactory() instanceof AbstractAutowireCapableBeanFactory beanFactory) { BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver( - beanFactory, beanName, mergedBeanDefinition, beanFactory.getTypeConverter()); - ConstructorArgumentValues values = mergedBeanDefinition.getConstructorArgumentValues(); + beanFactory, registeredBean.getBeanName(), beanDefinition, beanFactory.getTypeConverter()); + ConstructorArgumentValues values = beanDefinition.getConstructorArgumentValues(); values.getIndexedArgumentValues().forEach((index, valueHolder) -> { ValueHolder resolvedValue = resolveArgumentValue(valueResolver, valueHolder); resolved.addIndexedArgumentValue(index, resolvedValue); @@ -298,30 +292,27 @@ private ValueHolder resolveArgumentValue(BeanDefinitionValueResolver resolver, V if (valueHolder.isConverted()) { return valueHolder; } - Object resolvedValue = resolver.resolveValueIfNecessary("constructor argument", - valueHolder.getValue()); - ValueHolder resolvedValueHolder = new ValueHolder(resolvedValue, - valueHolder.getType(), valueHolder.getName()); - resolvedValueHolder.setSource(valueHolder); - return resolvedValueHolder; + Object value = resolver.resolveValueIfNecessary("constructor argument", valueHolder.getValue()); + ValueHolder resolvedHolder = new ValueHolder(value, valueHolder.getType(), valueHolder.getName()); + resolvedHolder.setSource(valueHolder); + return resolvedHolder; } @Nullable - private Object resolveArgument(RegisteredBean registeredBean, Set autowiredBeans, - DependencyDescriptor dependencyDescriptor, @Nullable ValueHolder argumentValue) { + private Object resolveArgument(RegisteredBean registeredBean, DependencyDescriptor descriptor, + @Nullable ValueHolder argumentValue, Set autowiredBeans) { TypeConverter typeConverter = registeredBean.getBeanFactory().getTypeConverter(); - Class parameterType = dependencyDescriptor.getMethodParameter().getParameterType(); if (argumentValue != null) { - return (!argumentValue.isConverted()) ? - typeConverter.convertIfNecessary(argumentValue.getValue(), parameterType) : - argumentValue.getConvertedValue(); + return (argumentValue.isConverted() ? argumentValue.getConvertedValue() : + typeConverter.convertIfNecessary(argumentValue.getValue(), + descriptor.getDependencyType(), descriptor.getMethodParameter())); } try { - return registeredBean.resolveAutowiredArgument(dependencyDescriptor, typeConverter, autowiredBeans); + return registeredBean.resolveAutowiredArgument(descriptor, typeConverter, autowiredBeans); } catch (BeansException ex) { - throw new UnsatisfiedDependencyException(null, registeredBean.getBeanName(), dependencyDescriptor, ex); + throw new UnsatisfiedDependencyException(null, registeredBean.getBeanName(), descriptor, ex); } } diff --git a/spring-context/src/testFixtures/java/org/springframework/context/testfixture/AbstractApplicationContextTests.java b/spring-context/src/testFixtures/java/org/springframework/context/testfixture/AbstractApplicationContextTests.java index f10034d916a8..033c8e50d9d6 100644 --- a/spring-context/src/testFixtures/java/org/springframework/context/testfixture/AbstractApplicationContextTests.java +++ b/spring-context/src/testFixtures/java/org/springframework/context/testfixture/AbstractApplicationContextTests.java @@ -57,8 +57,9 @@ public abstract class AbstractApplicationContextTests extends AbstractListableBe protected TestApplicationListener parentListener = new TestApplicationListener(); + @BeforeEach - public void setUp() throws Exception { + public void setup() throws Exception { this.applicationContext = createContext(); } @@ -79,6 +80,7 @@ protected ApplicationContext getApplicationContext() { */ protected abstract ConfigurableApplicationContext createContext() throws Exception; + @Test public void contextAwareSingletonWasCalledBack() throws Exception { ACATester aca = (ACATester) applicationContext.getBean("aca");