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.sta
rtupShutdownMonitor) {
     //准备刷新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实例,内部使用了

getParent()返回实例化的ApplicationContext 再由getBeanFacory()方法 返回BeanFactory的具体实现接口:ConfigurableListableBeanFactory;  getBeanFactory()的具体代码在AbstractRefreshableApplicationContext抽象类中实现:返回的
是实现了ConfigurableListableBeanFactory接口的具体类DefaultListableBeanFactory.该返回对象在AbstractRefreshableApplicationContext属于成员变量;

但还是主要了解AbstractXmlApplicationContext中的customizeBeanFactory(beanFactory);loadBeanDefinitions(beanFactory);
 
这是Spring正常启动要走的流程:customizeBeanFactory(beanFactory)配置了allowBeanDefinitionOverridingallowCircularReferences两个boolean值默认,是否允许Bean的覆盖以及Bean的循环引用;

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应用;

 

posted @ 2019-05-06 18:03  XSS-Freak  阅读(156)  评论(1)    收藏  举报