1. 程式人生 > >Spring之導入和混合配置

Spring之導入和混合配置

很多 方式 另一個 註解 lan .com 以及 自動 裝配

  在典型的Spring應用中,我們可能會同時使用自動化和顯式配置。即便你更喜歡通過JavaConfig實現顯式配置,但有的時候XML卻是最佳的方案。幸好在Spring中,這些配置方案都不是互斥的。你盡可以將JavaConfig的組件掃描和自動裝配和/或XML配置混合在一起。實際上,就像在2.2.1小節中所看到的,我們至少需要有一點顯式配置來啟用組件掃描和自動裝配。關於混合配置,第一件需要了解的事情就是在自動裝配時,它並不在意要裝配的bean來自哪裏。自動裝配的時候會考慮到Spring容器中所有的bean,不管它是在JavaConfig或XML中聲明的還是通過組件掃描獲取到的。你可能會想在顯式配置時,比如在XML配置和Java配置中該如何引用bean呢。讓我們先看一下如何在JavaConfig中引用XML配置的bean

1.1在JavaConfig中引用XML配置

現在,我們臨時假設CDPlayerConfig已經變得有些笨重,我們想要將其進行拆分。當然,它目前只定義了兩個bean,遠遠稱不上復雜的Spring配置。不過,我們假設兩個bean就已經太多了創建一個更高級別的SoundSystemConfig,在這個類中使用@Import將兩個配置類組合在一起

技術分享圖片

現在,我們假設(基於某些原因)希望通過XML來配置BlankDisc,如下所示

技術分享圖片

現在BlankDisc配置在了XML之中,我們該如何讓Spring同時加載它和其他基於Java的配置呢?

答案是@ImportResource註解,假設BlankDisc定義在名為cd-config.xml的文件中,該文件位於根類路徑下,那麽可以修改SoundSystemConfig,讓它使用@ImportResource註解,如

下所示:

技術分享圖片

兩個bean——配置在JavaConfig中的CDPlayer以及配置在XML中BlankDisc——都會被加載到Spring容器之中。因為CDPlayer中帶有@Bean註解的方法接受一個CompactDisc作為參數,因此BlankDisc將會裝配進來,此時與它是通過XML配置的沒有任何關系。

1.2在XML配置中引用JavaConfig

  假設你正在使用Spring基於XML的配置並且你已經意識到XML逐漸變得無法控制。像前面一樣,我們正在處理的是兩個bean,但事情實際上會變得更加糟糕。在被無數的尖括號淹沒之前,我們決定將XML配置文件進行拆分。在JavaConfig配置中,我們已經展現了如何使用@Import和@ImportResource來拆分JavaConfig類。在XML中,我們可以使用import元素來拆分XML配置。比如,假設希望將BlankDisc bean拆分到自己的配置文件中,該文件名為cd-config.xml,這與我們之前使用@ImportResource是一樣的。我們可以在XML配置文件中使用<import>元素來引用該文件:

  現在,我們假設不再將BlankDisc配置在XML之中,而是將其配置在JavaConfig中,CDPlayer則繼續配置在XML中。基於XML的配置該如何引用一個JavaConfig類呢?事實上,答案並不那麽直觀。<import>元素只能導入其他的XML配置文件,並沒有XML元素能夠導入JavaConfig類但是,有一個你已經熟知的元素能夠用來將Java配置導入到XML配置中:<bean>元素。為了將JavaConfig類導入到XML配置中,我們可以這樣聲明bean:

技術分享圖片

采用這樣的方式,兩種配置——其中一個使用XML描述,另一個使用Java描述——被組合在了一起。類似地,你可能還希望創建一個更高層次的配置文件,這個文件不聲明任何的bean,只是負責將兩個或更多的配置組合起來。例如,你可以將CDConfig bean從之前的XML文件中移除掉,而是使用第三個配置文件將這兩個組合在一起:

技術分享圖片

不管使用JavaConfig還是使用XML進行裝配,我通常都會創建一個根配置(root configuration),也就是這裏展現的這樣,這個配置會將兩個或更多的裝配類和/或XML文件組合起來。我也會在根配置中啟用組件掃描(通過<context:component-scan>或@ComponentScan)。你會在本書的很多例子中看到這種技術。

Spring之導入和混合配置