看了园龄已经两年多了,再不能写完内容直接点击发布,留下一片密密麻麻的文字让别人看的头昏脑涨。所以现在每次写完主要内容后,还需要对于格式稍稍调整下。那么有没有什么编辑模式能够在你写完文章后基本也把格式调的八九不离十,不会辣眼睛呢,当然有, 那就是 Markdown。
本篇就在 Markdown 编辑环境下说说 Spring 的导入和混合配置
上篇提到了关于 Spring 的显示配置方式有两种,一种是基于 XML 配置,一种是基于 JavaConfig 的方式配置。对于这两种配置方式并不是互斥关系,相反,他们两能够相互融合,有效的搭配完成 Spring 的 bean 注入。
这里分别介绍如何在 JavaConfig 中引用 XML 配置的 bean 以及如何在 XML 配置中引用 JavaConfig。
上篇我们看到配置类 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 tracks;
- public BlankDisc(String title, String artist, List 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 配置文件读取到这个配置信息并加载呢。。假设上面关于 BlankDisc 类的配置信息存放在 cd-config.xml 文件中,该文件在项目的根路径下。通过修改 SoundSystemConfig 即可完成加载 bean。
- @Configuration
- @Import(CDPlayerConfig.class)
- @ImportResource("classpath:cd-config.xml")
- public class SoundSystemConfig {
- }
如上所示,一个是通过 JavaConfig 配置的 CDPlayer,一个是通过 XML 声明的 BlankDisc,通过如上处理,实现了都能被 Spring 容器加载。
- <?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());
- }
- }
测试结果
至此,我们领略了
如果您觉得阅读本文对您有帮助,请点一下 "推荐" 按钮,您的 "推荐" 将是我最大的写作动力!如果您想持续关注我的文章,请扫描二维码,关注 JackieZheng 的微信公众号,我会将我的文章推送给您,并和您一起分享我日常阅读过的优质文章。
来源: