Spring的整个流程主要分为两个阶段:容器初始化阶段和加载bean阶段。
容器初始化阶段:首先通过加载Configuration,然后容器会对加载的Configuration进行解析和分析,并将分析的信息组装成BeanDefinition对象,并将其保存注册到相应的BeanDefinitionRegistry中。至此是SpringIOC的初始化过程。
加载bean的阶段:进过容器初始化阶段后,应用程序中定义的bean信息已经全部加载到系统中,当我们显式或者隐式的调用getBean()时,则会触发加载bean阶段。在这阶段,容器会首先检查所请求的对象是否已经初始化完成了,如果没有,则会根据注册的 bean 信息实例化请求的对象,并为其注册依赖,然后将其返回给请求方。至此第二个阶段也已经完成。
而 getBean()作为加载bean的入口方法,接收四个参数:
- name:要获取bean的名字
- requiredType:要获取bean的实例
- args:创建bean时传递的参数。
- typeCheckOnly:是否为类型检查
源码如下:
protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
//将name转换为beanName,如果是别名 会转换为对应的beanName
final String beanName = transformedBeanName(name);
Object bean;
//从缓存中获取单例bean
Object sharedInstance = getSingleton(beanName);
if (sharedInstance != null && args == null) {
if (logger.isDebugEnabled()) {
if (isSingletonCurrentlyInCreation(beanName)) {
logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +
"' that is not fully initialized yet - a consequence of a circular reference");
}
else {
logger.debug("Returning cached instance of singleton bean '" + beanName + "'");
}
}
bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
}
e