Java 多線程核心關鍵字全景圖:Runnable/Callable/Future/Executor 體系深度解析
核心類別分類速覽 類別核心接口/類核心職責 任務定義Runnable、Callable<V>定義線程執行邏輯,Callable 支持返回值/
Spring RestDocs 實戰:用單元測試自動生成優雅 API 文檔
為什麼選 Spring RestDocs? 傳統 Swagger 需在代碼中添加大量註解,侵入性強且易與實際接口脫節。Spring RestDocs 採用「測試
MyBatis CRUD 完整實戰教學:從建表到測試一步到位
專案背景與準備 本文以一個 user 表為例,示範 MyBatis 如何完成創建、讀取、更新、刪除(CRUD)全流程。採用 XML 映射檔 + 介面式開發模式,
MyBatis 二級緩存完整配置指南:從入門到進階優化
為什麼需要二級緩存? 在實際專案中,大量查詢操作針對的是相對靜態的共用數據(如字典表、配置資訊、熱門商品等)。若每次請求都直擊資料庫,不僅增加資料庫負載,嚴重影
Spring IOC 容器啟動流程深度解析:從 XML 解析到 Bean 獲取全過程
引言:簡單 Demo 背後的完整鏈路 以經典 XML 配置為例,啟動流程僅四行代碼,卻涵蓋 Spring IOC 核心生命週期: Resource resour
Spring Boot 整合 Log4j2 實現高效能非同步日誌系統
為什麼選擇 Log4j2 Log4j 2.x 相較 1.x 具備顯著優勢: 非同步記錄器:基於 LMAX Disruptor 無鎖環形緩衝區,吞吐量提升 10
Spring Boot 整合 Apache CXF 發布 WebService 完整指南
專案背景與依賴準備 因業務需求需對外提供 SOAP WebService,技術棧為 Spring Boot 2.x + Apache CXF 3.1.6。Mav
Java 裝飾器模式深度解析:從 I/O 流到漢堡製作的實戰演示
模式定義與設計初衷 裝飾器模式:動態地給物件新增職責,如同牆面刷漆層層疊加。相較於繼承產生大量子類別,裝飾器提供更靈活的擴展方式。 核心痛點 繼承導致類別爆
Java 爬蟲實戰:Jsoup 配合 HttpClient 破解動態載入數據
前言:靜態解析的局限 Jsoup 擅長解析靜態 HTML,但面對現代網站普遍採用的「前端渲染、異步載入」架構,單純用 Jsoup 往往只能拿到空殼頁面。以京東商
Spring Security 進階:配置多個 AuthenticationProvider 實現混合認證
前言 網路上關於 Spring Security 的文章大多停留在入門層級,要么是配置 UserDetailsService,要么就是簡單的路由控制,且不少還在
Java 爬蟲利器 Jsoup 詳解:靜態頁解析、選擇器語法、反爬應對與動態渲染局限
Jsoup 核心能力 解析 HTML:字符串、URL、本地文件 → Document 對象 (DOM 樹)。 強大選擇器:CSS Selector (類 jQ
Java sleep() 與 wait() 區別總結:鎖行為、喚醒方式、使用場景對比
核心差異速查表 維度Thread.sleep()Object.wait() 所屬類Thread (靜態方法)Object (實例方法) 鎖行為不釋放 當前持有
web.xml 初始化加載順序詳解:ServletContext → Context-Param → Listener → Filter → Servlet
標準加載順序 (Servlet 規範) ServletContext:容器啟動,創建唯一上下文對象,全應用共享。 context-param:解析 <c
Java 線程終止正確姿勢:volatile 標誌位 vs interrupt() 機制深度對比
已棄用:Thread.stop() 暴力終止,導致鎖釋放不確定、對象損壞、數據不一致。嚴禁使用。 方案一:volatile boolean 標誌位 (推薦常規
Jedis 連接池深度解析:配置優化、模板封裝、常用數據結構操作全集
連接池構建與核心配置 private static JedisPool jedisPool; public static JedisPool getPool
JSTL 標簽庫與自定義標簽開發入門:核心標簽、EL 表達式、簡單標簽實戰
JSTL 快速啟動 導包:jstl-1.2.jar (含標準實現),Servlet 容器通常已提供 API,需自帶實現包。 引入標簽庫: 核心標
Java 高效構建 0-10MB 測試字串:StringBuilder 最佳實踐
場景 單元測試、效能基準測試、網路協議模擬等需生成指定大小字串/位元組陣列。 推薦做法:StringBuilder StringBuilder sb = ne