zoukankan      html  css  js  c++  java
  • springmvc web.xml配置之 -- SpringMVC IOC容器初始化

    SpringMVC IOC容器初始化

    首先强调一下SpringMVC IOC容器初始化有些特别,在SpringMVC中除了生成一个全局的spring Ioc容器外,还会为DispatcherServlet生成一个容器,具体的下一篇有讲述。

    我们知道spring中单纯使用main函数就可以生成一个容器,如下:

    public class MainTest {
        public static void main(String[] args){
            ApplicationContext appContext = new ClassPathXmlApplicationContext("cjj/models/beans.xml");
            Person p = (Person)appContext.getBean("person");
        }
    }

    以前专门写过一篇spring Ioc容器初始化过程的文章 《Spring IoC容器初始化过程学习》,感兴趣可以看看。该文中注意介绍了Spring IOC容器初始化过程一般需要三个步骤,

    1. Resource定位(Bean的定义文件定位)
    2. 将Resource定位好的资源载入到BeanDefinition
    3. 将BeanDefiniton注册到容器中

    那篇文章中强调的是bean的加载过程,也是核心过程,这个过程可查阅源代码中的obtainFreshBeanFactory过程 ,该过程中会执行refreshBeanFactory会创建一个beanFactory实例(默认类型为DefaultListableBeanFactory),以及loadBeanDefinitions(defaultListableBeanFactory)。

    但是spring容器初始化的过程远远 不止文中介绍的那么多,还有一个重要的refresh方法需要进行补充。那么本文可以结合web.xml配置加载来简单的阐述refresh方法执行力那些逻辑。

    如果你不太了解应用启动时容器初始化web.xml的作用,建议先看一下之前的文章《springmvc web.xml配置之ContextLoaderListener》,该文中介绍了Spring中ContextLoaderListener的作用,知道ContextLoaderListener首先会常见一个XmlWebApplicationContext类型的IOC容器,然后读取配置文件信息进行初始化,如果没有写,那就默认为/WEB-INF/applicationContext.xml,可以查阅源码:

    public class XmlWebApplicationContext extends AbstractRefreshableWebApplicationContext {
        public static final String DEFAULT_CONFIG_LOCATION = "/WEB-INF/applicationContext.xml";
        public static final String DEFAULT_CONFIG_LOCATION_PREFIX = "/WEB-INF/";
        public static final String DEFAULT_CONFIG_LOCATION_SUFFIX = ".xml";
        ...(略)

    一般会在web.xml配置,如下:

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:spring/applicationcontext-*.xml</param-value>
    </context-param>

    例如像上面这么配置的话,XmlWebApplicationContext容器就会将applicationcontext-*.xml配置文件中的信息读取到,然后调用refresh()方法,由于XmlWebApplicationContext implements于ConfigurableApplicationContext,也就是实现了ConfigurableApplicationContext.refresh()方法,该方法会将这些配置信息加载到IOC容器中。

    具体的,XmlWebApplicationContext继承于AbstractApplicationContext,它实现了ConfigurableApplicationContext接口中的refresh方法:

    public void refresh() throws BeansException, IllegalStateException {
        Object var1 = this.startupShutdownMonitor;
        synchronized(this.startupShutdownMonitor) {
            this.prepareRefresh();
            ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
            this.prepareBeanFactory(beanFactory);
    
            try {
                this.postProcessBeanFactory(beanFactory);
                this.invokeBeanFactoryPostProcessors(beanFactory);
                this.registerBeanPostProcessors(beanFactory);
                this.initMessageSource();
                this.initApplicationEventMulticaster();
                this.onRefresh();
                this.registerListeners();
                this.finishBeanFactoryInitialization(beanFactory);
                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();
            }
    
        }
    }
    

      

    • prepareRefresh()

    准备工作,一是设置spring启动事件,开启活跃状态;二是初始化属性源信息;三是验证必要属性。

    • obtainFreshBeanFactory()

    创建beanFactory(过程是根据xml为每个bean生成BeanDefinition并注册到生成的beanFactory)

    • prepareBeanFactory(beanFactory)

    注册bean等。

    • postProcessBeanFactory(beanFactory)

    继上一步beanfactory设置之后进行后续操作

    • invokeBeanFactoryPostProcessors(beanFactory)

    • registerBeanPostProcessors(beanFactory)

    例化和注册beanFactory中扩展了BeanPostProcessor的bean

    • initMessageSource()

    初始化国际化属性。

    • initApplicationEventMulticaster

    初始化事件广播器,用于发布事件。

    • onRefresh()

    设置样式工具ThemeSource

    • registerListeners()
    • finishBeanFactoryInitialization(beanFactory)
    • finishRefresh()

    更多具体细节可以參考: https://www.cnblogs.com/lkdirk/p/7145941.html 。

     

  • 相关阅读:
    vue中在echarts tooltip中添加点击事件
    支配树
    mac安装protobuf
    mac安装 thrift
    Javascript设计模式读书笔记二 接口
    WebBrowser捕获网页关闭事件
    谈谈UserControl调用页面的几种方法
    屏蔽刷新提交后台
    [喜讯]Acey.ExcelX组件已发布在componentsource
    AceyOffice教程如何判断单元格的内容
  • 原文地址:https://www.cnblogs.com/chenjunjie12321/p/9357563.html
Copyright © 2011-2022 走看看