18.4 组合多个配置
通常在使用基于Java类的配置时我们可能不是单独使用一个Java类进行配置,有的时候可能会建立多个Java类进行配置,也可能是基于Java类的配置和基于XML的配置一起使用,这就需要我们将多个配置整合在一起了。
18.4.1 多个Java类配置组合
对于多个Java配置类的情况,我们可以通过将@Import标注在对应的配置类上以引入另外一个配置类,这样我们在使用的时候就可以只以其中的某个或某几个配置类来直接作为配置类。如下示例我们在配置类SpringConfig上使用@Import引入了另外两个配置类ServiceConfig和DaoConfig。
@Configuration
@Import({ServiceConfig.class, DaoConfig.class})
public class SpringConfig {
}
那么对应在使用的时候我们可以只显示的使用SpringConfig作为配置类,但实际上是使用了SpringConfig、ServiceConfig和DaoConfig三个配置类,即如下示例中的context将包含这三个配置类中定义的所有的bean。
@ContextConfiguration(classes={SpringConfig.class})
@RunWith(SpringJUnit4ClassRunner.class)
public class ConfigurationTest {
@Autowired
private ApplicationContext context;
}
18.4.2 以Java类配置为主组合XML配置
当以Java配置类为主组合XML配置时我们只需要在Java配置类上使用@ImportResource进行标注以引入对应的XML配置即可。如下示例中我们即通过@ImportResource引入了类路径下的applicationContext.xml,这样我们可以继续使用SpringConfig作为配置类,但其中会包含applicationContext.xml中定义的bean。
@Configuration
@ImportResource({"classpath:applicationContext.xml"})
public class SpringConfig {
@Bean
public Hello hello() {
return new Hello();
}
}
18.4.3 以XML配置为主组合Java类配置
由于@Configuration是标注了@Component的,所以以XML配置为主时,如果我们的XML配置定义了<context:component-scan/>
,且其能扫描到我们使用了@Configuration进行标注的配置类,那么对应的配置类将作为一个bean定义到对应的bean容器中。与此同时,Spring能检测到其中使用@Bean进行标注的方法,并把它们作为一个bean进行定义。其实如果我们的配置类不是使用的@Configuration进行标注的,而是使用的其它Spring会把它当做一个bean进行定义的注解进行标注也是可以的,如@Component、@Service等。
但是当我们在XML配置中没有使用<context:component-scan/>
或者对应的<context:component-scan/>
扫描不到我们基于Java的配置类,这个时候就需要我们自己在XML配置中定义对应的bean了,这样Spring就能自动组合基于Java类配置的bean定义了。
<bean class="com.app.SpringConfig"/>
自己单独在XML配置中定义Java配置类对应的bean时,如果我们的配置类中有使用@Autowired进行自动注入,那就需要启用<context:annotation-config/>
。当然如果使用了<context:component-scan/>
就可以不再单独指定<context:annotation-config/>
了,因为<context:component-scan/>
默认会启用<context:annotation-config/>
。
(注:本文是基于Spring4.1.0所写)