Spring-Bean 的 IOC流程
Spring-Core组件的IOC实现: -->ClassPathXmlApplicationContext(String[] locations)构造法-->refresh()-->prepareRefresh()
-->ConfigurableListableBeanFactory beanFactory = obtainBeanFactory()-->prepareBeanFactory(beanFactory)-->postProcessBeanFactory(beanFactory)-->invokeBeanFactoryPostProcessors(beanFactory)
-->registerBeanPostProcessors(beanFactory)-->initMessageSource()-->initApplicationEventMulticaster()-->onRefresh()-->registerListeners()-->finishBeanFactoryInitialization(beanFactory)
-->finishRefresh() 完成refresh() 这就是Spring容器的全部加载大致流程
package org.springframework.context.support.AbstractApplicationContext;
private final Object startupShutdownMonitor;
public void refresh() throws BeansException, IllegalStateException {
//加锁 startupShutdownMonitor仅仅是一个没有Object 专门作为对象锁
synchronized(this.startupShutdownMonitor) {
//准备刷新bf
this.prepareRefresh();
//获取DefaultListableBeanFactory (是ConfigurableListableBeanFactory的实现)
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
//给bf做准备工作
this.prepareBeanFactory(beanFactory);
try {
//对bf做后处理
this.postProcessBeanFactory(beanFactory);
//调用bf的后处理器
this.invokeBeanFactoryPostProcessors(beanFactory);
//注册Bean的后处理器
this.registerBeanPostProcessors(beanFactory);
//国际化Spring内部的消息源
this.initMessageSource();
//初始化Spring内部的事件广播器
this.initApplicationEventMulticaster();
//执行Spring 主题的刷新 UiApplicationContextUtils.initThemeSource()
this.onRefresh();
//注册监听器
this.registerListeners();
//bf的初始化完结
this.finishBeanFactoryInitialization(beanFactory);
//完成所有的refresh:清空加载source(Spring资源文件)的缓存;让Spring容器的生命周期处理器初始化主题原;广播Spring的内部事件
this.finishRefresh();
} catch (BeansException var9) {
if (this.logger.isWarnEnabled()) {
this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
}
this.destroyBeans();
this.cancelRefresh(var9);
throw var9;
} finally {
this.resetCommonCaches();
}
}
}
首先了解obtainRefreshBeanFactory()引用的refreshBeanFactory()[属于AbstractRefreshableApplicationContext]以及return getBeanFactory();
refreshBeanFactory()方法引用了destoryBeans();closeBeanFactory();createBeanFactory();销毁BF关闭BF创建BF
createBeanFactory()返回的是DefaultListableBeanFactory,,由其构造函数return new DefaultListableBeanFactory(getInternalParentBeanFactory());getInternalParentBeanFactory()返回实例化的ApplicationContext或者说BeanFactory实例,内部使用了
是实现了ConfigurableListableBeanFactory接口的具体类DefaultListableBeanFactory.该返回对象在AbstractRefreshableApplicationContext属于成员变量;
但还是主要了解AbstractXmlApplicationContext中的customizeBeanFactory(beanFactory);loadBeanDefinitions(beanFactory);
loadBeanDefinitions(beanFactory);该方法在引用了局部变量XmlBeanDefinitionReader,分别使用了initBeanDefinitionReader(XmlBeanDefinitionReader) 和 loadBeanDefinitions(XmlBeanDefinitionReader)
initBeanDefinitionReader主要设置了读取器内部的成员validationMode以及namespaceAware的值
主要谈谈loadBeanDefinitions(XmlBeanDefinitionReader);该函数 是负责整个refresh()过程的BeanDefinition装配和具体化的,当然具体的装配和具体化还要由下级的,旁系的基层工作类来实现;
对loadBeanDefinitions(XmlBeanDefinitionReader)内部的函数调用逐个剖析:
参数对象XmlBeanDefinitionReader 读取器自带两个方法来加载Resource[] configResources和String[] configLocations,一个是Resource的具体实现类对象,一个是配置文件的位置configLocations; configLocations是ClassPathXmlApplicationContext(configLocations)构造函数的参数,这个构造函数常常用来启动Spring应用;

浙公网安备 33010602011771号