在JavaConfig中引用XML配置
存在使用JavaConfig配置的bean类
@Configuration
public class CDPlayerConfig {
@Bean
public CompactDisc sgtPeppers(){
return new SgtPeppers();
}
@Bean
public CDPlayer cdplayer(CompactDisc cd){
return new CDPlayer(cd);
}
}
如果两个bean在一个配置类中多了,将其中一个CompactDisc的Bean创建使用另一个配置类
-- CompactDisc Bean
@Configuration
public class CDConfig {
@Bean
public CompactDisc sgtPeppers(){
return new SgtPeppers();
}
}
在原来的配置类中引入,上面这个配置类
-- CDPlayer Bean
@Configuration
@Import(value={CDConfig.class})
public class CDPlayerConfig {
@Bean
public CDPlayer cdplayer(CompactDisc cd){
return new CDPlayer(cd);
}
}
或者,将两个bean类都分离开来,最后在一个更高级的配置类中引入
@Configuration
@Import(value={CDConfig.class,CDPlayerConfig.class})
public class SoundSystemConfig {
}
假设,我们需要将CompactDisc的bean的创建配置到xml中,如下:
<bean id="compactDisc" class="com.erong.service.SgtPeppers">
<property name="title" value="Sgt.Pepper's Hearts Club Band "></property>
<property name="artist" value="The Beatles"></property>
<property name="list">
<list>
<value>1</value>
<value>1</value>
<value>1</value>
<value>1</value>
</list>
</property>
</bean>
,那么在SoundSystemConfig中配置为
@Configuration
@Import(value={CDPlayerConfig.class})
@ImportResource(locations = "classpath:beans.xml")
public class SoundSystemConfig {
}
,两个Bean,定义在JavaConfig和Xml中的Bean最后都会加载到Spring容器中,最后整合Junit测试下:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={SoundSystemConfig.class})
public class Mytest {
@Autowired
private CDPlayer cdplayer;
@Test
public void run(){
cdplayer.play();
}
public static void main(String[] args) {
/*ClassPathXmlApplicationContext xf = new ClassPathXmlApplicationContext("beans.xml");
CDPlayer te = (CDPlayer)xf.getBean("cdplayer");
te.play();*/
}
}
在XML配置中引用JavaConfig
在JavaConfig配置中,我们已经展现了如何使用@Import和@ImportResource来拆分JavaConfig类,
在XML中,可以使用import元素来拆分XML配置
1. 首先明确,CDConfig配置类,定义了CompactDiscBean
2. 在xml中定义CDPlayer的Bean,并引用CompactDisc的Bean如下
<!-- 引入JavaConfig中配置类 -->
<bean class="com.erong.service.CDConfig"></bean>
<!-- 创建bean,并引用JavaConfig中的Bean -->
<bean id="cdplayer" class="com.erong.service.CDPlayer">
<property name="cd" ref="sgtPeppers"></property>
</bean>
这样的结果就是,bean元素引入的是JavaConfig的Bean,XML中定义另一个Bean
当然,可以将XML中定义的Bean写在另一个xml并引入,在root的xml中一般会再加载扫描包和注解元素
<!-- spring基于注解的配置 -->
<context:annotation-config/>
<!-- 加上组件扫描的配置 -->
<context:component-scan base-package="com"></context:component-scan>
<!-- 引入JavaConfig中配置类 -->
<bean class="com.erong.service.CDConfig"></bean>
<!-- 引入xml定义bean的xml文件 -->
<import resource="bean-config.xml"/>
,最后,也整合Junit进行测试@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:beans.xml")
public class Mytest {
@Autowired
private CDPlayer cdplayer;
@Test
public void run(){
cdplayer.play();
}
public static void main(String[] args) {
/*ClassPathXmlApplicationContext xf = new ClassPathXmlApplicationContext("beans.xml");
CDPlayer te = (CDPlayer)xf.getBean("cdplayer");
te.play();*/
}
}
最后,总结下Spring装载Bean的三种方式,Spring的核心是Spring容器
1. 自动装配,@Component和扫描包的元素完成Bean的创建,@AutoWire,@Inject完成注入
2. JavaConfig ,@Configuration完成配置类,配置类里面@Bean来定义Bean
3. XML里面Bean的创建,直接使用Bean元素引入