AbstractAutowireCapableBeanFactory calls postProcessBeforeInstantiation with fully resolved target type
Issue: SPR-12140 Issue: SPR-12142
This commit is contained in:
parent
53fbf1a509
commit
b64f680f19
|
@ -589,14 +589,8 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
|
|||
|
||||
@Override
|
||||
protected Class<?> predictBeanType(String beanName, RootBeanDefinition mbd, Class<?>... typesToMatch) {
|
||||
Class<?> targetType = mbd.getTargetType();
|
||||
if (targetType == null) {
|
||||
targetType = (mbd.getFactoryMethodName() != null ? getTypeForFactoryMethod(beanName, mbd, typesToMatch) :
|
||||
resolveBeanClass(mbd, beanName, typesToMatch));
|
||||
if (ObjectUtils.isEmpty(typesToMatch) || getTempClassLoader() == null) {
|
||||
mbd.setTargetType(targetType);
|
||||
}
|
||||
}
|
||||
Class<?> targetType = determineTargetType(beanName, mbd, typesToMatch);
|
||||
|
||||
// Apply SmartInstantiationAwareBeanPostProcessors to predict the
|
||||
// eventual type after a before-instantiation shortcut.
|
||||
if (targetType != null && !mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
|
||||
|
@ -615,7 +609,27 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
|
|||
}
|
||||
|
||||
/**
|
||||
* Determine the bean type for the given bean definition which is based on
|
||||
* Determine the target type for the given bean definition.
|
||||
* @param beanName the name of the bean (for error handling purposes)
|
||||
* @param mbd the merged bean definition for the bean
|
||||
* @param typesToMatch the types to match in case of internal type matching purposes
|
||||
* (also signals that the returned {@code Class} will never be exposed to application code)
|
||||
* @return the type for the bean if determinable, or {@code null} otherwise
|
||||
*/
|
||||
protected Class<?> determineTargetType(String beanName, RootBeanDefinition mbd, Class<?>... typesToMatch) {
|
||||
Class<?> targetType = mbd.getTargetType();
|
||||
if (targetType == null) {
|
||||
targetType = (mbd.getFactoryMethodName() != null ? getTypeForFactoryMethod(beanName, mbd, typesToMatch) :
|
||||
resolveBeanClass(mbd, beanName, typesToMatch));
|
||||
if (ObjectUtils.isEmpty(typesToMatch) || getTempClassLoader() == null) {
|
||||
mbd.setTargetType(targetType);
|
||||
}
|
||||
}
|
||||
return targetType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine the target type for the given bean definition which is based on
|
||||
* a factory method. Only called if there is no singleton instance registered
|
||||
* for the target bean already.
|
||||
* <p>This implementation determines the type matching {@link #createBean}'s
|
||||
|
@ -625,7 +639,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
|
|||
* @param mbd the merged bean definition for the bean
|
||||
* @param typesToMatch the types to match in case of internal type matching purposes
|
||||
* (also signals that the returned {@code Class} will never be exposed to application code)
|
||||
* @return the type for the bean if determinable, or {@code null} else
|
||||
* @return the type for the bean if determinable, or {@code null} otherwise
|
||||
* @see #createBean
|
||||
*/
|
||||
protected Class<?> getTypeForFactoryMethod(String beanName, RootBeanDefinition mbd, Class<?>... typesToMatch) {
|
||||
|
@ -927,12 +941,15 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
|
|||
Object bean = null;
|
||||
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
|
||||
// Make sure bean class is actually resolved at this point.
|
||||
if (mbd.hasBeanClass() && !mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
|
||||
bean = applyBeanPostProcessorsBeforeInstantiation(mbd.getBeanClass(), beanName);
|
||||
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
|
||||
Class<?> targetType = determineTargetType(beanName, mbd);
|
||||
if (targetType != null) {
|
||||
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
|
||||
if (bean != null) {
|
||||
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
|
||||
}
|
||||
}
|
||||
}
|
||||
mbd.beforeInstantiationResolved = (bean != null);
|
||||
}
|
||||
return bean;
|
||||
|
|
Loading…
Reference in New Issue