现在,我们临时假设 CDPlayerConfig 已经变得有些笨重,我们想要将其进行拆分。当然,它目前只定义了两个 bean,远远称不上复杂的 Spring 配置。不过,我们假设两个 bean 就已经太多了。
我们所能实现的一种方案就是将 BlankDisc 从 CDPlayerConfig 拆分出来,定义到它自己的 CDConfig 类中,如下所示:
Copy package soundsystem ;
import org . springframework . context . annotation . Bean ;
import org . springframework . context . annotation . Configuration ;
@ Configuration
public class CDPlayerConfig {
@ Bean
public CompactDisc compactDisc () {
return new SgtPeppers() ;
}
}
compactDisc() 方法已经从 CDPlayerConfig 中移除掉了,我们需要有一种方式将这两个类组合在一起。一种方法就是在 CDPlayerConfig 中使用 @Import 注解导入 CDConfig:
Copy package soundsystem ;
import org . springframework . context . annotation . Bean ;
import org . springframework . context . annotation . Configuration ;
import org . springframework . context . annotation . Import ;
@ Configuration
@ Import ( CDConfig . class )
public class CDPlayerConfig {
@ Bean
public CDPlayer cdPlayer ( CompactDisc compactDisc) {
return new CDPlayer(compactDisc) ;
}
}
或者采用一个更好的办法,也就是不在 CDPlayerConfig 中使用 @Import,而是创建一个更高级别的 SoundSystemConfig,在这个类中使用 @Import 将两个配置类组合在一起:
Copy package soundsystem ;
import org . springframework . context . annotation . Configuration ;
import org . springframework . context . annotation . Import ;
@ Configuration
@ Import ({ CDPlayerConfig . class , CDConfig . class })
public class CDPlayerConfig {
}
不管采用哪种方式,我们都将 CDPlaye r的配置与 BlankDisc 的配置分开了。现在,我们假设(基于某些原因)希望通过 XML 来配置 BlankDisc,如下所示:
Copy <bean id="compactDisc" class="soundsystem.BlankDisc"
c:_0="Sgt. Pepper's Lonely Hearts Club Band"
c:_1="The Beatles" >
<constructor-arg>
<list>
<value>Sgt. Pepper's Lonely Hearts Club Band</value>
<value>With a Little Help from My Friends</value>
<value>Lucy in the Sky with Diamonds</value>
<value>Getting Better</value>
<value>Fixing a Hole</value>
<!-- ...other tracks omitted for brevity... -->
</list>
</constructor-arg>
</bean>
现在 BlankDisc 配置在了 XML 之中,我们该如何让 Spring 同时加载它和其他基于 Java 的配置呢?
答案是 @ImportResource 注解,假设 BlankDisc 定义在名为 cdconfig. xml 的文件中,该文件位于根类路径下,那么可以修改 SoundSystemConfig,让它使用 @ImportResource 注解,如 下所示:
Copy package soundsystem ;
import org . springframework . context . annotation . Configuration ;
import org . springframework . context . annotation . Import ;
import org . springframework . context . annotation . ImportResource ;
@ Configuration
@ Import ( CDPlayerConfig . class )
@ ImportResource ( "classpath:" )
public class SoundSystemConfig {
}
两个 bean —— 配置在 JavaConfig 中的 CDPlayer 以及配置在 XML 中 BlankDisc —— 都会被加载到 Spring 容器之中。因为 CDPlayer 中带有 @Bean 注解的方法接受一个 CompactDisc 作为参数,因此 BlankDisc 将会装配进来,此时与它是通过 XML 配置的没有任何 关系。
让我们继续这个练习,但是这一次,我们需要在 XML 中引用 JavaConfig 声明的 bean。