2.5.2 在 XML 配置中引用 JavaConfig

假设你正在使用 Spring 基于 XML 的配置并且你已经意识到 XML 逐渐变得无法控制。像前面一样,我们正在处理的是两个 bean,但事情实际上会变得更加糟糕。在被无数的尖括号淹没之前,我们决定将 XML 配置文件进行拆分。

在 JavaConfig 配置中,我们已经展现了如何使用 @Import 和 @ImportResource 来拆分 JavaConfig 类。在 XML 中,我们可以使 用 import 元素来拆分 XML 配置。

比如,假设希望将 BlankDisc bean 拆分到自己的配置文件中,该文件名为 cd-config.xml,这与我们之前使用 @ImportResource 是一样的。我们可以在 XML 配置文件中使用 <import> 元素来引用该文件:

cd-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:c="http://www.springframework.org/schema/c"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans.xsd">
  
  <bean class="soundsystem.CDConfig" />
  
  <bean id="cdPlayer" class="soundsystem.CDPlayer"
        c:cd-ref="compactDisc" />
        
</beans>

现在,我们假设不再将 BlankDisc 配置在 XML 之中,而是将其配置在 JavaConfig 中,CDPlayer 则继续配置在 XML 中。基于 XML 的配置该如何引用一个 JavaConfig 类呢?

事实上,答案并不那么直观。<import> 元素只能导入其他的 XML 配置文件,并没有 XML 元素能够导入 JavaConfig 类。

但是,有一个你已经熟知的元素能够用来将 Java 配置导入到 XML 配置中:<bean> 元素。为了将 JavaConfig 类导入到 XML 配置中,我们可 以这样声明 bean:

cd-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:c="http://www.springframework.org/schema/c"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans.xsd">
  
  <bean class="soundsystem.CDConfig" />
  
  <bean id="cdPlayer" class="soundsystem.CDPlayer"
        c:cd-ref="compactDisc" />
        
</beans>

采用这样的方式,两种配置 —— 其中一个使用 XML 描述,另一个使用 Java 描述 —— 被组合在了一起。类似地,你可能还希望创建一个更高层次的配置文件,这个文件不声明任何的 bean,只是负责将两个或更多的配置组合起来。例如,你可以将 CDConfig bean 从之前的 XML 文件中移除掉,而是使用第三个配置文件将这两个组合在一起:

cd-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:c="http://www.springframework.org/schema/c"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans.xsd">
  
  <bean class="soundsystem.CDConfig" />
  
  <import resource="cdplayer-config.xml" />
  
</beans>

不管使用 JavaConfig 还是使用 XML 进行装配,我通常都会创建一个根配置(root configuration),也就是这里展现的这样,这个配置会将两个或更多的装配类或 XML 文件组合起来。我也会在根配置中启用组件扫描(通过 <context:component-scan> 或 @ComponentScan)。你会在本书的很多例子中看到这种技术。

Last updated