首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

web.xml 初始化加載順序詳解:ServletContext → Context-Param → Listener → Filter → Servlet

     編輯:Java 相關知識

標準加載順序 (Servlet 規範)

  1. ServletContext:容器啟動,創建唯一上下文對象,全應用共享。
  2. context-param:解析 <context-param>,轉為鍵值對綁定到 ServletContext (可通过 getInitParameter 獲取)。
  3. Listener:實例化 <listener> 指定的類 (ServletContextListener 等),調用 contextInitialized。
  4. Filter:實例化 <filter> 類,調用 init(FilterConfig)。注意:<filter-mapping> 必須在 <filter> 之後聲明 (順序敏感)。
  5. Servlet:按 load-on-startup 值升序實例化並調用 init(ServletConfig)。值相同則容器決定順序;未配置或負值則首次請求時初始化。

完整順序:ServletContext → context-param → Listener → Filter → Servlet

load-on-startup 詳解

值行為
>= 0啟動時實例化,數值越小優先級越高
未配置 / < 0首次請求時懶加載

優勢:啟動期發現初始化錯誤 (如數據庫連接失敗) 而非運行時;請求無需等待初始化。

Servlet 生命週期回顧


1. 實例化 (構造器)
2. init(config)  // 僅一次
3. service(req, resp)  // 多線程並發處理請求
4. destroy()     // 容器關閉/重載前調用

線程安全警示

HttpServlet 默認單實例多線程。實例變量 (成員字段) 非線程安全。

  • 請求相關數據放局部變量 (棧封閉)。
  • 共享狀態用 ThreadLocal、同步鎖、或無狀態設計 (Spring Bean 單例無狀態)。
  • SingleThreadModel 已棄用 (容器池化實例,效能差)。

實戰:啟動初始化 Servlet 示例


@WebServlet(urlPatterns = "/init", loadOnStartup = 1)
public class InitServlet extends HttpServlet {
    @Override
    public void init() {
        // 載入配置、預熱緩存、建立連接池
        Configs.load("app.properties");
        CacheManager.warmUp();
        DataSourcePool.init();
        log.info("系統初始化完成");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws IOException {
        // 支持運行時手動重載
        if ("reload".equals(req.getParameter("action"))) {
            init();
            resp.getWriter().write("reloaded");
        }
    }
}

web.xml 等效配置



    InitServlet
    com.example.InitServlet
    1


    InitServlet
    /init

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved