Spring XML 配置功能強大但易膨脹。本文譯自 OnJava 經典文章,針對大型專案整理 12 項最佳實踐,平衡清晰度與彈性。
<bean id="orderService" class="..." autowire="byName"/> <!-- 不推薦 -->
理由: 犧牲配置清晰度與可維護性。隱性依賴難追蹤,混用手動/自動裝配更添混亂。明確宣告 <property>/<constructor-arg> 才是負責任的做法。
orderServiceDAObilling.orderServiceDAO<!-- 冗長寫法 -->
<bean id="orderService" class="...">
<property name="companyName"><value>lizjason</value></property>
<constructor-arg><ref bean="orderDAO"/></constructor-arg>
</bean>
<!-- 簡潔寫法 -->
<bean id="orderService" class="..." companyName="lizjason" orderDAO-ref="orderDAO"/>
大幅減少 XML 體積,提升可讀性。<ref local="..."> 無簡寫形式。
<!-- 易錯且難讀 -->
<constructor-arg index="0" value="lizjason"/>
<constructor-arg index="1" value="100"/>
<!-- 清楚明確 -->
<constructor-arg type="java.lang.String" value="lizjason"/>
<constructor-arg type="int" value="100"/>
僅在參數型別相同且無法區分時才使用 index。
<bean id="abstractService" abstract="true" class="...">
<property name="companyName" value="lizjason"/>
</bean>
<bean id="shippingService" parent="abstractService" class="..."/>
子 Bean 繼承父 Bean 所有屬性設定,達到 DRY 原則。未指定 class 的 Bean 隱性為抽象。
<!-- web.xml 或主配置 -->
<import resource="billingServices.xml"/>
<import resource="shippingServices.xml"/>
<!-- Java 程式碼更彈性 -->
String[] configs = {"order.xml", "billing.xml", "shipping.xml"};
ApplicationContext ctx = new ClassPathXmlApplicationContext(configs);
Java 方式支援條件載入、環境區分、測試替換,優於 XML <import>。
id 受 XML IDREF 約束 (字母開頭、字母數字底線連字號冒號),可啟用 XML 解析器驗證引用完整性。受限時才用 name。
<bean id="orderService" class="..." dependency-check="objects"/>
simple (基本型別)、objects (物件參考)、all (全部)。確保必要依賴已注入,上線前可關閉。
<beans>
<description>
定義帳務服務相關 beans,依賴 baseServices.xml 提供範本...
</description>
...
</beans>
<description> 可被工具提取生成文件,優於 XML 註解。
XML 也是代碼的一部份。重構 Java 類 (重命名、移動套件、變更建構子) 必須同步修改 XML,並通知團隊成員。建議建立 Code Review 機制檢查配置同步性。
<!-- Constructor Injection -->
<bean id="orderService" class="...">
<constructor-arg ref="orderDAO"/>
</bean>
<!-- Setter Injection (推薦) -->
<bean id="billingService" class="...">
<property name="orderDAO" ref="orderDAO"/>
</bean>
Setter Injection 更靈活:支援選填屬性、循環依賴解決、可讀性更高 (屬性名自述意圖)。Constructor Injection 適合強制依賴、不可變物件。
@Configuration) 可讀性遠勝 XMLXML 配置適用中小專案,大型專案建議漸進式遷移至 Java Config (@Configuration + @Bean) 或 Spring Boot 自動配置。若維持 XML,遵循上述 12 原則可保持配置整潔、可維護。