《Spring實戰(第4版)》——2.5 導入和混合配置
本節書摘來自異步社區《Spring實戰(第4版)》一書中的第2章,第2.5節,作者: 【美】Craig Walls(沃爾斯)著,更多章節內容可以訪問雲棲社區“異步社區”公眾號查看
2.5 導入和混合配置
在典型的Spring應用中,我們可能會同時使用自動化和顯式配置。即便你更喜歡通過JavaConfig實現顯式配置,但有的時候XML卻是最佳的方案。
幸好在Spring中,這些配置方案都不是互斥的。你盡可以將JavaConfig的組件掃描和自動裝配和/或XML配置混合在一起。實際上,就像在2.2.1小節中所看到的,我們至少需要有一點顯式配置來啟用組件掃描和自動裝配。
關於混合配置,第一件需要了解的事情就是在自動裝配時,它並不在意要裝配的bean來自哪裏。自動裝配的時候會考慮到Spring容器中所有的bean,不管它是在JavaConfig或XML中聲明的還是通過組件掃描獲取到的。
你可能會想在顯式配置時,比如在XML配置和Java配置中該如何引用bean呢。讓我們先看一下如何在JavaConfig中引用XML配置的bean。
2.5.1 在JavaConfig中引用XML配置
現在,我們臨時假設CDPlayerConfig已經變得有些笨重,我們想要將其進行拆分。當然,它目前隻定義了兩個bean,遠遠稱不上複雜的Spring配置。不過,我們假設兩個bean就已經太多了。
我們所能實現的一種方案就是將BlankDisc從CDPlayerConfig拆分出來,定義到它自己的CDConfig類中,如下所示:
compactDisc()方法已經從CDPlayerConfig中移除掉了,我們需要有一種方式將這兩個類組合在一起。一種方法就是在CDPlayerConfig中使用@Import注解導入CDConfig:
或者采用一個更好的辦法,也就是不在CDPlayerConfig中使用@Import,而是創建一個更高級別的SoundSystemConfig,在這個類中使用@Import將兩個配置類組合在一起:
不管采用哪種方式,我們都將CDPlayer的配置與BlankDisc的配置分開了。現在,我們假設(基於某些原因)希望通過XML來配置BlankDisc,如下所示:
現在BlankDisc配置在了XML之中,我們該如何讓Spring同時加載它和其他基於Java的配置呢?
答案是@ImportResource注解,假設BlankDisc定義在名為cd-config.xml的文件中,該文件位於根類路徑下,那麼可以修改SoundSystemConfig,讓它使用@ImportResource注解,如下所示:
兩個bean——配置在JavaConfig中的CDPlayer以及配置在XML中BlankDisc——都會被加載到Spring容器之中。因為CDPlayer中帶有@Bean注解的方法接受一個CompactDisc作為參數,因此BlankDisc將會裝配進來,此時與它是通過XML配置的沒有任何關係。
讓我們繼續這個練習,但是這一次,我們需要在XML中引用JavaConfig聲明的bean。
2.5.2 在XML配置中引用JavaConfig
假設你正在使用Spring基於XML的配置並且你已經意識到XML逐漸變得無法控製。像前麵一樣,我們正在處理的是兩個bean,但事情實際上會變得更加糟糕。在被無數的尖括號淹沒之前,我們決定將XML配置文件進行拆分。
在JavaConfig配置中,我們已經展現了如何使用@Import和@ImportResource來拆分JavaConfig類。在XML中,我們可以使用import元素來拆分XML配置。
比如,假設希望將BlankDisc bean拆分到自己的配置文件中,該文件名為cd-config.xml,這與我們之前使用@ImportResource是一樣的。我們可以在XML配置文件中使用元素來引用該文件:
現在,我們假設不再將BlankDisc配置在XML之中,而是將其配置在JavaConfig中,CDPlayer則繼續配置在XML中。基於XML的配置該如何引用一個JavaConfig類呢?
事實上,答案並不那麼直觀。元素隻能導入其他的XML配置文件,並沒有XML元素能夠導入JavaConfig類。
但是,有一個你已經熟知的元素能夠用來將Java配置導入到XML配置中:元素。為了將JavaConfig類導入到XML配置中,我們可以這樣聲明bean:
采用這樣的方式,兩種配置——其中一個使用XML描述,另一個使用Java描述——被組合在了一起。類似地,你可能還希望創建一個更高層次的配置文件,這個文件不聲明任何的bean,隻是負責將兩個或更多的配置組合起來。例如,你可以將CDConfig bean從之前的XML文件中移除掉,而是使用第三個配置文件將這兩個組合在一起:
不管使用JavaConfig還是使用XML進行裝配,我通常都會創建一個根配置(root configuration),也就是這裏展現的這樣,這個配置會將兩個或更多的裝配類和/或XML文件組合起來。我也會在根配置中啟用組件掃描(通過context:component-scan或@ComponentScan)。你會在本書的很多例子中看到這種技術。
最後更新:2017-05-31 11:05:12