<context-param>,轉為鍵值對綁定到 ServletContext (可通过 getInitParameter 獲取)。<listener> 指定的類 (ServletContextListener 等),調用 contextInitialized。<filter> 類,調用 init(FilterConfig)。注意:<filter-mapping> 必須在 <filter> 之後聲明 (順序敏感)。load-on-startup 值升序實例化並調用 init(ServletConfig)。值相同則容器決定順序;未配置或負值則首次請求時初始化。完整順序:ServletContext → context-param → Listener → Filter → Servlet
| 值 | 行為 |
|---|---|
| >= 0 | 啟動時實例化,數值越小優先級越高 |
| 未配置 / < 0 | 首次請求時懶加載 |
優勢:啟動期發現初始化錯誤 (如數據庫連接失敗) 而非運行時;請求無需等待初始化。
1. 實例化 (構造器)
2. init(config) // 僅一次
3. service(req, resp) // 多線程並發處理請求
4. destroy() // 容器關閉/重載前調用
HttpServlet 默認單實例多線程。實例變量 (成員字段) 非線程安全。
ThreadLocal、同步鎖、或無狀態設計 (Spring Bean 單例無狀態)。SingleThreadModel 已棄用 (容器池化實例,效能差)。
@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");
}
}
}
InitServlet
com.example.InitServlet
1
InitServlet
/init