在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元素引入