通过XML装配bean


      

        在 Spring 刚刚出现的时候, XML 是描述配置的主要方式。在 Spring 的名义下,我们创建了无数行XML 代码。在一定程度上, Spring 成为了XML配置的同义词。



 



       

        尽管 Spring 长期以来确实与 XML 有着关联,但现在需要明确的是,XML不再是配置 Spring 的唯一可选方案。 Spring 现在有了强大的自动化配置和基于Java 的配置, XML 不应该再是你的第一选择了。



        不过,鉴于已经存在那么多基于 XML 的 Spring 配置,所以理解如何在Spring中使用 XML 还是很重要的。但是,我希望本节的内容只是用来帮助你维护已有的XML 配置,在完成新的 Spring 工作时,希望你会使用自动化配置和JavaConfig 。



 



创建XML配置规范



 



        在使用 XML 为 Spring 装配 bean 之前,你需要创建一个新的配置规范。在使用JavaConfig 的时候,这意味着要创建一个带



有 @Configuration 注解的类,而在 XML 配置中,这意味着要创建一个XML 文件,并且要以 <beans> 元素为根。



 



最为简单的 Spring 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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans.xsd">



        很容易就能看出来,这个基本的 XML 配置已经比同等功能的JavaConfig类复杂得多了。作为起步,在 JavaConfig 中所需要的只是@Configuration ,但在使用 XML 时,需要在配置文件的顶部声明多个XML 模式( XSD )文件,这些文件定义了配置 Spring 的 XML 元素。



       



        借助 Spring Tool Suite 创建 XML 配置文件创建和管理 Spring XML配置文件的一种简便方式是使用Spring Tool Suite( https://spring.io/tools/sts )。在 Spring Tool Suite 的菜单中,选择File>New>Spring Bean Configuration File ,能够创建 Spring XML配置文件,并且可以选择可用的配置命名空间。



 



        用来装配 bean 的最基本的 XML 元素包含在 spring-beans 模式之中,在上面这个XML 文件中,它被定义为根命名空间 <beans> 是该模式中的一个元素,它是所有Spring 配置文件的根元素。



      



       在 XML 中配置 Spring 时,还有一些其他的模式。更加关注自动化以及基于Java 的配置,当出现其他模式的时候,我至少会提醒你。



 



        就这样,我们已经有了一个合法的Spring XML配置。不过,它也是一个没有任何用处的配置,因为它(还)没有声明任何bean。为了给予它生命力,让我们重新创建一下CD样例,只不过我们这次使用XML配置,而不是使用JavaConfig和自动化装配。



声明一个简单的<bean>



       

        要在基于 XML 的 Spring 配置中声明一个 bean ,我们要使用 spring-beans模式中的另外一个元素: <bean> 。 <bean> 元素类似于JavaConfig中的 @Bean 注解。我们可以按照如下的方式声明CompactDisc bean :



<bean class="soudsystem.SgtPeppers"/>



        这里声明了一个很简单的 bean ,创建这个 bean 的类通过 class 属性来指定的,并且要使用全限定的类名。



 



        因为没有明确给定 ID ,所以这个 bean 将会根据全限定类名来进行命 名。在本例中.bean 的 ID 将会是“ soundsystem.SgtPeppers#0 ” 。其中, “ #0 ” 是一个计数的形式,用来区分相同类型的其他bean 。如果你声明了另外一



个 SgtPeppers ,并且没有明确进行标识,那么它自动得到的 ID 将会是“ soundsystem.SgtPeppers#1 ” 。



 



        尽管自动化的 bean 命名方式非常方便,但如果你要稍后引用它的话, 那自动产生的名字就没有多大的用处了。因此,通常来讲更好的办法是借助id 属性,为每个 bean 设置一个你自己选择的名字:



<bean id="compactDisc" class="soundsystem.SgtPeppers" />



        稍后将这个 bean 装配到 CDPlayer bean 之中的时候,你会用到这个具体的名字。减少繁琐为了减少XML中繁琐的配置,只对那些需要按名字引 用的bean (比如,你需要将对它的引用注入到另外一个 bean 中)进行明确地命名。



 



       第一件需要注意的事情就是你不再需要直接负责创建 SgtPeppers 的实例,在基于JavaConfig 的配置中,我们是需要这样做的。当 Spring 发现这个<bean> 元素时,它将会调用 SgtPeppers 的默认构造器来创 建bean 。在 XML 配置中, bean 的创建显得更加被动,不过,它并没有JavaConfig那样强大,在 JavaConfig 配置方式中,你可以通过任何可以想象到的方法来创建bean 实例。



        另外一个需要注意到的事情就是,在这个简单的 <bean> 声明中,我们将bean 的类型以字符串的形式设置在了 class 属性中。谁能保证设置给class 属性的值是真正的类呢? Spring 的 XML 配置并不能从编译期的类型检查中受益。即便它所引用的是实际的类型,如果你重命名了类,会发生什么呢?



 



       借助 IDE 检查 XML 的合法性使用能够感知 Spring 功能的 IDE ,如 Spring Tool Suite,能够在很大程度上帮助你确保 Spring XML 配置的合法性。



 



       以上介绍的只是 JavaConfig 要优于 XML 配置的部分原因。我建议在为你的应用选择配置风格时,要记住XML 配置的这些缺点。接下来,我们继续Spring XML 配置的学习进程,了解如何将 SgtPeppers bean 注入到CDPlayer 之中。



 



借助构造器注入初始化 bean



 



未完待续。。。。