2.5.1 在 JavaConfig 中引用 XML 配置

现在,我们临时假设 CDPlayerConfig 已经变得有些笨重,我们想要将其进行拆分。当然,它目前只定义了两个 bean,远远称不上复杂的 Spring 配置。不过,我们假设两个 bean 就已经太多了。

我们所能实现的一种方案就是将 BlankDisc 从 CDPlayerConfig 拆分出来,定义到它自己的 CDConfig 类中,如下所示:

CDPlayerConfig.java
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:

CDPlayerConfig.java
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 将两个配置类组合在一起:

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,如下所示:

cd-config.xml
<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 注解,如 下所示:

SoundSystemConfig.java
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。

Last updated