Spring 2.0 引入大量註解,@Autowired 成為依賴注入的熱門選擇,但也引發架構師對配置混亂、模組化受損、維護困難、廠商鎖定的擔憂。本文剖析優缺點,給出務實建議。
<!-- 必須註冊後處理器才能啟用 @Autowired -->
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
<bean id="foo" class="lavasoft.springstu.anno.Foo">
<constructor-arg index="0" type="java.lang.String" value="aaaa"/>
</bean>
<bean id="bar" class="lavasoft.springstu.anno.Bar"/> <!-- 隱性依賴 foo -->
public class Bar {
@Autowired(required = true)
private Foo foo; // 編譯期無錯誤,運行期才知缺失
public void f1() { System.out.println(foo.getName()); }
}
XML 中 bar 定義看似獨立,實則強依賴 foo,且構造器注入與欄位注入混用,認知負擔加重。
@Bean 方法或 XML 定義 Bean 時,內部依賴可用註解。@Autowired / @Resource / @Inject (JSR-330) 降低樣板。annotation-config 與 component-scan 時限制掃描範圍,避免誤掃無關類。若預期未來可能遷移:
@Inject + @Named 替代 Spring 專屬註解。@Autowired 非洪水猛獸,但「全註解零 XML」屬於極端實踐。成熟團隊應建立分層配置規範:XML 管架構骨架,註解管葉子節點;代碼評審強制檢視依賴圖,防止隱性耦合腐化架構。工具服務於原則,而非相反。