java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台(即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称。
大家都知道 Spring 的显示配置方式有两种,一种是基于 XML 配置,一种是基于 JavaConfig 的方式配置。那么下这篇文章主要给大家分别介绍如何在 JavaConfig 中引用 XML 配置的 bean 以及如何在 XML 配置中引用 JavaConfig,需要的朋友可以参考下。
前言之前提到了关于 Spring 的显示配置方式有两种,一种是基于 XML 配置,一种是基于 JavaConfig 的方式配置。对于这两种配置方式并不是互斥关系,相反,他们两能够相互融合,有效的搭配完成 Spring 的 bean 注入。
这里分别介绍如何在 JavaConfig 中引用 XML 配置的 bean 以及如何在 XML 配置中引用 JavaConfig。下面话不多说,来一起看看详细的介绍吧。
一、JavaConfig 中引用 XML 配置的 bean上篇我们看到配置类 CDPlayerConfig 具体代码如下
- @Configuration
- public class CDPlayerConfig {
- @Bean
- public CompactDisc compactDisc() {
- return new SgtPeppers();
- }
- @Bean
- public CDPlayer cdPlayer(CompactDisc compactDisc) {
- return new CDPlayer(compactDisc);
- }
- }
在该配置类中注册了两个 bean。假设让 CDPlayerConfig 现在矫情一把,它认为自己内部注册的 bean 太多了,它有点管不过来了(确实有点矫情过了),它准备把 compactDisc 这个 bean 踢出去,让别人来管管。
让谁管呢,这时候我们又新建了另外一个配置类 CDConfig
- @Configuration
- public class CDConfig {
- @Bean
- public CompactDisc compactDisc() {
- return new SgtPeppers();
- }
- }
这个配置类简洁到不行,只有一个 CompactDisc 的 bean。
现在有了这两个配置类,也集齐了两个 bean,那么该如何把他们整合到一起呢,建立起它们的联系。这时候我们新建一个连接类 SoundSystemConfig
- @Configuration
- @Import(CDPlayerConfig.class, CDConfig.class)
- public class SoundSystemConfig {
- }
这样就解决了在一个配置类中要加载的 bean 过多的问题。
那么问题来了,如果这时候 CompactDisc 接口的实现类 BlankDisc 是声明在 XML 中,这两种显示声明又会如何结合呢。
- public class BlankDisc implements CompactDisc {
- private String title;
- private String artist;
- private List < String > tracks;
- public BlankDisc(String title, String artist, List < String > tracks) {
- this.title = title;
- this.artist = artist;
- this.tracks = tracks;
- }
- public void play() {
- System.out.println("Playing " + title + " by " + artist);
- for (String track: tracks) {
- System.out.println("-Track: " + track);
- }
- }
- }
具体该类在 XML 中配置如下
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:c="http://www.springframework.org/schema/c"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
- <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>
- </beans>
注意: 这里的 c:_0 和 c:_1 表示分别要传入到构造函数中的第一个参数和第二个参数的值,写法等价于
- <bean id="compactDisc"
- class="soundsystem.BlankDisc">
- <constructor-arg value="Sgt. Pepper's Lonely Hearts Club Band"/>
- <constructor-arg value="The Beatles">
- </bean>
或者
- <bean id="compactDisc"
- class="soundsystem.BlankDisc"
- c:_title="Sgt. Pepper's Lonely Hearts Club Band"
- c:_artist="The Beatles"/>
现在 BlankDisc 已经配置在 XML 中,那么 Spring 如何去加载这个 XML 配置文件读取到这个配置信息并加载呢。这里我们可以通过一个注解 @ImportResource 来完成这个操作。假设上面关于 BlankDisc 类的配置信息存放在 cd-config.xml 文件中,该文件在项目的根路径下。通过修改 SoundSystemConfig 即可完成加载 bean。
- @Configuration
- @Import(CDPlayerConfig.class)
- @ImportResource("classpath:cd-config.xml")
- public class SoundSystemConfig {
- }
如上所示,一个是通过 JavaConfig 配置的 CDPlayer,一个是通过 XML 声明的 BlankDisc,通过如上处理,实现了都能被 Spring 容器加载。
二、XML 配置中引用 JavaConfigCDPlayerConfig 彻底的矫情了一把,XML 配置文件表示不服,CDPlayerConfig 受不了两个 bean,那我就能受得了?(好好好,朕特批 XML 矫情一次)
其实我们都知道,在 XML 中声明两个 bean 不是什么大问题,即便受不了,我们还有一个这种方案,XML 中也可以使用 Import 标签实现导入其他的 XML 配置文件并导入配置信息,好比这样的
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:c="http://www.springframework.org/schema/c"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
- <import resource="cd-config.xml">
- <bean id="cdPlayer"
- class="soundsystem.CDPlayer"
- c:cd-ref="compactDisc" />
- </beans>
注意: 这里的
等价于添加了属性
- c: cd - ref = "compactDisc"
- <constructor-arg ref="compactDisc"
但是 XML 认为这样它还是受不了,它将
换成了
- <import resource="cd-config.xml">
。这下畅快多了,因为这样就实现了两种配置的结合了,一种是配置在 JavaConfig 中的 BlankDisc,还有一种是在 XML 中配置的 CDPlayer。测试
- <bean class="soundsystem.CDConfig" />
分别对于两种方式编写 ut 测试如下
ImportJavaConfigTest
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration("classpath:cdplayer-config.xml")
- public class ImportJavaConfigTest {
- @Rule
- public final StandardOutputStreamLog log = new StandardOutputStreamLog();
- @Autowired
- private MediaPlayer player;
- @Test
- public void play() {
- player.play();
- assertEquals(
- "Playing Sgt. Pepper's Lonely Hearts Club Band by The Beatles\r\n",
- log.getLog());
- }
- }
ImportXmlConfigTest
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration(classes=SoundSystemConfig.class)
- public class ImportXmlConfigTest {
- @Rule
- public final StandardOutputStreamLog log = new StandardOutputStreamLog();
- @Autowired
- private MediaPlayer player;
- @Test
- public void play() {
- player.play();
- assertEquals(
- "Playing Sgt. Pepper's Lonely Hearts Club Band by The Beatles\r\n" +
- "-Track: Sgt. Pepper's Lonely Hearts Club Band\n\n" +
- "-Track: With a Little Help from My Friends\n\n" +
- "-Track: Lucy in the Sky with Diamonds\n\n" +
- "-Track: Getting Better\n\n" +
- "-Track: Fixing a Hole\n\n",
- log.getLog());
- }
- }
测试结果
至此,我们领略了
•JavaConfig 中引用 XML 配置的 bean
•XML 配置中引用 JavaConfig
这两种显示配置 bean 如何融洽的配合起来。
总结以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对 PHPERZ 的支持。
来源: http://www.phperz.com/article/18/0104/356344.html