Spring深入研究

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/gjm15652957971/article/details/82109902

1, 启动过程前置知识:

前置知识:
  1, 首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境,这个上下文就是
     ServletContext,其为后面的spring IoC容器提供宿主环境;
  2, 其次,在web.xml中会提供有contextLoaderListener。在web容器启动时,会触发容器初始化事件,此时
     contextLoaderListener会监听到这个事件,其contextInitialized方法会被调用,在这个方法
     中,spring会初始化一个启动上下文,这个上下文被称为根上下文,即WebApplicationContext,这是一个
     接口类,确切的说,其实际的实现类是XmlWebApplicationContext。这个就是spring的IoC容器,其对应
     的Bean定义的配置由web.xml中的context-param标签指定。在这个IoC容器初始化完毕后,spring以
     WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE为属性Key,将其存储到
     ServletContext中,便于获取;
  3, 再次,contextLoaderListener监听器初始化完毕后,开始初始化web.xml中配置的Servlet,这个
     servlet可以配置多个,以最常见的DispatcherServlet为例,这个servlet实际上是一个标准的前端控制
     器,用以转发、匹配、处理每个servlet请求。DispatcherServlet上下文在初始化的时候会建立自己的
     IoC上下文,用以持有spring mvc相关的bean。在建立DispatcherServlet自己的IoC上下文时,会利用
     WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE先从ServletContext中获取之前的根
     上下文(即WebApplicationContext)作为自己上下文的parent上下文。有了这个parent上下文之后,再初
     始化自己持有的上下文。这个DispatcherServlet初始化自己上下文的工作在其initStrategies方法中可
     以看到,大概的工作就是初始化处理器映射、视图解析等。这个servlet自己持有的上下文默认实现类也是
     mlWebApplicationContext。初始化完毕后,spring以与servlet的名字相关(此处不是简单的以servlet
     名为Key,而是通过一些转换,具体可自行查看源码)的属性为属性Key,也将其存到ServletContext中,以
     便后续使用。这样每个servlet就持有自己的上下文,即拥有自己独立的bean空间,同时各个servlet共享
     相同的bean,即根上下文(第2步中初始化的上下文)定义的那些bean。

2,启动过程:

  

web.xml在<context-param></context-param>标签中声明应用范围内的初始化参数
spring的启动过程其实就是其IoC容器的启动过程,对于web程序,IoC容器启动过程即是建立上下文的过程。

1, 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener>
   </listener> 和 <context-param></context-param>
2, 紧接着,容器创建一个ServletContext(上下文)。在该应用内全局共享。
3, 容器将<context-param></context-param>转化为键值对,并交给ServletContext.
4, 容器创建<listener></listener>中的类实例,即创建监听.该监听器必须实现自ServletContextListener
   接口
5, 在监听中会有contextInitialized(ServletContextEvent event)初始化方法
   在这个方法中获得ServletContext = ServletContextEvent.getServletContext();
   “context-param的值” = ServletContext.getInitParameter("context-param的键"); 
6, 得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.
   这个动作会比所有的Servlet都要早.换句话说,这个时候,你对<context-param>中的键值做的操作,将在你的
   WEB项目完全启动之前被执行.
    

3,web.xml中参数定义

一个是全局参数(ServletContext),通过<context-param></context-param>
一个是servlet参数,通过在servlet中声明  
    <init-param>
       <param-name>param1</param-name>
       <param-value>avalible in servlet init()</param-value>   
    </init-param>
第一种参数在servlet里面可以通过getServletContext().getInitParameter("context/param")得到 
第二种参数只能在servlet的init()方法中通过this.getInitParameter("param1")取得

猜你喜欢

转载自blog.csdn.net/gjm15652957971/article/details/82109902