但行好事
莫论前程❤

Web容器启动时的加载顺序

img
– 启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<context-param>结点。
– 容器创建一个ServletContext(servlet上下文),这个 web项目的所有部分都将共享这个上下文。
– 容器将<context-param>转换为键值对,并交给 servletContext。 因为listener, filter 等在初始化时会用到这些上下文中的信息,所以要先加载。
– 容器创建<listener>中的类实例,创建监听器。
– 加载filterservlet (同类多个节点以出现顺序依次加载)

load-on-startup元素在web应用启动的时候指定了servlet被加载的顺序,它的值必须是一个整数。

例如:

    <servlet>
        <servlet-name>perftrace-web</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

如果它的值是一个负整数或是这个元素不存在,那么容器会在该servlet被调用的时候,加载这个servlet。如果值是正整数或零,容器在配置的时候就加载并初始化这个servlet,容器必须保证值小的先被加载。如果值相等,容器可以自动选择先加载谁。

总结 :

web.xml 的加载顺序(即web容器的加载顺序)是:

ServletContext -> context-param -> listener -> filter -> servlet

img

注:

  • shiro的ream加载级别默认是filter
  • SpringMVC 的加载级别是在servlet之后

若需在ream中注入SpringMVC中定义的bean , 则需要提高 SpringMVC的初始化优先级

spring的默认加载级别貌似也是在servlet之后 但是一般我们都会使用spring的ContextLoaderListener类来提高spring的初始化顺序为listener级别

所以也可以通过提高SpringMVC的初始化优先级来解决这一问题

   <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:applicationContext-web.xml,
            classpath:applicationContext-shiro.xml,
            classpath:applicationContext-jedis.xml
        </param-value>
    </context-param>
赞(1) 打赏
未经允许不得转载:刘鹏博客 » Web容器启动时的加载顺序
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏