Spring中Bean容器DefaultListableBeanFactory核心实现源码分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Pengjx2014/article/details/83045333

DefaultListableBeanFactory的继承结构

 DefaultListableBeanFactory是接口ConfigurableListableBeanFactory和BeanDefinitionRegistry的默认实现,可以理解为Spring容器中默认的对象工厂的实现,是一个比较全面的对象工厂。工厂中的Bean都是基于元数据定义的 bean 和通过post-processors扩展的bean。它的典型作用就是注册所有的bean通过读取bean的配置文件,这样就可以通过bean的命名方便快速访问bean,通过本地缓存表。DefaultListableBeanFactory的继承结构如下图:DefaultListableBeanFactory的继承结构
 下面逐个看看上层接口和跟类都提供了哪些方式和实现。

BeanFactory

BeanFactory定义的接口如下:

 /*Spring对象工厂的最顶层接口,最基础的对象容器视图*/
public interface BeanFactory {

	 /*区分FactoryBean实例和FactoryBean创建的实例*/
	String FACTORY_BEAN_PREFIX = "&";

	  /*获取一个对象实例,单例对象返回都是对象的引用*/
	Object getBean(String name) throws BeansException;

	 /*获取一个对象实例,requiredType是一个接口,或者实例类的父类*/
	<T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException;
	
    /*获取一个对象实例,args是创建实例具体参数*/
	Object getBean(String name, Object... args) throws BeansException;
	
   /*获取一个对象实例,requiredType是一个接口,或者实例类的父类*/
	<T> T getBean(Class<T> requiredType) throws BeansException;

	<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
	
	/*判断对象工厂中是否有指定名称name的对象*/
	boolean containsBean(String name);

	/*判断对象工厂中名称name的对象是否是单例的*/
	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
   
   /*判断对象工厂中名称name的对象是否是prototype类型的*/
	boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

   /*判断对象工厂中名称name的实例是否typeToMatch类型匹配*/
	boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

	boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

 	/*判断对象工厂中名称name实例的类型*/
	@Nullable
	Class<?> getType(String name) throws NoSuchBeanDefinitionException;
 
   /*判断对象工厂中名称name的别称*/
    String[] getAliases(String name);
}
AliasRegistry

 AliasRegistry是管理别称的通用接口,作为BeanDefinitionRegistry的顶层接口

public interface AliasRegistry {
	void registerAlias(String name, String alias);
	void removeAlias(String alias);
	boolean isAlias(String name);
	String[] getAliases(String name);
}
BeanDefinitionRegistry

 BeanDefinition的注册接口定义如下:

public interface BeanDefinitionRegistry extends AliasRegistry {
	
	void registerBeanDefinition(String beanName, BeanDefinition beanDefinition);
	void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
	BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
	boolean containsBeanDefinition(String beanName);
	String[] getBeanDefinitionNames();
	int getBeanDefinitionCount();
	boolean isBeanNameInUse(String beanName);
}
SimpleAliasRegistry

SimpleAliasRegistry是AliasRegistry的简单实现

public class SimpleAliasRegistry implements AliasRegistry {

	/* 规范名和别称的映射 */
	private final Map<String, String> aliasMap = new ConcurrentHashMap<>(16);

    /* 注册别称 */
	@Override
	public void registerAlias(String name, String alias) {
		Assert.hasText(name, "'name' must not be empty");
		Assert.hasText(alias, "'alias' must not be empty");
		synchronized (this.aliasMap) {
			if (alias.equals(name)) {
				this.aliasMap.remove(alias);
				if (logger.isDebugEnabled()) {
					logger.debug("Alias definition '" + alias + "' ignored since it points to same name");
				}
			}
			else {
				String registeredName = this.aliasMap.get(alias);
				if (registeredName != null) {
					if (registeredName.equals(name)) {
						// An existing alias - no need to re-register
						return;
					}
					if (!allowAliasOverriding()) {
						throw new IllegalStateException("Cannot define alias '" + alias + "' for name '" +
								name + "': It is already registered for name '" + registeredName + "'.");
					}
					if (logger.isInfoEnabled()) {
						logger.info("Overriding alias '" + alias + "' definition for registered name '" +
								registeredName + "' with new target name '" + name + "'");
					}
				}
				
				/*检测别称中是否有环*/
				checkForAliasCircle(name, alias);
				
				/*放入缓存*/
				this.aliasMap.put(alias, name);
				if (logger.isDebugEnabled()) {
					logger.debug("Alias definition '" + alias + "' registered for name '" + name + "'");
				}
			}
		}
	}
	
	protected boolean allowAliasOverriding() {
		return true;
	}

   /*递归判断是否有名称为name的别称alias*/
	public boolean hasAlias(String name, String alias) {
		for (Map.Entry<String, String> entry : this.aliasMap.entrySet()) {
			String registeredName = entry.getValue();
			if (registeredName.equals(name)) {
				String registeredAlias = entry.getKey();
				return (registeredAlias.equals(alias) || hasAlias(registeredAlias, alias));
			}
		}
		return false;
	}

	@Override
	public void removeAlias(String alias) {
		synchronized (this.aliasMap) {
			String name = this.aliasMap.remove(alias);
			if (name == null) {
				throw new IllegalStateException("No alias '" + alias + "' registered");
			}
		}
	}

	@Override
	public boolean isAlias(String name) {
		return this.aliasMap.containsKey(name);
	}

	@Override
	public String[] getAliases(String name) {
		List<String> result = new ArrayList<>();
		synchronized (this.aliasMap) {
			retrieveAliases(name, result);
		}
		return StringUtils.toStringArray(result);
	}

	private void retrieveAliases(String name, List<String> result) {
		this.aliasMap.forEach((alias, registeredName) -> {
			if (registeredName.equals(name)) {
				result.add(alias);
				retrieveAliases(alias, result);
			}
		});
	}
	
   /*解析别称*/
	public void resolveAliases(StringValueResolver valueResolver) {
		Assert.notNull(valueResolver, "StringValueResolver must not be null");
		synchronized (this.aliasMap) {
			Map<String, String> aliasCopy = new HashMap<>(this.aliasMap);
			aliasCopy.forEach((alias, registeredName) -> {
				String resolvedAlias = valueResolver.resolveStringValue(alias);
				String resolvedName = valueResolver.resolveStringValue(registeredName);
				if (resolvedAlias == null || resolvedName == null || resolvedAlias.equals(resolvedName)) {
					this.aliasMap.remove(alias);
				}
				else if (!resolvedAlias.equals(alias)) {
					String existingName = this.aliasMap.get(resolvedAlias);
					if (existingName != null) {
						if (existingName.equals(resolvedName)) {
							// Pointing to existing alias - just remove placeholder
							this.aliasMap.remove(alias);
							return;
						}
						throw new IllegalStateException(
								"Cannot register resolved alias '" + resolvedAlias + "' (original: '" + alias +
								"') for name '" + resolvedName + "': It is already registered for name '" +
								registeredName + "'.");
					}
					checkForAliasCircle(resolvedName, resolvedAlias);
					this.aliasMap.remove(alias);
					this.aliasMap.put(resolvedAlias, resolvedName);
				}
				else if (!registeredName.equals(resolvedName)) {
					this.aliasMap.put(alias, resolvedName);
				}
			});
		}
	}
	
   /*解析别称中是否有环*/
   protected void checkForAliasCircle(String name, String alias) {
		if (hasAlias(alias, name)) {
			throw new IllegalStateException("Cannot register alias '" + alias +
					"' for name '" + name + "': Circular reference - '" +
					name + "' is a direct or indirect alias for '" + alias + "' already");
		}
	}
	
	public String canonicalName(String name) {
		String canonicalName = name;
		// Handle aliasing...
		String resolvedName;
		do {
			resolvedName = this.aliasMap.get(canonicalName);
			if (resolvedName != null) {
				canonicalName = resolvedName;
			}
		}
		while (resolvedName != null);
		return canonicalName;
	}

}
SingletonBeanRegistry

单例bean的注册接口定义如下:

public interface SingletonBeanRegistry {

	void registerSingleton(String beanName, Object singletonObject);
	
	@Nullable
	Object getSingleton(String beanName);

	boolean containsSingleton(String beanName);

	String[] getSingletonNames();

	int getSingletonCount();

	Object getSingletonMutex();

}

DefaultSingletonBeanRegistry

Spring单例类注册的默认实现,这个类很重要。首先看下这个类的属性定义如下:

    /** 单例对象缓存*/
	private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

	/** 单例工程缓存 */
	private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);

	/** 提前暴露的对象缓存*/
	private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);

	/** 已经注册的单例对象集合,按照注册顺序排序 */
	private final Set<String> registeredSingletons = new LinkedHashSet<>(256);

	/** 并发下创建的单例对象 */
	private final Set<String> singletonsCurrentlyInCreation =
			Collections.newSetFromMap(new ConcurrentHashMap<>(16));

	/** 创建检测中排除掉的bean集合 */
	private final Set<String> inCreationCheckExclusions =
			Collections.newSetFromMap(new ConcurrentHashMap<>(16));

	/** 被抑制异常的列表,可用于关联相关原因 */
	@Nullable
	private Set<Exception> suppressedExceptions;

	/*是否并发销毁bean的标志*/
	private boolean singletonsCurrentlyInDestruction = false;

	/** 可废弃的bean集合 */
	private final Map<String, Object> disposableBeans = new LinkedHashMap<>();

	/*名称为name的bean持有的beans列表*/
	private final Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap<>(16);

	/*名称为name的bean与依赖的beans的映射关系*/
	private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<>(64);

	/*名称为name的bean与被依赖的beans的映射关系*/
	private final Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap<>(64);

单例类的获取过程与循环依赖的实现原理

 获取单例对象的执行流程如下:
 首先从单例对象缓存中获取对象,如果获取不到或者单例对象正在被并发创建,那么尝试从提前暴露的单例对象缓存中获取对象,如果还是获取不到,再从单例对象工厂中获取对象,并放入提前暴露的对象缓存中。源码如下:

@Nullable
	protected Object getSingleton(String beanName, boolean allowEarlyReference) {
	//从单例对象缓存中获取对象
		Object singletonObject = this.singletonObjects.get(beanName);
		if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
			synchronized (this.singletonObjects) {
		    	//从提前暴露的单例对象缓存中获取对象
				singletonObject = this.earlySingletonObjects.get(beanName);
				if (singletonObject == null && allowEarlyReference) {
					ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
					if (singletonFactory != null) {
					//从单例对象工厂中获取对象,并放入提前暴露的对象缓存中
						singletonObject = singletonFactory.getObject();
						this.earlySingletonObjects.put(beanName, singletonObject);
						this.singletonFactories.remove(beanName);
					}
				}
			}
		}
		return singletonObject;
	}

 另外,还提供了从单例对象工厂ObjectFactory中获取实例的方法如下:

public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
		Assert.notNull(beanName, "Bean name must not be null");
		synchronized (this.singletonObjects) {
		// 首先重试直接从对象工厂中直接获取实例,如果获取不到,以同步的方式直接从singletonFactory获取实例
			Object singletonObject = this.singletonObjects.get(beanName);
			if (singletonObject == null) {
				if (this.singletonsCurrentlyInDestruction) {
					throw new BeanCreationNotAllowedException(beanName,
							"Singleton bean creation not allowed while singletons of this factory are in destruction " +
							"(Do not request a bean from a BeanFactory in a destroy method implementation!)");
				}
				if (logger.isDebugEnabled()) {
					logger.debug("Creating shared instance of singleton bean '" + beanName + "'");
				}
				//实例创建前的检测
				beforeSingletonCreation(beanName);
				boolean newSingleton = false;
				boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
				if (recordSuppressedExceptions) {
					this.suppressedExceptions = new LinkedHashSet<>();
				}
				try {
				  // 获取实例
					singletonObject = singletonFactory.getObject();
					newSingleton = true;
				}
				catch (IllegalStateException ex) {
					// Has the singleton object implicitly appeared in the meantime ->
					// if yes, proceed with it since the exception indicates that state.
					singletonObject = this.singletonObjects.get(beanName);
					if (singletonObject == null) {
						throw ex;
					}
				}
				catch (BeanCreationException ex) {
					if (recordSuppressedExceptions) {
						for (Exception suppressedException : this.suppressedExceptions) {
							ex.addRelatedCause(suppressedException);
						}
					}
					throw ex;
				}
				finally {
					if (recordSuppressedExceptions) {
						this.suppressedExceptions = null;
					}
					//获取实例后的检测
					afterSingletonCreation(beanName);
				}
				if (newSingleton) {
					addSingleton(beanName, singletonObject);
				}
			}
			return singletonObject;
		}
	}
//创建对象前的缓存判断:对象是否在创建中和对象没有被并发创建
protected void beforeSingletonCreation(String beanName) {
		if (!this.inCreationCheckExclusions.contains(beanName) && !this.singletonsCurrentlyInCreation.add(beanName)) {
			throw new BeanCurrentlyInCreationException(beanName);
		}
	}
//对象创建结束后做缓存清理
protected void afterSingletonCreation(String beanName) {
		if (!this.inCreationCheckExclusions.contains(beanName) && !this.singletonsCurrentlyInCreation.remove(beanName)) {
			throw new IllegalStateException("Singleton '" + beanName + "' isn't currently in creation");
		}
	}
FactoryBeanRegistrySupport

 FactoryBeanRegistrySupport的主要作用是:对于实现了FactoryBean接口的单例类,提供了获取单例类实例和获取FactoryBean实例的方法。核心实现如下:

public abstract class FactoryBeanRegistrySupport extends DefaultSingletonBeanRegistry {

	/**  实现了FactoryBean的bean的缓存 */
	private final Map<String, Object> factoryBeanObjectCache = new ConcurrentHashMap<>(16);

    /**  从缓存中获取FactoryBean实例 */
	@Nullable
	protected Object getCachedObjectForFactoryBean(String beanName) {
		return this.factoryBeanObjectCache.get(beanName);
	}

   /*从FactoryBean实例中获取对象实例*/
	protected Object getObjectFromFactoryBean(FactoryBean<?> factory, String beanName, boolean shouldPostProcess) {
	  
	   /* FactoryBean是单例的 */
		if (factory.isSingleton() && containsSingleton(beanName)) {
			synchronized (getSingletonMutex()) {
			   /**  从缓存中获取FactoryBean实例 */
				Object object = this.factoryBeanObjectCache.get(beanName);
				if (object == null) {
				   /**  通过FactoryBean实例获取单例对象 */
					object = doGetObjectFromFactoryBean(factory, beanName);
					Object alreadyThere = this.factoryBeanObjectCache.get(beanName);
					if (alreadyThere != null) {
						object = alreadyThere;
					}
					else {
						if (shouldPostProcess) {
							if (isSingletonCurrentlyInCreation(beanName)) {
								return object;
							}
							beforeSingletonCreation(beanName);
							try {
								object = postProcessObjectFromFactoryBean(object, beanName);
							}
							catch (Throwable ex) {
								throw new BeanCreationException(beanName,
										"Post-processing of FactoryBean's singleton object failed", ex);
							}
							finally {
								afterSingletonCreation(beanName);
							}
						}
						if (containsSingleton(beanName)) {
							this.factoryBeanObjectCache.put(beanName, object);
						}
					}
				}
				return object;
			}
		}
		else {
			Object object = doGetObjectFromFactoryBean(factory, beanName);
			if (shouldPostProcess) {
				try {
					object = postProcessObjectFromFactoryBean(object, beanName);
				}
				catch (Throwable ex) {
					throw new BeanCreationException(beanName, "Post-processing of FactoryBean's object failed", ex);
				}
			}
			return object;
		}
	}

	private Object doGetObjectFromFactoryBean(final FactoryBean<?> factory, final String beanName)
			throws BeanCreationException {
		Object object;
		try {
			if (System.getSecurityManager() != null) {
				AccessControlContext acc = getAccessControlContext();
				try {
					object = AccessController.doPrivileged((PrivilegedExceptionAction<Object>) factory::getObject, acc);
				}
				catch (PrivilegedActionException pae) {
					throw pae.getException();
				}
			}
			else {
			//实现了FactoryBean接口,getObject()返回实例对象
				object = factory.getObject();
			}
		}
		catch (FactoryBeanNotInitializedException ex) {
			throw new BeanCurrentlyInCreationException(beanName, ex.toString());
		}
		catch (Throwable ex) {
			throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex);
		}
		if (object == null) {
			if (isSingletonCurrentlyInCreation(beanName)) {
				throw new BeanCurrentlyInCreationException(
						beanName, "FactoryBean which is currently in creation returned null from getObject");
			}
			object = new NullBean();
		}
		return object;
	}
}
ListableBeanFactory

 ListableBeanFactory提供根据各种条件获取bean的配置清单:

public interface ListableBeanFactory extends BeanFactory {

    /*判断是否有Bean的定义*/
	boolean containsBeanDefinition(String beanName);
   
   /*返回Bean的定义的计数*/
	int getBeanDefinitionCount();

   /*返回Bean的定义的名称集合*/
	String[] getBeanDefinitionNames();
	
    /*返回可解析类型的Bean的定义的名称集合*/
	String[] getBeanNamesForType(ResolvableType type);

	String[] getBeanNamesForType(@Nullable Class<?> type);

	String[] getBeanNamesForType(@Nullable Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);
	
   /*返回指定type的bean映射*/
	<T> Map<String, T> getBeansOfType(@Nullable Class<T> type) throws BeansException;

	<T> Map<String, T> getBeansOfType(@Nullable Class<T> type, boolean includeNonSingletons, boolean allowEagerInit)
			throws BeansException;
			
    /*返回指定注解类型annotationType的bean名称*/
	String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);

   /*返回指定注解类型annotationType的bean实例*/
	Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException;

   /*返回指定bean名称和注解类型annotationType的注解/
	@Nullable
	<A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType)
			throws NoSuchBeanDefinitionException;

}

HierarchicalBeanFactory

 HierarchicalBeanFactory主要提供获取父级BeanFactory:

public interface HierarchicalBeanFactory extends BeanFactory {

    /*返回BeanFactory的父级BeanFactory*/
	@Nullable
	BeanFactory getParentBeanFactory();

	boolean containsLocalBean(String name);

}

ConfigurableBeanFactory

 ConfigurableBeanFactory提供配置BeanFactory的各种方法:

public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {

   String SCOPE_SINGLETON = "singleton";

   String SCOPE_PROTOTYPE = "prototype";
   
   /*配置父级BeanFactory*/
   void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;
   
   /*配置的类加载器,默认为线程上下文类加载*/
   void setBeanClassLoader(@Nullable ClassLoader beanClassLoader);
   
   /*获取类加载器*/
   @Nullable
   ClassLoader getBeanClassLoader();
   
   /*类型匹配的时候设置临时加载器,默认为空,简单的使用标准类加载器*/
   void setTempClassLoader(@Nullable ClassLoader tempClassLoader);
   
   /*获取临时类加载器*/
   @Nullable
   ClassLoader getTempClassLoader();

   /*设置是否缓存BeanMeta*/
   void setCacheBeanMetadata(boolean cacheBeanMetadata);

   boolean isCacheBeanMetadata();
   
   /*设置BeanExpressionResolver*/
   void setBeanExpressionResolver(@Nullable BeanExpressionResolver resolver);

   /*获取BeanExpressionResolver*/
   @Nullable
   BeanExpressionResolver getBeanExpressionResolver();
   
   /*设置ConversionService,属性转换*/
   void setConversionService(@Nullable ConversionService conversionService);

   @Nullable
   ConversionService getConversionService();
   
   /*添加PropertyEditorRegistrar*/
   void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);

   void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass);

   void copyRegisteredEditorsTo(PropertyEditorRegistry registry);

   void setTypeConverter(TypeConverter typeConverter);

   TypeConverter getTypeConverter();

   void addEmbeddedValueResolver(StringValueResolver valueResolver);

   boolean hasEmbeddedValueResolver();

   @Nullable
   String resolveEmbeddedValue(String value);
   
   /*添加BeanPostProcessor*/
   void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);

   int getBeanPostProcessorCount();

   void registerScope(String scopeName, Scope scope);

   String[] getRegisteredScopeNames();

   @Nullable
   Scope getRegisteredScope(String scopeName);

   AccessControlContext getAccessControlContext();

   void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);

   void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;

   void resolveAliases(StringValueResolver valueResolver);

   BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

   /*判断是否是FactoryBean实例*/
   boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;

   void setCurrentlyInCreation(String beanName, boolean inCreation);

   boolean isCurrentlyInCreation(String beanName);

   /*注册依赖的Bean实例*/
   void registerDependentBean(String beanName, String dependentBeanName);

   String[] getDependentBeans(String beanName);

   String[] getDependenciesForBean(String beanName);

   void destroyBean(String beanName, Object beanInstance);
   
   void destroyScopedBean(String beanName);

   void destroySingletons();

}
AutowireCapableBeanFactory

 AutowireCapableBeanFactory提供创建bean,自动注入,初始化以及应用bean的后处理器。

public interface AutowireCapableBeanFactory extends BeanFactory {
	
	/*对象注入方式0,1,2,3,4*/
	int AUTOWIRE_NO = 0;

	int AUTOWIRE_BY_NAME = 1;
	
	int AUTOWIRE_BY_TYPE = 2;

	int AUTOWIRE_CONSTRUCTOR = 3;

	@Deprecated
	int AUTOWIRE_AUTODETECT = 4;
	
	/*创建实例*/
	<T> T createBean(Class<T> beanClass) throws BeansException;
	
	/*自动注入Bean*/
	void autowireBean(Object existingBean) throws BeansException;
	
	/*配置bean */
	Object configureBean(Object existingBean, String beanName) throws BeansException;

	Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;

	Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
	
	/*自动注入bean属性*/
	void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)
			throws BeansException;
	
	/*通过autowireBeanProperties方法应用PropertyValues*/
	void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;

	Object initializeBean(Object existingBean, String beanName) throws BeansException;

	Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
			throws BeansException;
	
	/*初始化bean后应用BeanPostProcessors*/
	Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
			throws BeansException;

	void destroyBean(Object existingBean);

	/*解析需要类型requiredType的bean*/
	<T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException;

	@Nullable
	Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException;

	/*解析依赖的bean*/
	@Nullable
	Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,
			@Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException;

}
ConfigurableListableBeanFactory

 BeanFactory配置清单,指定忽略类型和接口等。

public interface ConfigurableListableBeanFactory
		extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {
	/*忽略依赖类型*/
	void ignoreDependencyType(Class<?> type);
	
	/*忽略依赖接口*/
	void ignoreDependencyInterface(Class<?> ifc);
	
	/*注册可解析的依赖*/
	void registerResolvableDependency(Class<?> dependencyType, @Nullable Object autowiredValue);

	boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor)
			throws NoSuchBeanDefinitionException;

	/*获取BeanDefinition根据beanName*/
	BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

	/*获取beanName的迭代器*/
	Iterator<String> getBeanNamesIterator();

	/*清除Metadata缓存*/
	void clearMetadataCache();
	
	/*冰冻不被修改bean definitions*/
	void freezeConfiguration();

	/*bean definitions是否被冰冻住*/
	boolean isConfigurationFrozen();

	/*初始化所有非懒加载的bean*/
	void preInstantiateSingletons() throws BeansException;
}

AbstractBeanFactory的核心实现

AbstractBeanFactory内部属性定义
	/*父级BeanFactory*/
	@Nullable
	private BeanFactory parentBeanFactory;

	/*Bean的类加载器*/
	@Nullable
	private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader();

	/*Bean的临时类加载器*/
	@Nullable
	private ClassLoader tempClassLoader;

	/*是否缓存meta data数据标志 */
	private boolean cacheBeanMetadata = true;

	/*bean definition中的表达式的解析策略*/
	@Nullable
	private BeanExpressionResolver beanExpressionResolver;

	/*属性转换,使用PropertyEditors替换*/
	@Nullable
	private ConversionService conversionService;

	/*应用到对象工厂中的属性转换器注册*/
	private final Set<PropertyEditorRegistrar> propertyEditorRegistrars = new LinkedHashSet<>(4);

	/*应用到对象工厂中的属性转换器*/
	private final Map<Class<?>, Class<? extends PropertyEditor>> customEditors = new HashMap<>(4);

	/*类型转换器,重写默认PropertyEditor机制*/
	@Nullable
	private TypeConverter typeConverter;

	/*字符串解析,应用于注解属性值*/
	private final List<StringValueResolver> embeddedValueResolvers = new LinkedList<>();

	/*应用于创建bean的BeanPostProcessors*/
	private final List<BeanPostProcessor> beanPostProcessors = new ArrayList<>();

	/*标志InstantiationAwareBeanPostProcessors是否已被注册*/
	private boolean hasInstantiationAwareBeanPostProcessors;
	
	/*标志DestructionAwareBeanPostProcessors是否已被注册*/
	private boolean hasDestructionAwareBeanPostProcessors;

	/*Scope映射*/
	private final Map<String, Scope> scopes = new LinkedHashMap<>(8);

	@Nullable
	private SecurityContextProvider securityContextProvider;

	/*合并的RootBeanDefinition与名称映射*/
	private final Map<String, RootBeanDefinition> mergedBeanDefinitions = new ConcurrentHashMap<>(256);

	/*最后一次创建的bean集合*/
	private final Set<String> alreadyCreated = Collections.newSetFromMap(new ConcurrentHashMap<>(256));

	/*正在创建的bean的名称*/
	private final ThreadLocal<Object> prototypesCurrentlyInCreation =
			new NamedThreadLocal<>("Prototype beans currently in creation");
AbstractBeanFactory的核心实现方法

 AbstractBeanFactory从BeanFactory获取实例的核心实现如下:

doGetBean
public <T> T getBean(String name, @Nullable Class<T> requiredType, @Nullable Object... args)
			throws BeansException {

		return doGetBean(name, requiredType, args, false);
	}

@SuppressWarnings("unchecked")
	protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
			@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
		
		/*获取原始beanName,首先去除&符号开头,然后从别称缓存map中get到原始beanName*/
		final String beanName = transformedBeanName(name);
		Object bean;
		
		/*首先尝试从单例对象工厂中获取实例*/
		Object sharedInstance = getSingleton(beanName);
		if (sharedInstance != null && args == null) {
			......
			/* 获取实例*/
			bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
		}

		else {
			if (isPrototypeCurrentlyInCreation(beanName)) {
				throw new BeanCurrentlyInCreationException(beanName);
			}

			/*获取父级BeanFactory*/ 
			BeanFactory parentBeanFactory = getParentBeanFactory();
			if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
				String nameToLookup = originalBeanName(name);
				if (parentBeanFactory instanceof AbstractBeanFactory) {
					
					/*递归从父级BeanFactory获取实例*/ 
					return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
							nameToLookup, requiredType, args, typeCheckOnly);
				}
				else if (args != null) {
					return (T) parentBeanFactory.getBean(nameToLookup, args);
				}
				else {
					return parentBeanFactory.getBean(nameToLookup, requiredType);
				}
			}

			if (!typeCheckOnly) {
				markBeanAsCreated(beanName);
			}

			try {
				final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
				checkMergedBeanDefinition(mbd, beanName, args);

				/*检测创建的Bean没有没有被并发依赖*/
				String[] dependsOn = mbd.getDependsOn();
				if (dependsOn != null) {
					for (String dep : dependsOn) {
						if (isDependent(beanName, dep)) {
							throw new BeanCreationException(mbd.getResourceDescription(), beanName,
									"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
						}
						/*注册依赖的Bean*/
						registerDependentBean(dep, beanName);
						try {
							getBean(dep);
						}
						catch (NoSuchBeanDefinitionException ex) {
							throw new BeanCreationException(mbd.getResourceDescription(), beanName,
									"'" + beanName + "' depends on missing bean '" + dep + "'", ex);
						}
					}
				}

				/*根据RootBeanDefinition创建Bean*/
				if (mbd.isSingleton()) {
					sharedInstance = getSingleton(beanName, () -> {
						try {
							return createBean(beanName, mbd, args);
						}
						catch (BeansException ex) {
							destroySingleton(beanName);
							throw ex;
						}
					});
					bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
				}

				else if (mbd.isPrototype()) {
					Object prototypeInstance = null;
					try {
						beforePrototypeCreation(beanName);
						/*创建Prototype类型的Bean*/
						prototypeInstance = createBean(beanName, mbd, args);
					}
					finally {
						afterPrototypeCreation(beanName);
					}
					bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
				}

				else {
					String scopeName = mbd.getScope();
					final Scope scope = this.scopes.get(scopeName);
					if (scope == null) {
						throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
					}
					try {
						Object scopedInstance = scope.get(beanName, () -> {
							beforePrototypeCreation(beanName);
							try {
								return createBean(beanName, mbd, args);
							}
							finally {
								afterPrototypeCreation(beanName);
							}
						});
						bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
					}
					catch (IllegalStateException ex) {
						throw new BeanCreationException(beanName,
								"Scope '" + scopeName + "' is not active for the current thread; consider " +
								"defining a scoped proxy for this bean if you intend to refer to it from a singleton",
								ex);
					}
				}
			}
			catch (BeansException ex) {
				cleanupAfterBeanCreationFailure(beanName);
				throw ex;
			}
		}

		/*检测需要的类型是否与创建的实例类型匹配*/
		if (requiredType != null && !requiredType.isInstance(bean)) {
			try {
				T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);
				if (convertedBean == null) {
					throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
				}
				return convertedBean;
			}
			catch (TypeMismatchException ex) {
		    ......
				throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
			}
		}
		return (T) bean;
	}
	
/* 获取实例*/
protected Object getObjectForBeanInstance(
			Object beanInstance, String name, String beanName, @Nullable RootBeanDefinition mbd) {

		if (BeanFactoryUtils.isFactoryDereference(name)) {
			if (beanInstance instanceof NullBean) {
				return beanInstance;
			}
			if (!(beanInstance instanceof FactoryBean)) {
				throw new BeanIsNotAFactoryException(transformedBeanName(name), beanInstance.getClass());
			}
		}

		if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
			return beanInstance;
		}
		/* 首先尝试从FactoryBean缓存中获取实例,如果获取不到,从FactoryBean获取实例*/
		Object object = null;
		if (mbd == null) {
			object = getCachedObjectForFactoryBean(beanName);
		}
		if (object == null) {
			FactoryBean<?> factory = (FactoryBean<?>) beanInstance;
			if (mbd == null && containsBeanDefinition(beanName)) {
				mbd = getMergedLocalBeanDefinition(beanName);
			}
			boolean synthetic = (mbd != null && mbd.isSynthetic());
			object = getObjectFromFactoryBean(factory, beanName, !synthetic);
		}
		return object;
	}

/*如果是子的BeanDefinition,需要合并父BeanDefinition的信息*/
protected RootBeanDefinition getMergedBeanDefinition(
			String beanName, BeanDefinition bd, @Nullable BeanDefinition containingBd)
			throws BeanDefinitionStoreException {

		synchronized (this.mergedBeanDefinitions) {
			RootBeanDefinition mbd = null;

			if (containingBd == null) {
				mbd = this.mergedBeanDefinitions.get(beanName);
			}

			if (mbd == null) {
				if (bd.getParentName() == null) {
					if (bd instanceof RootBeanDefinition) {
						mbd = ((RootBeanDefinition) bd).cloneBeanDefinition();
					}
					else {
						mbd = new RootBeanDefinition(bd);
					}
				}
				else {
					BeanDefinition pbd;
					try {
						String parentBeanName = transformedBeanName(bd.getParentName());
						if (!beanName.equals(parentBeanName)) {
							pbd = getMergedBeanDefinition(parentBeanName);
						}
						else {
							BeanFactory parent = getParentBeanFactory();
							if (parent instanceof ConfigurableBeanFactory) {
								pbd = ((ConfigurableBeanFactory) parent).getMergedBeanDefinition(parentBeanName);
							}
							else {
								throw new NoSuchBeanDefinitionException(parentBeanName,
										"Parent name '" + parentBeanName + "' is equal to bean name '" + beanName +
										"': cannot be resolved without an AbstractBeanFactory parent");
							}
						}
					}
					catch (NoSuchBeanDefinitionException ex) {
						throw new BeanDefinitionStoreException(bd.getResourceDescription(), beanName,
								"Could not resolve parent bean definition '" + bd.getParentName() + "'", ex);
					}
					mbd = new RootBeanDefinition(pbd);
					mbd.overrideFrom(bd);
				}

				if (!StringUtils.hasLength(mbd.getScope())) {
					mbd.setScope(RootBeanDefinition.SCOPE_SINGLETON);
				}

				if (containingBd != null && !containingBd.isSingleton() && mbd.isSingleton()) {
					mbd.setScope(containingBd.getScope());
				}

				if (containingBd == null && isCacheBeanMetadata()) {
					this.mergedBeanDefinitions.put(beanName, mbd);
				}
			}
			return mbd;
		}
	}

####### isTypeMatch
 最复杂方法源码分析isTypeMatch:

 /*判断对象工厂中名称name的实例是否类型匹配*/
public boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException {
		String beanName = transformedBeanName(name);

		/*检测手动注册的单例类*/
		Object beanInstance = getSingleton(beanName, false);
		if (beanInstance != null && beanInstance.getClass() != NullBean.class) {
			if (beanInstance instanceof FactoryBean) {
				if (!BeanFactoryUtils.isFactoryDereference(name)) {
					
					/*返回创建FactoryBean创建的实例的类型*/
					Class<?> type = getTypeForFactoryBean((FactoryBean<?>) beanInstance);
					return (type != null && typeToMatch.isAssignableFrom(type));
				}
				else {
					return typeToMatch.isInstance(beanInstance);
				}
			}
			else if (!BeanFactoryUtils.isFactoryDereference(name)) {
				if (typeToMatch.isInstance(beanInstance)) {
					return true;
				}
				else if (typeToMatch.hasGenerics() && containsBeanDefinition(beanName)) {
					
					/*RootBeanDefinition获取*/
					RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
					Class<?> targetType = mbd.getTargetType();
					if (targetType != null && targetType != ClassUtils.getUserClass(beanInstance) &&
							typeToMatch.isAssignableFrom(targetType)) {
						
						/*检测原始类也匹配,确定暴露给代理*/
						Class<?> classToMatch = typeToMatch.resolve();
						return (classToMatch == null || classToMatch.isInstance(beanInstance));
					}
				}
			}
			return false;
		}
		else if (containsSingleton(beanName) && !containsBeanDefinition(beanName)) {
			/*没有实例注册*/
			return false;
		}

		
		/*没有找到单例实例*/
		BeanFactory parentBeanFactory = getParentBeanFactory();
		if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
			
			/*没有找到单例实例,委托父类工程*/
			return parentBeanFactory.isTypeMatch(originalBeanName(name), typeToMatch);
		}

		/*取出RootBeanDefinition*/
		RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);

		Class<?> classToMatch = typeToMatch.resolve();
		if (classToMatch == null) {
			classToMatch = FactoryBean.class;
		}
		Class<?>[] typesToMatch = (FactoryBean.class == classToMatch ?
				new Class<?>[] {classToMatch} : new Class<?>[] {FactoryBean.class, classToMatch});
		
		/*检测bean definition的装饰类*/
		BeanDefinitionHolder dbd = mbd.getDecoratedDefinition();
		if (dbd != null && !BeanFactoryUtils.isFactoryDereference(name)) {
			RootBeanDefinition tbd = getMergedBeanDefinition(dbd.getBeanName(), dbd.getBeanDefinition(), mbd);
			Class<?> targetClass = predictBeanType(dbd.getBeanName(), tbd, typesToMatch);
			if (targetClass != null && !FactoryBean.class.isAssignableFrom(targetClass)) {
				return typeToMatch.isAssignableFrom(targetClass);
			}
		}

		Class<?> beanType = predictBeanType(beanName, mbd, typesToMatch);
		if (beanType == null) {
			return false;
		}

		/*检测bean是否在处理FactoryBean*/
		if (FactoryBean.class.isAssignableFrom(beanType)) {
			if (!BeanFactoryUtils.isFactoryDereference(name) && beanInstance == null) {
				beanType = getTypeForFactoryBean(beanName, mbd);
				if (beanType == null) {
					return false;
				}
			}
		}
		else if (BeanFactoryUtils.isFactoryDereference(name)) {
			beanType = predictBeanType(beanName, mbd, FactoryBean.class);
			if (beanType == null || !FactoryBean.class.isAssignableFrom(beanType)) {
				return false;
			}
		}

		ResolvableType resolvableType = mbd.targetType;
		if (resolvableType == null) {
			resolvableType = mbd.factoryMethodReturnType;
		}
		if (resolvableType != null && resolvableType.resolve() == beanType) {
			return typeToMatch.isAssignableFrom(resolvableType);
		}
		return typeToMatch.isAssignableFrom(beanType);
	}

AbstractAutowireCapableBeanFactory核心实现

 AbstractAutowireCapableBeanFactory实现了默认的bean创建方法,拥有所有被RootBeanDefinition具体化的能力。属性如下:

AbstractAutowireCapableBeanFactory内部属性
	/*创建实例的初始化策略,默认使用CGLIB创建实例*/
	private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();

	/*方法参数的解析策略*/
	@Nullable
	private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();

	/*是否允许循环引用,默认 true*/
	private boolean allowCircularReferences = true;

	private boolean allowRawInjectionDespiteWrapping = false;

	 /*忽略的依赖检测和注入的数据类型*/
	private final Set<Class<?>> ignoredDependencyTypes = new HashSet<>();

	 /*忽略的依赖检测和注入的接口类型*/
	private final Set<Class<?>> ignoredDependencyInterfaces = new HashSet<>();

	 /*并发创建实例的名称*/
	private final NamedThreadLocal<String> currentlyCreatedBean = new NamedThreadLocal<>("Currently created bean");

	/*FactoryBean的包装类缓存 */
	private final ConcurrentMap<String, BeanWrapper> factoryBeanInstanceCache = new ConcurrentHashMap<>(16);

	/*PropertyDescriptor缓存*/
	private final ConcurrentMap<Class<?>, PropertyDescriptor[]> filteredPropertyDescriptorsCache =
			new ConcurrentHashMap<>(256);

AbstractAutowireCapableBeanFactory核心方法

创建实例,广播实例,调用post-processors核心方法如下:

createBean
	@Override
	protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
			throws BeanCreationException {
		
		/*获取RootBeanDefinition*/
		RootBeanDefinition mbdToUse = mbd;

        /*解析bean的Class类*/
		Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
		if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
			mbdToUse = new RootBeanDefinition(mbd);
			mbdToUse.setBeanClass(resolvedClass);
		}

		/*准备方法重写*/
		try {
			mbdToUse.prepareMethodOverrides();
		}
		catch (BeanDefinitionValidationException ex) {
			throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
					beanName, "Validation of method overrides failed", ex);
		}

		try {
			
			/*初始化前对BeanPostProcessors进行处理,返回的是一个代理而不是目标对象*/
			Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
			if (bean != null) {
				return bean;
			}
		}
		catch (Throwable ex) {
			throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
					"BeanPostProcessor before instantiation of bean failed", ex);
		}

		try {
		    /*创建实例*/
			Object beanInstance = doCreateBean(beanName, mbdToUse, args);
			return beanInstance;
		}
		catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
			throw ex;
		}
		catch (Throwable ex) {
			throw new BeanCreationException(
					mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
		}
	}

/*应用初始化前的post-processors,解析对于特殊的bean是否有 before-instantiation*/
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
		Object bean = null;
		if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
			// Make sure bean class is actually resolved at this point.
			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;
	}

/*对初始化前的bean进行InstantiationAwareBeanPostProcessor处理*/
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
		for (BeanPostProcessor bp : getBeanPostProcessors()) {
			if (bp instanceof InstantiationAwareBeanPostProcessor) {
				InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
				Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
				if (result != null) {
					return result;
				}
			}
		}
		return null;
	}


 /*对初始化后的bean进行BeanPostProcessor处理*/
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
			throws BeansException {
			
		Object result = existingBean;
		for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
			Object current = beanProcessor.postProcessAfterInitialization(result, beanName);
			if (current == null) {
				return result;
			}
			result = current;
		}
		return result;
	}

 具体创建bean的核心实现如下:

doCreateBean
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
			throws BeanCreationException {

		BeanWrapper instanceWrapper = null;
		if (mbd.isSingleton()) {
			instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
		}
		if (instanceWrapper == null) {
		  
		   /*创建实例*/
			instanceWrapper = createBeanInstance(beanName, mbd, args);
		}
		
		/*获取实例和Class类型*/
		final Object bean = instanceWrapper.getWrappedInstance();
		Class<?> beanType = instanceWrapper.getWrappedClass();
		if (beanType != NullBean.class) {
			mbd.resolvedTargetType = beanType;
		}

		synchronized (mbd.postProcessingLock) {
			if (!mbd.postProcessed) {
				try {
					
					/*使用post-processors修改合并的bean定义*/
					applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
				}
				catch (Throwable ex) {
					throw new BeanCreationException(mbd.getResourceDescription(), beanName,
							"Post-processing of merged bean definition failed", ex);
				}
				mbd.postProcessed = true;
			}
		}

		/*检测是否有提前暴露单例类*/
		boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
				isSingletonCurrentlyInCreation(beanName));
		if (earlySingletonExposure) {
			if (logger.isDebugEnabled()) {
				logger.debug("Eagerly caching bean '" + beanName +
						"' to allow for resolving potential circular references");
			}
			addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
		}

		/*初始化类*/ 
		Object exposedObject = bean;
		try {
			
			/*广播初始化的类*/ 
			populateBean(beanName, mbd, instanceWrapper);
			/*初始化类*/ 
			exposedObject = initializeBean(beanName, exposedObject, mbd);
		}
		catch (Throwable ex) {
			if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
				throw (BeanCreationException) ex;
			}
			else {
				throw new BeanCreationException(
						mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
			}
		}

		if (earlySingletonExposure) {
		
		   /*根据提前暴露的单例类的引用获取单例类实例*/
			Object earlySingletonReference = getSingleton(beanName, false);
			if (earlySingletonReference != null) {
				if (exposedObject == bean) {
					exposedObject = earlySingletonReference;
				}
				else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
					String[] dependentBeans = getDependentBeans(beanName);
					Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
					for (String dependentBean : dependentBeans) {
						if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
						
						   /*将依赖的单例类加入到列表中*/
							actualDependentBeans.add(dependentBean);
						}
					}
					if (!actualDependentBeans.isEmpty()) {
						throw new BeanCurrentlyInCreationException(beanName,
								"Bean with name '" + beanName + "' has been injected into other beans [" +
								StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +
								"] in its raw version as part of a circular reference, but has eventually been " +
								"wrapped. This means that said other beans do not use the final version of the " +
								"bean. This is often the result of over-eager type matching - consider using " +
								"'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");
					}
				}
			}
		}

		try {
			
			/*如果有需要,注册抛弃的bean*/ 
			registerDisposableBeanIfNecessary(beanName, bean, mbd);
		}
		catch (BeanDefinitionValidationException ex) {
			throw new BeanCreationException(
					mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
		}

		return exposedObject;
	}
populateBean

执行广播bean的初始化实现如下:

protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
		if (bw == null) {
			if (mbd.hasPropertyValues()) {
				throw new BeanCreationException(
						mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
			}
			else {
				// Skip property population phase for null instance.
				return;
			}
		}

		/*给InstantiationAwareBeanPostProcessors接口修改bean的状态*/
		/*在属性被设定之前,在字段注入的时候回被用到*/
		boolean continueWithPropertyPopulation = true;

		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
			for (BeanPostProcessor bp : getBeanPostProcessors()) {
				if (bp instanceof InstantiationAwareBeanPostProcessor) {
					InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
					if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
						continueWithPropertyPopulation = false;
						break;
					}
				}
			}
		}

		if (!continueWithPropertyPopulation) {
			return;
		}

		PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);

		if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME ||
				mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
			
			/*获取属性的注入类型*/
			MutablePropertyValues newPvs = new MutablePropertyValues(pvs);

			/*依据名称注入属性*/
			if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {
				autowireByName(beanName, mbd, bw, newPvs);
			}

			/*依据类型注入属性*/
			if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
				autowireByType(beanName, mbd, bw, newPvs);
			}

			pvs = newPvs;
		}

		boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
		boolean needsDepCheck = (mbd.getDependencyCheck() != RootBeanDefinition.DEPENDENCY_CHECK_NONE);

		if (hasInstAwareBpps || needsDepCheck) {
			if (pvs == null) {
				pvs = mbd.getPropertyValues();
			}
			PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
			if (hasInstAwareBpps) {
				for (BeanPostProcessor bp : getBeanPostProcessors()) {
					if (bp instanceof InstantiationAwareBeanPostProcessor) {
						InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
						pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
						if (pvs == null) {
							return;
						}
					}
				}
			}
			if (needsDepCheck) {
				checkDependencies(beanName, mbd, filteredPds, pvs);
			}
		}

		if (pvs != null) {
			applyPropertyValues(beanName, mbd, bw, pvs);
		}
	}

DefaultListableBeanFactory核心实现

DefaultListableBeanFactory内部属性定义
	/* DefaultListableBeanFactory引用的缓存 */
	private static final Map<String, Reference<DefaultListableBeanFactory>> serializableFactories =
			new ConcurrentHashMap<>(8);

	/* DefaultListableBeanFactory的序列化id */
	@Nullable
	private String serializationId;

	/*标志是否允许不同的定义有相同的名称 */
	private boolean allowBeanDefinitionOverriding = true;

	/*是否允许懒加载beans*/
	private boolean allowEagerClassLoading = true;

	/*可选择的依赖排序顺序*/
	@Nullable
	private Comparator<Object> dependencyComparator;

	/*用来检测bean definition 能否被自动注入的解析器*/
	private AutowireCandidateResolver autowireCandidateResolver = new SimpleAutowireCandidateResolver();

	/*依赖类型和对应的自动注入的值的映射*/
	private final Map<Class<?>, Object> resolvableDependencies = new ConcurrentHashMap<>(16);

	/*BeanDefinition缓存*/
	private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);

	/*依赖类型和单例,非单例bean的映射*/
	private final Map<Class<?>, String[]> allBeanNamesByType = new ConcurrentHashMap<>(64);

	/*依赖类型和单例bean的映射*/
	private final Map<Class<?>, String[]> singletonBeanNamesByType = new ConcurrentHashMap<>(64);

	/*按照注册顺序的bean definition名称集合*/
	private volatile List<String> beanDefinitionNames = new ArrayList<>(256);

	/*手动注册的单例类名称,按照注册顺序排序*/
	private volatile Set<String> manualSingletonNames = new LinkedHashSet<>(16);

	/*固定配置了的bean definition名称缓存数组*/
	@Nullable
	private volatile String[] frozenBeanDefinitionNames;

	/*标志bean definition元数据能否缓存为所有的bean*/
	private volatile boolean configurationFrozen = false;
DefaultListableBeanFactory核心实现方法
doGetBeanNamesForType

 根据给出的类型获取已经注册的bean名称,判断bean definition或者getObjectType方法返回的值是否是FactoryBean实例。

private String[] doGetBeanNamesForType(ResolvableType type, boolean includeNonSingletons, boolean allowEagerInit) {
		List<String> result = new ArrayList<>();

		/*检测所有的beans*/
		for (String beanName : this.beanDefinitionNames) {
			
			/*判断bean名称是否是别称*/
			if (!isAlias(beanName)) {
				try {
					RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
					
					/*判断bean定义是否是完整*/
					if (!mbd.isAbstract() && (allowEagerInit ||
							(mbd.hasBeanClass() || !mbd.isLazyInit() || isAllowEagerClassLoading()) &&
									!requiresEagerInitForType(mbd.getFactoryBeanName()))) {
					
						boolean isFactoryBean = isFactoryBean(beanName, mbd);
						BeanDefinitionHolder dbd = mbd.getDecoratedDefinition();
						boolean matchFound =
								(allowEagerInit || !isFactoryBean ||
										(dbd != null && !mbd.isLazyInit()) || containsSingleton(beanName)) &&
								(includeNonSingletons ||
										(dbd != null ? mbd.isSingleton() : isSingleton(beanName))) &&
								isTypeMatch(beanName, type);
						if (!matchFound && isFactoryBean) {
							
							beanName = FACTORY_BEAN_PREFIX + beanName;
							matchFound = (includeNonSingletons || mbd.isSingleton()) && isTypeMatch(beanName, type);
						}
						if (matchFound) {
							result.add(beanName);
						}
					}
				}
				catch (CannotLoadBeanClassException ex) {
					if (allowEagerInit) {
						throw ex;
					}
					
					if (logger.isDebugEnabled()) {
						logger.debug("Ignoring bean class loading failure for bean '" + beanName + "'", ex);
					}
					onSuppressedException(ex);
				}
				catch (BeanDefinitionStoreException ex) {
					if (allowEagerInit) {
						throw ex;
					}
					
					if (logger.isDebugEnabled()) {
						logger.debug("Ignoring unresolvable metadata in bean definition '" + beanName + "'", ex);
					}
					onSuppressedException(ex);
				}
			}
		}

		for (String beanName : this.manualSingletonNames) {
			try {
				
				/*判断是否是FactoryBean创建的实例*/
				if (isFactoryBean(beanName)) {
					if ((includeNonSingletons || isSingleton(beanName)) && isTypeMatch(beanName, type)) {
						result.add(beanName);
						continue;
					}
					
					beanName = FACTORY_BEAN_PREFIX + beanName;
				}
			
				/*匹配原始的bean类型*/
				if (isTypeMatch(beanName, type)) {
					result.add(beanName);
				}
			}
			catch (NoSuchBeanDefinitionException ex) {
				
				......
				
				if (logger.isDebugEnabled()) {
					logger.debug("Failed to check manually registered singleton with name '" + beanName + "'", ex);
				}
			}
		}
		return StringUtils.toStringArray(result);
	}
preInstantiateSingletons

 预初始化单例类

public void preInstantiateSingletons() throws BeansException {
		
		List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

		/*触发初始化所有非懒加载bean*/ 
		for (String beanName : beanNames) {
			RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
			if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
				if (isFactoryBean(beanName)) {
					Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
					if (bean instanceof FactoryBean) {
						final FactoryBean<?> factory = (FactoryBean<?>) bean;
						boolean isEagerInit;
						if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
							isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)
											((SmartFactoryBean<?>) factory)::isEagerInit,
									getAccessControlContext());
						}
						else {
							isEagerInit = (factory instanceof SmartFactoryBean &&
									((SmartFactoryBean<?>) factory).isEagerInit());
						}
						if (isEagerInit) {
							getBean(beanName);
						}
					}
				}
				else {
					getBean(beanName);
				}
			}
		}

		/*在回调应用所有的beans的时候,触发post-initialization*/
		for (String beanName : beanNames) {
			Object singletonInstance = getSingleton(beanName);
			if (singletonInstance instanceof SmartInitializingSingleton) {
				final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
				if (System.getSecurityManager() != null) {
					AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
						smartSingleton.afterSingletonsInstantiated();
						return null;
					}, getAccessControlContext());
				}
				else {
					smartSingleton.afterSingletonsInstantiated();
				}
			}
		}
	}
doResolveDependency

 解析依赖的过程如下:

public Object doResolveDependency(DependencyDescriptor descriptor, @Nullable String beanName,
			@Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException {
		
		/*注入点,指向一个方法/构造器或者一个字段*/
		InjectionPoint previousInjectionPoint = ConstructorResolver.setCurrentInjectionPoint(descriptor);
		try {
			Object shortcut = descriptor.resolveShortcut(this);
			if (shortcut != null) {
				return shortcut;
			}
			
			/*获取依赖类型*/
			Class<?> type = descriptor.getDependencyType();
			Object value = getAutowireCandidateResolver().getSuggestedValue(descriptor);
			if (value != null) {
				if (value instanceof String) {
					String strVal = resolveEmbeddedValue((String) value);
					BeanDefinition bd = (beanName != null && containsBean(beanName) ? getMergedBeanDefinition(beanName) : null);
					value = evaluateBeanDefinitionString(strVal, bd);
				}
				TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());
				return (descriptor.getField() != null ?
						converter.convertIfNecessary(value, type, descriptor.getField()) :
						converter.convertIfNecessary(value, type, descriptor.getMethodParameter()));
			}

			Object multipleBeans = resolveMultipleBeans(descriptor, beanName, autowiredBeanNames, typeConverter);
			if (multipleBeans != null) {
				return multipleBeans;
			}

			Map<String, Object> matchingBeans = findAutowireCandidates(beanName, type, descriptor);
			if (matchingBeans.isEmpty()) {
				if (isRequired(descriptor)) {
					raiseNoMatchingBeanFound(type, descriptor.getResolvableType(), descriptor);
				}
				return null;
			}

			String autowiredBeanName;
			Object instanceCandidate;

			if (matchingBeans.size() > 1) {
				autowiredBeanName = determineAutowireCandidate(matchingBeans, descriptor);
				if (autowiredBeanName == null) {
					if (isRequired(descriptor) || !indicatesMultipleBeans(type)) {
						return descriptor.resolveNotUnique(type, matchingBeans);
					}
					else {
						return null;
					}
				}
				instanceCandidate = matchingBeans.get(autowiredBeanName);
			}
			else {
			
				Map.Entry<String, Object> entry = matchingBeans.entrySet().iterator().next();
				autowiredBeanName = entry.getKey();
				instanceCandidate = entry.getValue();
			}

			if (autowiredBeanNames != null) {
				autowiredBeanNames.add(autowiredBeanName);
			}
			if (instanceCandidate instanceof Class) {
				instanceCandidate = descriptor.resolveCandidate(autowiredBeanName, type, this);
			}
			Object result = instanceCandidate;
			if (result instanceof NullBean) {
				if (isRequired(descriptor)) {
					raiseNoMatchingBeanFound(type, descriptor.getResolvableType(), descriptor);
				}
				result = null;
			}
			if (!ClassUtils.isAssignableValue(type, result)) {
				throw new BeanNotOfRequiredTypeException(autowiredBeanName, type, instanceCandidate.getClass());
			}
			return result;
		}
		finally {
			ConstructorResolver.setCurrentInjectionPoint(previousInjectionPoint);
		}
	}

猜你喜欢

转载自blog.csdn.net/Pengjx2014/article/details/83045333