Polishing
This commit is contained in:
parent
e228f4ba64
commit
c8927ae753
|
@ -237,33 +237,28 @@ public final class BeanInstanceSupplier<T> extends AutowiredElementResolver impl
|
|||
|
||||
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<String> 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 @@ public final class BeanInstanceSupplier<T> extends AutowiredElementResolver impl
|
|||
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 @@ public final class BeanInstanceSupplier<T> extends AutowiredElementResolver impl
|
|||
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<String> autowiredBeans,
|
||||
DependencyDescriptor dependencyDescriptor, @Nullable ValueHolder argumentValue) {
|
||||
private Object resolveArgument(RegisteredBean registeredBean, DependencyDescriptor descriptor,
|
||||
@Nullable ValueHolder argumentValue, Set<String> 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 @@ public abstract class AbstractApplicationContextTests extends AbstractListableBe
|
|||
*/
|
||||
protected abstract ConfigurableApplicationContext createContext() throws Exception;
|
||||
|
||||
|
||||
@Test
|
||||
public void contextAwareSingletonWasCalledBack() throws Exception {
|
||||
ACATester aca = (ACATester) applicationContext.getBean("aca");
|
||||
|
|
Loading…
Reference in New Issue