您的位置:首页 > 编程语言 > Java开发

自动装配、JavaConfig、XML 三种方案之间,怎么导入和混合配置?

2017-07-24 21:57 465 查看
在 Spring 中,这些配置方案都不是互斥的。完全可以将 JavaConfig 的组件扫描自动装配/或 XML 配置混合在一起。

Q:如何在 JavaConfig 中引用 XML 配置?

Q:怎么将两个 JavaConfig 类组合在一起?

A:①、使用 @Import 注解导入

package soundsystem;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CDConfig {

@Bean
public CompactDisc compactDisc(){
return  new SgtPeppers();
}
}


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);
}

}


②、一种更好的方式:创建一个更高级别的 SoundSystemConfig,并在这个类中使用 @Import 将两个配置类组合在一起

package soundsystem;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import({CDPlayerConfig.class, CDConfig.class})
public class SoundSystemConfig {
}


Q:该如何让 Spring 同时加载 通过 XML 来配置的 BlankDisc 和 其他基于 Java 的配置呢?

A:@ImportResource 注解。假定 BlankDisc 定义在名为 cd-config.xml 文件中,该文件位于根类路径下,那么可以修改 SoundSystemConfig ,让它使用 @ImportResource 注解。

BlankDisc.java 的定义请参考前一篇。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLoc
d5c7
ation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 
<bean id="compactDisc"
class="soundsystem.BlankDisc"
c:_0="titleValue"
c:_1="artist">
<constructor-arg>
<list>
<value>tracks01</value>
<value>tracks02</value>
<value>tracks03</value>
</list>
</constructor-arg>
</bean>

</beans>


package soundsystem;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;

/**
* 两个 bean —— ①、配置在 JavaConfig 中的 CDOlayer 以及 ②、配置在 XML 中的 BlankDisc
* 都会被加载到 Spring 容器中。因为 CDCPlayer 中带有 @Bean 注解的方法接受一个 CompactDisc 作为参数,
* 因此 BlankDisc 将会装配起来,此时与它是通过 XML 配置的没有任何关系。
*/
@Configuration
@Import({CDPlayerConfig.class)
@ImportResource("classpath:cd-config.xml")
public class SoundSystemConfig {
}


Q:如何在 XML 配置中引用 JavaConfig?

A:在 JavaConfig 配置中,展示了如何使用 @Import 和 @ImportResource 来拆分 JavaConfig 类。

在 XML 中,我们使用 import 元素来拆分 XML 配置。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 
<!--
我们将 BlankDisc 配置在 JavaConfig中,CDPlayer 继续配置在 XML 中
这时,<import>元素只能导入其他的 XML 配置文件,为了将 JavaConfig 类导入到 XML 配置中,我们使用 <bean> 元素。
-->
<bean class="soundsystem.CDConfig"/>

<bean id="cdPlayer"
class="soundsystem.CDPlayer"
c:compactDisc-ref="compactDisc"/>

</beans>


我们也可以创建一个更高层次的配置文件,这个文件不声明任何的bean,只是负责将两个或者更多的配置组合起来。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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 进行装配,我通常都会创建一个根配置,这个配置会将两个或更多的装配类和/或 XML 文件组合起来

我也会在根配置中启用组件扫描(通过 context:component-scan 元素 或 @ComponentScan)。

上一篇:Spring 如何通过 XML 装配 bean?

下一篇: 高级装配 —— Spring profile
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: