Spring 框架作為 Java 企業級開發的基石,其學習曲線雖平緩但細節繁多。本文整理了初學者最常遇到的十大問題,涵蓋學習資源、配置陷阱、事務管理、模組化部署等核心主題,提供實戰導向的解決方案與最佳實踐指引。
建議採取「官方文件 + 經典專案 + 社群互動」三位一體策略:
MVC-step-by-step 與 sample 目錄是最權威的入門教材現象:控制台輸出 log4j:WARN Please initialize the log4j system properly
根因:log4j.properties 未置於 Classpath
解決方案:將配置檔放入 src 目錄(Eclipse 編譯後自動複製至 bin)或直接置於 bin 目錄
# 標準配置範例
log4j.rootLogger=DEBUG,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %5p (%F:%L) - %m%n
核心原因:缺少必要 JAR 檔
Spring + Hibernate 典型依賴:
下載建議:優先選擇 spring-framework-1.1.3-with-dependencies.zip,包含完整第三方依賴庫
兩大常見原因:
applicationContext-hibernate.xml 中映射路徑缺少套件前綴<!-- 錯誤寫法 -->
<value>User.hbm.xml</value>
<!-- 正確寫法:包含完整套件路徑 -->
<value>com/yz/spring/domain/User.hbm.xml</value>
錯誤本質:XML 中 property name 與 Bean 的 Setter 方法不匹配
對應規則:property name="postDAO" 對應 setPostDAO(),區分大小寫
<!-- Bean 定義 -->
public class PostManageImpl {
private PostDAO dao;
public void setPostDAO(PostDAO postDAO) { this.dao = postDAO; }
}
<!-- 正確配置 -->
<property name="postDAO"><ref bean="postDAO"/></property>
<!-- 錯誤配置 -->
<property name="dao"><ref bean="postDAO"/></property>
前置條件:MySQL 必須使用 InnoDB 引擎
架構原則:事務邊界應劃分在商業邏輯層(Service Layer),而非 DAO 層
<!-- 事務代理範本 -->
<bean id="txProxyTemplate" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- 具體業務 Bean 繼承範本 -->
<bean id="userManage" parent="txProxyTemplate">
<property name="target">
<bean class="com.yz.spring.service.implement.UserManageImpl">
<property name="userDAO"><ref bean="userDAO"/></property>
</bean>
</property>
</bean>
隨著 Bean 數量增長,單一 applicationContext.xml 維護困難。建議按層級拆分:
applicationContext-hibernate.xml:DAO 層、SessionFactory、DataSourceapplicationContext-service.xml:Service 層、事務代理、業務邏輯 Bean// 啟動時同時載入多配置檔
String[] paths = {
"com/yz/spring/dao/hibernate/applicationContext-hibernate.xml",
"com/yz/spring/service/applicationContext-service.xml"
};
ApplicationContext ctx = new ClassPathXmlApplicationContext(paths);
在 web.xml 中配置 ContextLoaderServlet(或現代版本的 ContextLoaderListener):
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-hibernate.xml</param-value>
<param-value>/WEB-INF/applicationContext-service.xml</param-value>
</context-param>
同樣在 web.xml 中指定配置檔位置:
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
入門後建議深入研讀 Rod Johnson 兩大經典巨著:
必讀經典論文:Martin Fowler 的 Inversion of Control Containers and the Dependency Injection Pattern
官方文件:Spring 中文參考手冊(部分翻譯)
核心心法:多實戰、多閱讀源碼、多思考設計模式應用
Spring 學習的關鍵在於理解「控制反轉」與「依賴注入」的本質,掌握配置檔與 Java 程式碼的對應關係,並建立系統性的除錯思維。上述十大問題涵蓋了從環境搭建到核心功能應用的完整鏈路,掌握這些將讓你跨越新手期,進入 Spring 開發的高效區。