|
|
|
@ -167,7 +167,7 @@ final class BeanTypeRegistry implements SmartInitializingSingleton { |
|
|
|
&& !requiresEagerInit(beanDefinition.getFactoryBeanName())) { |
|
|
|
&& !requiresEagerInit(beanDefinition.getFactoryBeanName())) { |
|
|
|
if (this.beanFactory.isFactoryBean(factoryName)) { |
|
|
|
if (this.beanFactory.isFactoryBean(factoryName)) { |
|
|
|
Class<?> factoryBeanGeneric = getFactoryBeanGeneric(this.beanFactory, |
|
|
|
Class<?> factoryBeanGeneric = getFactoryBeanGeneric(this.beanFactory, |
|
|
|
beanDefinition, name); |
|
|
|
beanDefinition); |
|
|
|
this.beanTypes.put(name, factoryBeanGeneric); |
|
|
|
this.beanTypes.put(name, factoryBeanGeneric); |
|
|
|
this.beanTypes.put(factoryName, |
|
|
|
this.beanTypes.put(factoryName, |
|
|
|
this.beanFactory.getType(factoryName)); |
|
|
|
this.beanFactory.getType(factoryName)); |
|
|
|
@ -216,13 +216,12 @@ final class BeanTypeRegistry implements SmartInitializingSingleton { |
|
|
|
* generics in its method signature. |
|
|
|
* generics in its method signature. |
|
|
|
* @param beanFactory the source bean factory |
|
|
|
* @param beanFactory the source bean factory |
|
|
|
* @param definition the bean definition |
|
|
|
* @param definition the bean definition |
|
|
|
* @param name the name of the bean |
|
|
|
|
|
|
|
* @return the generic type of the {@link FactoryBean} or {@code null} |
|
|
|
* @return the generic type of the {@link FactoryBean} or {@code null} |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
private Class<?> getFactoryBeanGeneric(ConfigurableListableBeanFactory beanFactory, |
|
|
|
private Class<?> getFactoryBeanGeneric(ConfigurableListableBeanFactory beanFactory, |
|
|
|
BeanDefinition definition, String name) { |
|
|
|
BeanDefinition definition) { |
|
|
|
try { |
|
|
|
try { |
|
|
|
return doGetFactoryBeanGeneric(beanFactory, definition, name); |
|
|
|
return doGetFactoryBeanGeneric(beanFactory, definition); |
|
|
|
} |
|
|
|
} |
|
|
|
catch (Exception ex) { |
|
|
|
catch (Exception ex) { |
|
|
|
return null; |
|
|
|
return null; |
|
|
|
@ -230,21 +229,21 @@ final class BeanTypeRegistry implements SmartInitializingSingleton { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private Class<?> doGetFactoryBeanGeneric(ConfigurableListableBeanFactory beanFactory, |
|
|
|
private Class<?> doGetFactoryBeanGeneric(ConfigurableListableBeanFactory beanFactory, |
|
|
|
BeanDefinition definition, String name) |
|
|
|
BeanDefinition definition) |
|
|
|
throws Exception, ClassNotFoundException, LinkageError { |
|
|
|
throws Exception, ClassNotFoundException, LinkageError { |
|
|
|
if (StringUtils.hasLength(definition.getFactoryBeanName()) |
|
|
|
if (StringUtils.hasLength(definition.getFactoryBeanName()) |
|
|
|
&& StringUtils.hasLength(definition.getFactoryMethodName())) { |
|
|
|
&& StringUtils.hasLength(definition.getFactoryMethodName())) { |
|
|
|
return getConfigurationClassFactoryBeanGeneric(beanFactory, definition, name); |
|
|
|
return getConfigurationClassFactoryBeanGeneric(beanFactory, definition); |
|
|
|
} |
|
|
|
} |
|
|
|
if (StringUtils.hasLength(definition.getBeanClassName())) { |
|
|
|
if (StringUtils.hasLength(definition.getBeanClassName())) { |
|
|
|
return getDirectFactoryBeanGeneric(beanFactory, definition, name); |
|
|
|
return getDirectFactoryBeanGeneric(beanFactory, definition); |
|
|
|
} |
|
|
|
} |
|
|
|
return null; |
|
|
|
return null; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private Class<?> getConfigurationClassFactoryBeanGeneric( |
|
|
|
private Class<?> getConfigurationClassFactoryBeanGeneric( |
|
|
|
ConfigurableListableBeanFactory beanFactory, BeanDefinition definition, |
|
|
|
ConfigurableListableBeanFactory beanFactory, BeanDefinition definition) |
|
|
|
String name) throws Exception { |
|
|
|
throws Exception { |
|
|
|
Method method = getFactoryMethod(beanFactory, definition); |
|
|
|
Method method = getFactoryMethod(beanFactory, definition); |
|
|
|
Class<?> generic = ResolvableType.forMethodReturnType(method) |
|
|
|
Class<?> generic = ResolvableType.forMethodReturnType(method) |
|
|
|
.as(FactoryBean.class).resolveGeneric(); |
|
|
|
.as(FactoryBean.class).resolveGeneric(); |
|
|
|
@ -305,8 +304,8 @@ final class BeanTypeRegistry implements SmartInitializingSingleton { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private Class<?> getDirectFactoryBeanGeneric( |
|
|
|
private Class<?> getDirectFactoryBeanGeneric( |
|
|
|
ConfigurableListableBeanFactory beanFactory, BeanDefinition definition, |
|
|
|
ConfigurableListableBeanFactory beanFactory, BeanDefinition definition) |
|
|
|
String name) throws ClassNotFoundException, LinkageError { |
|
|
|
throws ClassNotFoundException, LinkageError { |
|
|
|
Class<?> factoryBeanClass = ClassUtils.forName(definition.getBeanClassName(), |
|
|
|
Class<?> factoryBeanClass = ClassUtils.forName(definition.getBeanClassName(), |
|
|
|
beanFactory.getBeanClassLoader()); |
|
|
|
beanFactory.getBeanClassLoader()); |
|
|
|
Class<?> generic = ResolvableType.forClass(factoryBeanClass).as(FactoryBean.class) |
|
|
|
Class<?> generic = ResolvableType.forClass(factoryBeanClass).as(FactoryBean.class) |
|
|
|
|