zoukankan      html  css  js  c++  java
  • spring XmlWebApplicationContext详解

    XmlWebApplicationContext是spring在web应用中的context,
    在ContextLoaderListener或ContextLoaderServlet中完成了初步的设置。

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

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

    方法2

    // 通知子类完成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);这个是在XmlWebApplicationContext中进行了实现。

    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);
    }

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

    // 上面浅黄色的方法如下
    protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws IOException {
    String[] configLocations = getConfigLocations();
    if (configLocations != null) {
    for (String configLocation : configLocations) {
                   reader.loadBeanDefinitions(configLocation);// 完成所有applicationContext.xml的加载
    }
    }
    }

    具体的xmlreader的装载再以后详细阅读。继续分析xmlwebApplicationContext的refresh过程。

    方法3
    prepareBeanFactory(beanFactory);

    部分代码:

            beanFactory.setBeanClassLoader(getClassLoader()); //设定类加载器
    // 设定spring的EL解决器
            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();

    文章出自:http://hi.baidu.com/yuanyuan1027/blog/item/9727c9dfd04d4a5995ee3723.html

  • 相关阅读:
    css3动画之1--animation小例子
    炎炎夏日,走入美妙的前端设计案例
    模拟腾讯、携程、百度音乐 移动端图片切换第一版
    仿QQ空间长图效果简易版--母亲节感恩
    001-搭建框架
    javascript事件绑定1-模拟jquery可爱的东西
    图片尺寸
    mvc3结合spring.net-依赖注入
    *创建索引初步
    Lucene的分词_中文分词器介绍
  • 原文地址:https://www.cnblogs.com/pocter/p/3684514.html
Copyright © 2011-2022 走看看