項目啟動時控制台疯狂輸出:
Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
... (無限循環)
**關鍵特徵**:僅在 Spring 整合 MyBatis 時發生,純 MyBatis 不會出現。
emplo)當 SqlSessionFactoryBean 初始化失敗時,Spring 的 Bean 創建流程會捕獲異常並嘗試重試/繼續,觸發 MyBatis 重新初始化日誌適配器,形成死循環。
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactoryautowireByType 方法 (~第 1200 行)catch (BeansException ex) 塊:catch (BeansException ex) {
throw new UnsatisfiedDependencyException(mbd.getResourceDescription(), beanName, propertyName, ex);
// ↑ 在這行打斷點 (Throw 彈出時自動暫停)
}
ex 異常詳情org.springframework.core.NestedIOException:
Failed to parse mapping resource: 'file [.../EmployeeMapper.xml]'
nested exception is org.apache.ibatis.builder.BuilderException:
Error creating document instance.
Cause: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
EmployeeMapper.xml 第 1 行第 1 列有非法內容org.springframework.beans.factory.support.AbstractBeanFactorygetTypeForFactoryBean 方法catch (BeanCreationException ex):catch (BeanCreationException ex) {
if (logger.isDebugEnabled()) {
logger.debug("Ignoring bean creation exception on FactoryBean type check: " + ex);
}
onSuppressedException(ex); // 這裡吞了異常!
return null;
}
onSuppressedException(ex) 或 return null 打斷點打開報錯的 EmployeeMapper.xml,發現文件開頭多出 emplo 字符:
emplo<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper ...>
...
**原因不明** (可能誤粘貼、編碼轉換殘留、IDE 緩存)。刪除雜質字符,保存,重啟 → **問題解決**。
Spring 在 AbstractBeanFactory.getTypeForFactoryBean 中捕獲 BeanCreationException 後,僅打印 Debug 日誌並調用 onSuppressedException 吞噬異常,隨後返回 null 導致上層邏輯誤以為 Bean 類型未知,繼續嘗試初始化,觸發 MyBatis 重複初始化日誌適配器。
<?xml ...?>,前無任何字符log4j.logger.org.springframework=WARN 減少干擾,但**不解決根本問題**xml-maven-plugin 驗證 XML 格式,提前發現**「Logging initialized 無限打印 = Mapper XML 解析失敗 + Spring 異常吞噬重試」**。**核心解決路徑**:斷點 AbstractAutowireCapableBeanFactory.autowireByType 的 catch 塊 → 直接看到真實異常 → 定位具體 XML → 修復語法/編碼/隱形字符。此法百試百靈,比盲目排查配置文件高效百倍。