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) {
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
|
|
Loading…
Reference in New Issue