- package org.springframework.beans.factory.support;
- import java.io.IOException;
- import java.io.NotSerializableException;
- import java.io.ObjectInputStream;
- import java.io.ObjectStreamException;
- import java.io.Serializable;
- import java.lang.annotation.Annotation;
- import java.lang.ref.Reference;
- import java.lang.ref.WeakReference;
- import java.lang.reflect.Method;
- import java.security.AccessController;
- import java.security.PrivilegedAction;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Collection;
- import java.util.Collections;
- import java.util.Comparator;
- import java.util.IdentityHashMap;
- import java.util.Iterator;
- import java.util.LinkedHashMap;
- import java.util.LinkedHashSet;
- import java.util.List;
- import java.util.Map;
- import java.util.Optional;
- import java.util.Set;
- import java.util.concurrent.ConcurrentHashMap;
- import javax.inject.Provider;
- import org.springframework.beans.BeanUtils;
- import org.springframework.beans.BeansException;
- import org.springframework.beans.TypeConverter;
- import org.springframework.beans.factory.BeanCreationException;
- import org.springframework.beans.factory.BeanCurrentlyInCreationException;
- import org.springframework.beans.factory.BeanDefinitionStoreException;
- import org.springframework.beans.factory.BeanFactory;
- import org.springframework.beans.factory.BeanFactoryAware;
- import org.springframework.beans.factory.BeanFactoryUtils;
- import org.springframework.beans.factory.BeanNotOfRequiredTypeException;
- import org.springframework.beans.factory.CannotLoadBeanClassException;
- import org.springframework.beans.factory.FactoryBean;
- import org.springframework.beans.factory.InjectionPoint;
- import org.springframework.beans.factory.NoSuchBeanDefinitionException;
- import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
- import org.springframework.beans.factory.ObjectFactory;
- import org.springframework.beans.factory.ObjectProvider;
- import org.springframework.beans.factory.SmartFactoryBean;
- import org.springframework.beans.factory.SmartInitializingSingleton;
- import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
- import org.springframework.beans.factory.config.BeanDefinition;
- import org.springframework.beans.factory.config.BeanDefinitionHolder;
- import org.springframework.beans.factory.config.ConfigurableBeanFactory;
- import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
- import org.springframework.beans.factory.config.DependencyDescriptor;
- import org.springframework.beans.factory.config.NamedBeanHolder;
- import org.springframework.core.OrderComparator;
- import org.springframework.core.ResolvableType;
- import org.springframework.core.annotation.AnnotationUtils;
- import org.springframework.lang.Nullable;
- import org.springframework.util.Assert;
- import org.springframework.util.ClassUtils;
- import org.springframework.util.CompositeIterator;
- import org.springframework.util.ObjectUtils;
- import org.springframework.util.StringUtils;
- /**
- * 基于bean definition对象的完整bean工厂
- *
- * Default implementation of the
- * {@link org.springframework.beans.factory.ListableBeanFactory} and
- * {@link BeanDefinitionRegistry} interfaces: a full-fledged bean factory
- * based on bean definition objects.
- *
- * @author Rod Johnson
- * @author Juergen Hoeller
- * @author Sam Brannen
- * @author Costin Leau
- * @author Chris Beams
- * @author Phillip webb
- * @author Stephane Nicoll
- * @since 16 April 2001
- * @see StaticListableBeanFactory
- * @see PropertiesBeanDefinitionReader
- * @see org.springframework.beans.factory.xml.XmlBeanDefinitionReader
- */
- @SuppressWarnings(
- "serial"
- )
- public class
- DefaultListableBeanFactory
- extends AbstractAutowireCapableBeanFactory
- implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
- @Nullable
- private static
- Class javaxInjectProviderClass;
- static {
- try {
- javaxInjectProviderClass
- =
- ClassUtils.forName(
- "javax.inject.Provider", DefaultListableBeanFactory.
- class.getClassLoader());
- }
- catch (ClassNotFoundException ex) {
- // JSR-330 API not available - Provider interface simply not supported then.
- javaxInjectProviderClass =
- null;
- }
- }
- /** Map from serialized id to factory instance */
- private static final
- Map> serializableFactories =
- new
- ConcurrentHashMap<>(8
- );
- /** Optional id for this factory, for serialization purposes */
- @Nullable
- private String serializationId;
- /** Whether to allow re-registration of a different definition with the same name */
- private boolean
- allowBeanDefinitionOverriding =
- true;
- /** Whether to allow eager class loading even for lazy-init beans */
- private boolean
- allowEagerClassLoading =
- true;
- /** Optional OrderComparator for dependency Lists and arrays */
- @Nullable
- private
- Comparator
- dependencyComparator;
- /** Resolver to use for checking if a bean definition is an autowire candidate */
- private
- AutowireCandidateResolver autowireCandidateResolver =
- new SimpleAutowireCandidateResolver();
- /** Map from dependency type to corresponding autowired value */
- private final
- Map, Object> resolvableDependencies =
- new
- ConcurrentHashMap<>(16
- );
- /** Map of bean definition objects, keyed by bean name */
- //beanFactory持有此map,这样就可以在任何时候获取bean的BeanDefinition来创建一个bean实例
- private final
- Map beanDefinitionMap =
- new
- ConcurrentHashMap<>(256
- );
- /** Map of singleton and non-singleton bean names, keyed by dependency type */
- private final
- Map, String[]> allBeanNamesByType =
- new
- ConcurrentHashMap<>(64
- );
- /** Map of singleton-only bean names, keyed by dependency type */
- private final
- Map, String[]> singletonBeanNamesByType =
- new
- ConcurrentHashMap<>(64
- );
- /** List of bean definition names, in registration order */
- private volatile
- List beanDefinitionNames =
- new
- ArrayList<>(256
- );
- /** List of names of manually registered singletons, in registration order */
- private volatile
- Set manualSingletonNames =
- new
- LinkedHashSet<>(16
- );
- /** Cached array of bean definition names in case of frozen configuration */
- @Nullable
- private volatile String[] frozenBeanDefinitionNames;
- /** Whether bean definition metadata may be cached for all beans */
- private volatile boolean
- configurationFrozen =
- false;
- }
来源: http://www.cnblogs.com/fangfuhai/p/7128534.html