在 Spring 中,這些配置方案都不是互斥的。完全可以將 JavaConfig 的組件掃描和自動裝配/或 XML 配置混合在一起。
Q:如何在 JavaConfig 中引用 XML 配置?
Q:怎么將兩個 JavaConfig 類組合在一起?
1 package soundsystem; 2 3 import org.springframework.context.annotation.Bean; 4 import org.springframework.context.annotation.Configuration; 5 6 @Configuration 7 public class CDConfig { 8 9 @Bean 10 public CompactDisc compactDisc(){ 11 return new SgtPeppers(); 12 } 13 }
1 package soundsystem; 2 3 import org.springframework.context.annotation.Bean; 4 import org.springframework.context.annotation.Configuration; 5 import org.springframework.context.annotation.Import; 6 7 @Configuration 8 @Import(CDConfig.class) 9 public class CDPlayerConfig { 10 11 @Bean 12 public CDPlayer cdPlayer(CompactDisc compactDisc) { 13 return new CDPlayer(compactDisc); 14 } 15 16 }
②、一種更好的方式:創建一個更高級別的 SoundSystemConfig,並在這個類中使用 @Import 將兩個配置類組合在一起。
1 package soundsystem; 2 3 import org.springframework.context.annotation.Configuration; 4 import org.springframework.context.annotation.Import; 5 6 @Configuration 7 @Import({CDPlayerConfig.class, CDConfig.class}) 8 public class SoundSystemConfig { 9 }
Q:該如何讓 Spring 同時加載 通過 XML 來配置的 BlankDisc 和 其他基於 Java 的配置呢?
A:@ImportResource 注解。假定 BlankDisc 定義在名為 cd-config.xml 文件中,該文件位於根類路徑下,那么可以修改 SoundSystemConfig ,讓它使用 @ImportResource 注解。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:c="http://www.springframework.org/schema/c" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 6 7 <bean id="compactDisc" 8 class="soundsystem.BlankDisc" 9 c:_0="titleValue" 10 c:_1="artist"> 11 <constructor-arg> 12 <list> 13 <value>tracks01</value> 14 <value>tracks02</value> 15 <value>tracks03</value> 16 </list> 17 </constructor-arg> 18 </bean> 19 </beans>
Q:如何在 XML 配置中引用 JavaConfig?
A:在 JavaConfig 配置中,展示了如何使用 @Import 和 @ImportResource 來拆分 JavaConfig 類。
在 XML 中,我們使用 import 元素來拆分 XML 配置。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:c="http://www.springframework.org/schema/c" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 6 7 <!-- 8 我們將 BlankDisc 配置在 JavaConfig中,CDPlayer 繼續配置在 XML 中 9 這時,<import>元素只能導入其他的 XML 配置文件,為了將 JavaConfig 類導入到 XML 配置中,我們使用 <bean> 元素。 10 --> 11 <bean class="soundsystem.CDConfig"/> 12 13 <bean id="cdPlayer" 14 class="soundsystem.CDPlayer" 15 c:compactDisc-ref="compactDisc"/> 16 </beans>
我們也可以創建一個更高層次的配置文件,這個文件不聲明任何的bean,只是負責將兩個或者更多的配置組合起來。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:c="http://www.springframework.org/schema/c" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 6 7 <bean class="soundsystem.CDConfig"/> 8 9 <import resource="cdplayer-config.xml"/> 10 11 </beans>
不管使用 JavaConfig 還是使用 XML 進行裝配,我通常都會創建一個根配置,這個配置會將兩個或更多的裝配類和/或 XML 文件組合起來。
我也會在根配置中啟用組件掃描(通過 context:component-scan 元素 或 @ComponentScan)。