註解配置相對於XML 配置具有許多的優勢:
它可以充分利用Java 的反射機制來獲取類別結構信息,這些信息可以有效減少配置的工作。如使用JPA 註解配置ORM 映射時,我們就不需要指定PO 的屬性名、類型等信息,如果關係表字段和PO 屬性名、類型都一致,您甚至無需編寫任務屬性映射信息――因為這些信息都可以透過Java 反射機制來取得。
註解和Java 程式碼位於一個檔案中,而XML 配置採用獨立的設定文件,大多數設定資訊在程式開發完成後都不會調整,如果設定資訊和Java 程式碼放在一起,有助於增強程式的內聚性。而採用獨立的XML 設定文件,程式設計師在編寫一個功能時,往往需要在程式檔案和設定檔中不停切換,這種思維上的不連貫會降低開發效率。
因此在許多情況下,註解配置比XML 配置更受歡迎,註解配置有進一步流行的趨勢。 Spring 2.5 的一大增強就是引入了許多註解類,現在您已經可以使用註解配置完成大部分XML 配置的功能。
註解配置和XML 配置的適用場合
是否有了這些IOC 註釋,我們就可以完全摒除原來XML 配置的方式呢?答案是否定的。有以下幾點原因:
註解配置不一定在先天上優於XML 配置。如果Bean 的依賴關係是固定的,(如Service 使用了哪幾個DAO 類別),這種配置資訊不會在部署時發生調整,那麼註解配置優於XML 配置;反之如果這種依賴關係會在部署時發生調整,XML 配置顯然又優於註解配置,因為註解是Java 原始碼的調整,您需要重新改寫原始程式碼並重新編譯才能實作調整。
如果Bean 不是自己寫的類別(如JdbcTemplate、SessionFactoryBean 等),註解配置將無法實施,此時XML 配置是唯一可用的方式。
註解配置往往是類別層級的,而XML 配置則可以表現得更靈活。例如相較於@Transaction 事務註釋,使用aop/tx 命名空間的事務配置更加靈活簡單。
所以在實作應用中,我們往往需要同時使用註解配置和XML 配置,對於類別層級且不會發生變動的配置可以優先考慮註解配置;而對於那些第三方類別以及容易發生調整的配置則應優先考慮使用XML 配置。 Spring 會在具體實作Bean 建立和Bean 注入之前將這兩種配置方式的元資訊融合在一起。
小結
Spring 在2.1 以後對註解配置提供了強力的支持,註解配置功能成為Spring 2.5 的最大的亮點之一。合理地使用Spring 2.5 的註解配置,可以有效減少配置的工作量,提高程式的內聚性。但這並不意味著傳統XML 配置將走向消亡,在第三方類Bean 的配置,以及那些諸如資料來源、快取池、持久層操作模板類別、交易管理等內容的配置上,XML 配置仍然擁有不可替代的地位。