前言
前面两篇文章主要介绍的是xml到BeanDefinition的过程,我们知道在使用Spring的过程中通常直接使用getBean(beanName)的方式,getBean返回的是实例化并且已经完成初始化后的对象。对于我们平时使用来说,创建一个对象通常会使用new,或者使用反射。我们使用反射instantiation对象,使用反射填充field,使用反射调用init方法,最终得到对象使用。Spring也是采用的同样的过程,只不过过程更为复杂,考虑的异常情况更多。
抽丝剥茧出主干也就是:
根据BeanDefinition的信息找到对象构造器,实例化对象
根据BeanDefinition的信息找到属性值,填充之
-
如果有初始化方法,调用初始化方法
当然上述主干主要讲的是非单例对象,如果是单例对象创建一次之后需要保证其唯一性,而以上三步每一步在Spring中都很复杂,本文只是分析一个大体过程,而每个小点将放在以后的博文中进行详细讲解,目前规划好的小点有:
Spring对于循环依赖问题的解决
Spring属性填充过程
Spring在Bean创建过程中提供的扩展点及事件监听
Spring的initiation过程及一种并行初始化的实现。
getBean的主干
抽出BeanFactory.getBean的主干如下:
在本文中只讨论单例对象(默认scope,非factoryBean类)的创建过程
贴一段doGetBean的主干代码
protected T doGetBean( final String name, final Class requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException {
final String beanName = transformedBeanName(name);
Object bean;
// Eagerly check singleton cache for manually registered singletons.
Object sharedInstance = getSingleton(beanName);
...
if (mbd.isSingleton()) {
sharedInstance = getSingleton(beanName, new ObjectFactory