首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

Spring源码翻阅:XmlWebApplicationContext

2012-10-31 
Spring源码阅读:XmlWebApplicationContextXmlWebApplicationContext是spring在web应用中的applicationCont

Spring源码阅读:XmlWebApplicationContext
XmlWebApplicationContext是spring在web应用中的applicationContext,
在ContextLoaderListener或ContextLoaderServlet中完成了初步的设置。

XmlWebApplicationContext跟其他的applicationContext(FileSystem,Classpath)一样,是AbstractApplicationContext的一个子类。
applicationContext的refresh过程是线程同步的。
如下:
synchronized (this.startupShutdownMonitor)

阅读笔记:

方法1
prepareRefresh();  //设定起始时间,并设置active标记

方法2
prepareBeanFactory(beanFactory);

// 完成BeanFactory的创建

ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();    protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {        refreshBeanFactory();        ConfigurableListableBeanFactory beanFactory = getBeanFactory();        if (logger.isDebugEnabled()) {            logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);        }        return beanFactory;    }


refreshBeanFactory 在AbstractRefreshableApplicationContext(是XmlWebApplicationContext的父类)中进行了实现。
创建了DefaultListableBeanFactory,随后执行loadBeanDefinitions(beanFactory)。
具体的加载过程是委托给XmlBeanDefinitionReader完成。

protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {// Create a new XmlBeanDefinitionReader for the given BeanFactory.XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);// Configure the bean definition reader with this context's// resource loading environment.beanDefinitionReader.setResourceLoader(this);beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));// Allow a subclass to provide custom initialization of the reader,// then proceed with actually loading the bean definitions.initBeanDefinitionReader(beanDefinitionReader);        loadBeanDefinitions(beanDefinitionReader);}


该方法中的XmlBeanDefinitionReader完成了WEB-INF/applicationContext.xml(可指定contextConfigLoaction的值,可使用,; \t\n指定多个applicationContext.xml文件)的加载

// 获取beanDefinitionConfig,循环加载
protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws IOException {String[] configLocations = getConfigLocations();if (configLocations != null) {for (String configLocation : configLocations) {                // 完成所有applicationContext.xml的加载                reader.loadBeanDefinitions(configLocation);}}}


方法3
下面的一大片,慢慢看吧。

        beanFactory.setBeanClassLoader(getClassLoader());        beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver());        beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this));// Allows post-processing of the bean factory in context subclasses.postProcessBeanFactory(beanFactory);// Invoke factory processors registered as beans in the context.invokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.registerBeanPostProcessors(beanFactory);// Initialize message source for this context.initMessageSource();// Initialize event multicaster for this context.initApplicationEventMulticaster();// Initialize other special beans in specific context subclasses.onRefresh();// Check for listener beans and register them.registerListeners();// Instantiate all remaining (non-lazy-init) singletons.finishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.finishRefresh();

热点排行