Polishing

This commit is contained in:
Juergen Hoeller 2023-05-10 17:18:31 +02:00
parent e228f4ba64
commit c8927ae753
2 changed files with 29 additions and 36 deletions

View File

@ -237,33 +237,28 @@ public final class BeanInstanceSupplier<T> extends AutowiredElementResolver impl
private AutowiredArguments resolveArguments(RegisteredBean registeredBean, Executable executable) { private AutowiredArguments resolveArguments(RegisteredBean registeredBean, Executable executable) {
Assert.isInstanceOf(AbstractAutowireCapableBeanFactory.class, registeredBean.getBeanFactory()); 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 && int startIndex = (executable instanceof Constructor<?> constructor &&
ClassUtils.isInnerClass(constructor.getDeclaringClass())) ? 1 : 0; ClassUtils.isInnerClass(constructor.getDeclaringClass())) ? 1 : 0;
int parameterCount = executable.getParameterCount(); int parameterCount = executable.getParameterCount();
Object[] resolved = new Object[parameterCount - startIndex]; Object[] resolved = new Object[parameterCount - startIndex];
Assert.isTrue(this.shortcuts == null || this.shortcuts.length == resolved.length, Assert.isTrue(this.shortcuts == null || this.shortcuts.length == resolved.length,
() -> "'shortcuts' must contain " + resolved.length + " elements"); () -> "'shortcuts' must contain " + resolved.length + " elements");
ConstructorArgumentValues argumentValues = resolveArgumentValues(registeredBean);
Set<String> autowiredBeans = new LinkedHashSet<>(resolved.length); Set<String> autowiredBeans = new LinkedHashSet<>(resolved.length);
ConstructorArgumentValues argumentValues = resolveArgumentValues(beanFactory,
beanName, mergedBeanDefinition);
for (int i = startIndex; i < parameterCount; i++) { for (int i = startIndex; i < parameterCount; i++) {
MethodParameter parameter = getMethodParameter(executable, i); MethodParameter parameter = getMethodParameter(executable, i);
DependencyDescriptor dependencyDescriptor = new DependencyDescriptor(parameter, true); DependencyDescriptor descriptor = new DependencyDescriptor(parameter, true);
String shortcut = (this.shortcuts != null) ? this.shortcuts[i - startIndex] : null; String shortcut = (this.shortcuts != null ? this.shortcuts[i - startIndex] : null);
if (shortcut != null) { if (shortcut != null) {
dependencyDescriptor = new ShortcutDependencyDescriptor( descriptor = new ShortcutDependencyDescriptor(descriptor, shortcut, registeredBean.getBeanClass());
dependencyDescriptor, shortcut, beanClass);
} }
ValueHolder argumentValue = argumentValues.getIndexedArgumentValue(i, null); ValueHolder argumentValue = argumentValues.getIndexedArgumentValue(i, null);
resolved[i - startIndex] = resolveArgument(registeredBean,autowiredBeans, resolved[i - startIndex] = resolveArgument(registeredBean, descriptor, argumentValue, autowiredBeans);
dependencyDescriptor, argumentValue);
} }
registerDependentBeans(beanFactory, beanName, autowiredBeans); registerDependentBeans(registeredBean.getBeanFactory(), registeredBean.getBeanName(), autowiredBeans);
return AutowiredArguments.of(resolved); return AutowiredArguments.of(resolved);
} }
@ -277,15 +272,14 @@ public final class BeanInstanceSupplier<T> extends AutowiredElementResolver impl
throw new IllegalStateException("Unsupported executable: " + executable.getClass().getName()); throw new IllegalStateException("Unsupported executable: " + executable.getClass().getName());
} }
private ConstructorArgumentValues resolveArgumentValues( private ConstructorArgumentValues resolveArgumentValues(RegisteredBean registeredBean) {
AbstractAutowireCapableBeanFactory beanFactory, String beanName,
RootBeanDefinition mergedBeanDefinition) {
ConstructorArgumentValues resolved = new ConstructorArgumentValues(); ConstructorArgumentValues resolved = new ConstructorArgumentValues();
if (mergedBeanDefinition.hasConstructorArgumentValues()) { RootBeanDefinition beanDefinition = registeredBean.getMergedBeanDefinition();
if (beanDefinition.hasConstructorArgumentValues() &&
registeredBean.getBeanFactory() instanceof AbstractAutowireCapableBeanFactory beanFactory) {
BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver( BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(
beanFactory, beanName, mergedBeanDefinition, beanFactory.getTypeConverter()); beanFactory, registeredBean.getBeanName(), beanDefinition, beanFactory.getTypeConverter());
ConstructorArgumentValues values = mergedBeanDefinition.getConstructorArgumentValues(); ConstructorArgumentValues values = beanDefinition.getConstructorArgumentValues();
values.getIndexedArgumentValues().forEach((index, valueHolder) -> { values.getIndexedArgumentValues().forEach((index, valueHolder) -> {
ValueHolder resolvedValue = resolveArgumentValue(valueResolver, valueHolder); ValueHolder resolvedValue = resolveArgumentValue(valueResolver, valueHolder);
resolved.addIndexedArgumentValue(index, resolvedValue); resolved.addIndexedArgumentValue(index, resolvedValue);
@ -298,30 +292,27 @@ public final class BeanInstanceSupplier<T> extends AutowiredElementResolver impl
if (valueHolder.isConverted()) { if (valueHolder.isConverted()) {
return valueHolder; return valueHolder;
} }
Object resolvedValue = resolver.resolveValueIfNecessary("constructor argument", Object value = resolver.resolveValueIfNecessary("constructor argument", valueHolder.getValue());
valueHolder.getValue()); ValueHolder resolvedHolder = new ValueHolder(value, valueHolder.getType(), valueHolder.getName());
ValueHolder resolvedValueHolder = new ValueHolder(resolvedValue, resolvedHolder.setSource(valueHolder);
valueHolder.getType(), valueHolder.getName()); return resolvedHolder;
resolvedValueHolder.setSource(valueHolder);
return resolvedValueHolder;
} }
@Nullable @Nullable
private Object resolveArgument(RegisteredBean registeredBean, Set<String> autowiredBeans, private Object resolveArgument(RegisteredBean registeredBean, DependencyDescriptor descriptor,
DependencyDescriptor dependencyDescriptor, @Nullable ValueHolder argumentValue) { @Nullable ValueHolder argumentValue, Set<String> autowiredBeans) {
TypeConverter typeConverter = registeredBean.getBeanFactory().getTypeConverter(); TypeConverter typeConverter = registeredBean.getBeanFactory().getTypeConverter();
Class<?> parameterType = dependencyDescriptor.getMethodParameter().getParameterType();
if (argumentValue != null) { if (argumentValue != null) {
return (!argumentValue.isConverted()) ? return (argumentValue.isConverted() ? argumentValue.getConvertedValue() :
typeConverter.convertIfNecessary(argumentValue.getValue(), parameterType) : typeConverter.convertIfNecessary(argumentValue.getValue(),
argumentValue.getConvertedValue(); descriptor.getDependencyType(), descriptor.getMethodParameter()));
} }
try { try {
return registeredBean.resolveAutowiredArgument(dependencyDescriptor, typeConverter, autowiredBeans); return registeredBean.resolveAutowiredArgument(descriptor, typeConverter, autowiredBeans);
} }
catch (BeansException ex) { catch (BeansException ex) {
throw new UnsatisfiedDependencyException(null, registeredBean.getBeanName(), dependencyDescriptor, ex); throw new UnsatisfiedDependencyException(null, registeredBean.getBeanName(), descriptor, ex);
} }
} }

View File

@ -57,8 +57,9 @@ public abstract class AbstractApplicationContextTests extends AbstractListableBe
protected TestApplicationListener parentListener = new TestApplicationListener(); protected TestApplicationListener parentListener = new TestApplicationListener();
@BeforeEach @BeforeEach
public void setUp() throws Exception { public void setup() throws Exception {
this.applicationContext = createContext(); this.applicationContext = createContext();
} }
@ -79,6 +80,7 @@ public abstract class AbstractApplicationContextTests extends AbstractListableBe
*/ */
protected abstract ConfigurableApplicationContext createContext() throws Exception; protected abstract ConfigurableApplicationContext createContext() throws Exception;
@Test @Test
public void contextAwareSingletonWasCalledBack() throws Exception { public void contextAwareSingletonWasCalledBack() throws Exception {
ACATester aca = (ACATester) applicationContext.getBean("aca"); ACATester aca = (ACATester) applicationContext.getBean("aca");