资源预览内容
第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
亲,该文档总共5页全部预览完了,如果喜欢就下载吧!
资源描述
spring XML 优化配置 12 招Spring 是一个强大的 Java 应用框架,它广泛地应用于 Java 应用程序中,为Plain Old Java Objects(POJO)提供企业级服务。Spring 利用依赖注入机制来简化工作,同时提高可测试性。其配置文件(通常是 XML 格式)中指定了Spring bean、依赖性以及 bean 所需的服务。但是,这些 XML 配置文件既冗长又不实用。对于需要定义大量 Spring bean 的大型项目来说,它们难以阅读和管理。在本文中,我将向您展示 12 种用于 Spring XML 配置的最佳实践。其中的一些实践与其说是最佳实践,倒不如说是必要实践。注意,其他因素(如域模型的设置)也可能影响 XML 的配置,但是本文重点研究 XML 配置的可读性和可管理性。1。避免使用自动绑定(autowiring)功能Spring 可以通过 bean 类的自省自动绑定依赖性,所以不必显式指明 bean 的属性和构造函数。Bean 属性可以通过属性名称或类型匹配来实现自动绑定。构造函数通过类型匹配来实现自动绑定。甚至可以指定自动检测 autowiring 模式,它可以引导 Spring 选择一种适当的运行机制。先来看看下面的一个例子:OrderService 类的属性名在容器中用于匹配 bean 实例。自动绑定可能会节省一些键入工作量并减少混乱。但是在现实项目中不应该使用这种方式,因为它牺牲了配置的可读性和可维护性。许多指南和介绍中大肆吹捧自动绑定是Spring 的一项极好的特性,而没有提到这一特性所带来的牺牲。依我来看,这就像 Spring 中的对象池(objectpooling),更大程度上只是宣传的噱头。对于精简 XML 配置文件来说,它是一个好办法,但它实际上增加了复杂性,尤其是在运行包含大量类声明的项目时。虽然 Spring 允许混合使用自动绑定和显式绑定,但这会使 XML 配置更加晦涩难懂。2.使用命名约定该原则对于 Java 编码也一样适用。在项目中使用清晰的、描述性的、一致的命名约定将非常有利于开发人员理解 XML 配置。例如,对于 bean ID,可以按照 Java 类字段名约定来命名它。OrderServiceDAO 实例的 bean ID 应该命名为orderServiceDAO。对于大型项目,可以在 bean ID 前面加上包名作为前缀。3. 使用简洁形式简洁形式避免了冗长,因为它将属性值和引用从子元素中移入属性中。例如下面的例子:lizjason 可以使用简洁形式将上述代码重写为:简洁形式自 1.2 版本起就可以使用。注意,对于,没有简洁形式。简洁形式不但可以节约键入工作量,而且可以使 XML 配置文件更清晰。当一个配置文件中定义了大量的类时,它可以显著提高可读性。4. 对于构造函数参数匹配,类型比下标好当构造函数含有一个以上同种类型的参数,或者属性值的标签已经被占用时,Spring 允许使用从 0 开始的下标来避免混淆。例如:利用 type 属性来编写会更好一些,如下:使用 index 可以减少一些代码,但是与 type 属性相比,它更易于出错且难于阅读。只有在构造函数参数不明确的时候,才应该使用 index。5. 尽可能重用已定义的 beanSpring 提供了一种类似于继承的机制来减少配置信息的复制并简化 XML 配置。定义一个子类,它就可以从父类那里继承配置信息,而父类实际上成为子类的一个模板。这就是大型项目中所谓的重用。只需在父类 bean 中设置abstract=true,然后在子 bean 中指定 parent 引用。例如: ShippingService 类从 abstractService 类继承 companyName 属性的值lizjason。如果一个 bean 没有指定类或工厂方法,那么这个 bean 便是抽象的。6. 在导入时,首选通过 ApplicationContext 来汇编 bean 定义像 Ant 脚本中的导入一样,Spring 的 import 元素对于汇编模块化的 bean 定义来说是很有用的。例如:然而,相对于使用 import 在 XML 配置中进行预汇编,通过ApplicationContext 来配置这些 bean 则显得更加灵活。使用ApplicationContext 的话,XML 配置也更易于管理。可以向ApplictionContext 构造函数传递一组 bean 定义,如下:String serviceResources =orderServices.xml,billingServices.xml,shippingServices.xml;ApplicationContext orderServiceContext = newClassPathXmlApplicationContext(serviceResources);7. 使用 id 作为 bean 标识符可以指定一个 id 或名称来作为 bean 标识符。虽然使用 id 不能提高可读性,但是它可以利用 XML 分析程序来对 bean 引用进行验证。如果由于 XML IDREF的约束而不能使用某个 id,那么可以使用名称来作为 bean 的标识符。XML IDREF 的约束是:id 必须以字母(或者 XML 规范中定义的标点符号)开头,后面是字母、数字、连字符、下划线、冒号或句点。实际上,很少会遇到 XML IDREF 约束问题。8. 在开发阶段使用依赖性检查(dependency-check)可以在 bean 定义中为 dependency-check 属性设置一个非默认值,比如simple、objects 或 all,以便容器进行依赖性检查。当需要显式或通过自动绑定设置 bean 的全部属性(或某类属性)时,依赖性检查便显得很有用。在这个例子中,容器确保为 orderService bean 设置的属性不是 primitives或 collections。也可以为所有的 bean 设置默认依赖性检查,但是我们很少这样做,因为有些 bean 属性根本就不必设置。9. 为每个配置文件添加首部注释最好使用描述性的 id 和名称来取代 XML 配置文件中的内置注释。此外,添加一个配置文件首部也很有用,它可以概述文件中所定义的 bean。可以选择将描述添加到 description 标签中。例如:This file defines billing servicerelated beans and it depends onbaseServices.xml,which providesservice bean templates.使用 description 标签的一个好处是可以轻松地利用工具从标签中选获取描述内容。10. 对于更改,团队成员要积极交流在重构 Java 代码时,需要随时更新配置文件并通知团队成员。XML 配置文件也是代码,它们是应用程序的至关重要的部分,但是它们难于阅读和维护。大部分情况下,需要同时阅读 XML 配置文件和运行中的 Java 代码。11. Setter 注入优于构造函数注入Spring 提供了 3 种类型的依赖注入:构造函数注入(constructor injection)、setter 注入(setter injection)和方法注入(method injection)。我们一般只用前两种。在这个例子中,orderService 类使用的是构造函数注入,而 BillingService类使用的是 setter 注入。构造函数注入可以确保 bean 不会在一个非法状态下被创建,但是 setter 注入更加灵活且更易于管理,尤其是在类包含许多属性并且其中一些可选的情况下。12. 不要滥用依赖注入最后一点,Spring ApplicationContext 可以为您创建 Java 对象,但并不是所有的 Java 对象都应通过依赖注入来创建。例如,全局对象不应该通过ApplicationContext 来创建。Spring 是一个很棒的框架,但是,就可读性和易管理性而言,如果定义了大量 bean,基于 XML 的配置就可能成为问题。过度使用依赖注入会使 XML 配置变得复杂且臃肿。要知道,借助于功能强大的IDE(如 Eclipse 和 IntelliJ),Java 代码比 XML 文件更加易读、易维护、易管理。结束语XML 是通用的 Spring 配置方式。但如果定义了大量 bean,基于 XML 的配置就会变得冗长而不实用。Spring 提供了丰富的配置选项,恰当地利用其中的选项可以使 XML 配置更清晰,但是,有些选项(如 autowiring)往往会降低配置文件的可读性和可维护性。遵循本文中所描述的最佳实践,将有助于您创建出清晰易读的 XML 配置文件。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号