天天看点

《Spring实战(第4版)》——2.5 导入和混合配置

本节书摘来自异步社区《spring实战(第4版)》一书中的第2章,第2.5节,作者: 【美】craig walls(沃尔斯)著,更多章节内容可以访问云栖社区“异步社区”公众号查看

在典型的spring应用中,我们可能会同时使用自动化和显式配置。即便你更喜欢通过javaconfig实现显式配置,但有的时候xml却是最佳的方案。

幸好在spring中,这些配置方案都不是互斥的。你尽可以将javaconfig的组件扫描和自动装配和/或xml配置混合在一起。实际上,就像在2.2.1小节中所看到的,我们至少需要有一点显式配置来启用组件扫描和自动装配。

关于混合配置,第一件需要了解的事情就是在自动装配时,它并不在意要装配的bean来自哪里。自动装配的时候会考虑到spring容器中所有的bean,不管它是在javaconfig或xml中声明的还是通过组件扫描获取到的。

你可能会想在显式配置时,比如在xml配置和java配置中该如何引用bean呢。让我们先看一下如何在javaconfig中引用xml配置的bean。

2.5.1 在javaconfig中引用xml配置

现在,我们临时假设cdplayerconfig已经变得有些笨重,我们想要将其进行拆分。当然,它目前只定义了两个bean,远远称不上复杂的spring配置。不过,我们假设两个bean就已经太多了。

我们所能实现的一种方案就是将blankdisc从cdplayerconfig拆分出来,定义到它自己的cdconfig类中,如下所示:

《Spring实战(第4版)》——2.5 导入和混合配置

compactdisc()方法已经从cdplayerconfig中移除掉了,我们需要有一种方式将这两个类组合在一起。一种方法就是在cdplayerconfig中使用@import注解导入cdconfig:

《Spring实战(第4版)》——2.5 导入和混合配置

或者采用一个更好的办法,也就是不在cdplayerconfig中使用@import,而是创建一个更高级别的soundsystemconfig,在这个类中使用@import将两个配置类组合在一起:

《Spring实战(第4版)》——2.5 导入和混合配置

不管采用哪种方式,我们都将cdplayer的配置与blankdisc的配置分开了。现在,我们假设(基于某些原因)希望通过xml来配置blankdisc,如下所示:

《Spring实战(第4版)》——2.5 导入和混合配置

现在blankdisc配置在了xml之中,我们该如何让spring同时加载它和其他基于java的配置呢?

答案是@importresource注解,假设blankdisc定义在名为cd-config.xml的文件中,该文件位于根类路径下,那么可以修改soundsystemconfig,让它使用@importresource注解,如下所示:

《Spring实战(第4版)》——2.5 导入和混合配置

两个bean——配置在javaconfig中的cdplayer以及配置在xml中blankdisc——都会被加载到spring容器之中。因为cdplayer中带有@bean注解的方法接受一个compactdisc作为参数,因此blankdisc将会装配进来,此时与它是通过xml配置的没有任何关系。

让我们继续这个练习,但是这一次,我们需要在xml中引用javaconfig声明的bean。

2.5.2 在xml配置中引用javaconfig

假设你正在使用spring基于xml的配置并且你已经意识到xml逐渐变得无法控制。像前面一样,我们正在处理的是两个bean,但事情实际上会变得更加糟糕。在被无数的尖括号淹没之前,我们决定将xml配置文件进行拆分。

在javaconfig配置中,我们已经展现了如何使用@import和@importresource来拆分javaconfig类。在xml中,我们可以使用import元素来拆分xml配置。

比如,假设希望将blankdisc bean拆分到自己的配置文件中,该文件名为cd-config.xml,这与我们之前使用@importresource是一样的。我们可以在xml配置文件中使用元素来引用该文件:

《Spring实战(第4版)》——2.5 导入和混合配置

现在,我们假设不再将blankdisc配置在xml之中,而是将其配置在javaconfig中,cdplayer则继续配置在xml中。基于xml的配置该如何引用一个javaconfig类呢?

事实上,答案并不那么直观。元素只能导入其他的xml配置文件,并没有xml元素能够导入javaconfig类。

但是,有一个你已经熟知的元素能够用来将java配置导入到xml配置中:元素。为了将javaconfig类导入到xml配置中,我们可以这样声明bean:

《Spring实战(第4版)》——2.5 导入和混合配置

采用这样的方式,两种配置——其中一个使用xml描述,另一个使用java描述——被组合在了一起。类似地,你可能还希望创建一个更高层次的配置文件,这个文件不声明任何的bean,只是负责将两个或更多的配置组合起来。例如,你可以将cdconfig bean从之前的xml文件中移除掉,而是使用第三个配置文件将这两个组合在一起:

《Spring实战(第4版)》——2.5 导入和混合配置

不管使用javaconfig还是使用xml进行装配,我通常都会创建一个根配置(root configuration),也就是这里展现的这样,这个配置会将两个或更多的装配类和/或xml文件组合起来。我也会在根配置中启用组件扫描(通过或@componentscan)。你会在本书的很多例子中看到这种技术。