|
|
|
@ -20,7 +20,6 @@ import java.lang.annotation.Annotation;
|
|
|
|
|
import java.lang.reflect.Method;
|
|
|
|
|
import java.util.Arrays;
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.Iterator;
|
|
|
|
|
import java.util.LinkedHashSet;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.Set;
|
|
|
|
@ -145,6 +144,17 @@ final class BeanTypeRegistry implements SmartInitializingSingleton {
|
|
|
|
|
this.beanDefinitions.clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void updateTypesIfNecessary() {
|
|
|
|
|
this.beanFactory.getBeanNamesIterator().forEachRemaining((name) -> {
|
|
|
|
|
if (!this.beanTypes.containsKey(name)) {
|
|
|
|
|
addBeanType(name);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
updateBeanType(name);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void addBeanType(String name) {
|
|
|
|
|
if (this.beanFactory.containsSingleton(name)) {
|
|
|
|
|
this.beanTypes.put(name, this.beanFactory.getType(name));
|
|
|
|
@ -161,13 +171,17 @@ final class BeanTypeRegistry implements SmartInitializingSingleton {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private RootBeanDefinition getBeanDefinition(String name) {
|
|
|
|
|
try {
|
|
|
|
|
return (RootBeanDefinition) this.beanFactory.getMergedBeanDefinition(name);
|
|
|
|
|
private void updateBeanType(String name) {
|
|
|
|
|
if (this.beanFactory.isAlias(name) || this.beanFactory.containsSingleton(name)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
catch (BeanDefinitionStoreException ex) {
|
|
|
|
|
logIgnoredError("unresolvable metadata in bean definition", name, ex);
|
|
|
|
|
return null;
|
|
|
|
|
RootBeanDefinition beanDefinition = getBeanDefinition(name);
|
|
|
|
|
if (beanDefinition == null) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
RootBeanDefinition previous = this.beanDefinitions.put(name, beanDefinition);
|
|
|
|
|
if (previous != null && !beanDefinition.equals(previous)) {
|
|
|
|
|
addBeanTypeForNonAliasDefinition(name, beanDefinition);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -196,6 +210,16 @@ final class BeanTypeRegistry implements SmartInitializingSingleton {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private RootBeanDefinition getBeanDefinition(String name) {
|
|
|
|
|
try {
|
|
|
|
|
return (RootBeanDefinition) this.beanFactory.getMergedBeanDefinition(name);
|
|
|
|
|
}
|
|
|
|
|
catch (BeanDefinitionStoreException ex) {
|
|
|
|
|
logIgnoredError("unresolvable metadata in bean definition", name, ex);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void logIgnoredError(String message, String name, Exception ex) {
|
|
|
|
|
if (logger.isDebugEnabled()) {
|
|
|
|
|
logger.debug("Ignoring " + message + " '" + name + "'", ex);
|
|
|
|
@ -207,30 +231,6 @@ final class BeanTypeRegistry implements SmartInitializingSingleton {
|
|
|
|
|
&& !this.beanFactory.containsSingleton(factoryBeanName));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void updateTypesIfNecessary() {
|
|
|
|
|
Iterator<String> names = this.beanFactory.getBeanNamesIterator();
|
|
|
|
|
while (names.hasNext()) {
|
|
|
|
|
String name = names.next();
|
|
|
|
|
if (!this.beanTypes.containsKey(name)) {
|
|
|
|
|
addBeanType(name);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (!this.beanFactory.isAlias(name)
|
|
|
|
|
&& !this.beanFactory.containsSingleton(name)) {
|
|
|
|
|
RootBeanDefinition beanDefinition = getBeanDefinition(name);
|
|
|
|
|
if (beanDefinition != null) {
|
|
|
|
|
RootBeanDefinition existingDefinition = this.beanDefinitions
|
|
|
|
|
.put(name, beanDefinition);
|
|
|
|
|
if (existingDefinition != null
|
|
|
|
|
&& !beanDefinition.equals(existingDefinition)) {
|
|
|
|
|
addBeanTypeForNonAliasDefinition(name, beanDefinition);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Attempt to guess the type that a {@link FactoryBean} will return based on the
|
|
|
|
|
* generics in its method signature.
|
|
|
|
|