Spring 不僅是一個 MVC 框架,其核心競爭力在於 IoC 容器 與 依賴注入 (DI),徹底改變了 Java 企業級應用的組件裝配方式,並提供了無與倫比的數據訪問抽象與類加載隔離方案。
傳統方式:
public class SandwichMaker {
private SandwichFiller filler = new CreamCheeseAndJellyFiller(); // 緊耦合
}
Spring 方式:
<bean id="filler" class="com.sandwiches.CreamCheeseAndJellyFiller">
<property name="creamCheesePortion" value="60"/>
</bean>
<bean id="sandwichMaker" class="com.sandwich.SandwichMaker">
<property name="sandwichFiller" ref="filler"/>
</bean>
核心價值:實現類之間零耦合,配置變更無需重新編譯,支援多環境部署(開發/測試/生產切換數據源只需改 XML)。
@Autowired、@Inject、@Resource 簡化配置Spring 提供 JdbcTemplate、NamedParameterJdbcTemplate、HibernateTemplate 等,封裝資源獲取、異常處理、事務邊界:
public class UserDao extends JdbcDaoSupport {
public void insert(User user) {
getJdbcTemplate().update(
"INSERT INTO users(name, email) VALUES (?, ?)",
user.getName(), user.getEmail());
}
}
將廠商特定的 SQLException 轉換為 Spring 統一的 DataAccessException 體系:
DataIntegrityViolationException:唯一鍵衝突、外鍵違規OptimisticLockingFailureException:樂觀鎖失敗DataAccessResourceFailureException:資源不可用效果:業務代碼捕獲語義化異常,無需關心具體資料庫錯誤碼,實現真正的資料庫無關性。
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="get*" read-only="true"/>
</tx:attributes>
</tx:advice>
配合 AOP 實現非侵入式事務邊界控制,支援 CMT/BMT 無縫切換。
傳統 Java EE 雙親委派模型導致:應用內 Spring 版本與伺服器共享庫版本衝突,ClassCastException、LinkageError 頻發。
<module classloader="parent-first"> <!-- 或 child-first -->
<hidden-classes>
<filter>org.springframework.*</filter>
<filter>org.apache.commons.logging.*</filter>
</hidden-classes>
</module>
原理:聲明隱藏類後,類加載器優先從應用內部加載指定包,忽略父加載器同名類,實現多版本共存:
Spring 的偉大在於「不發明新語法,只做好裝配與抽象」:IoC 解決組件依賴,JDBC 抽象解決數據訪問痛苦,類加載隔離解決部署衝突。這三大支柱構成了 Spring 統治 Java 企業級開發十餘年的根本原因。