总结Spring中XML配置的十二个最佳实践
更新时间:2023-06-05 23:52:01 阅读量: 实用文档 文档下载
- spring xml配置推荐度:
- 相关推荐
总结Spring中XML配置的十二个最佳实践
总结 Spring 中 XML 配置的十二个最佳实践2007-7-13Spring 是一个强大的 JAVA 应用框架,广泛地应用于 JAVA 的应用程序。为 PlainOldJavaObjects (POJOs)提供企业级服务。Spring 利用依赖注入机制来简化工作,同时提高易测性。Springbeans 及依赖, 以及 beans 类所需的服务都在配置文件中进行了详细的说明,这个配置文件是典型的 XML 格式。但是它既冗 长又不实用。对于需要定义大量 Springbeans 的大工程来说,我们难以阅读和管理它。 在这篇文章里,对于 SpringXML 的配置,我将向你展示 12 种比较好的实践。其中的一些实践不仅是好 的实践,更是必要的实践。除此以外,还有其他因素,例如领域模型的设计,都能影响 XML 的配置,但是 这篇文章重点研究 XML 配置的易读性和易管理性。 1.不要使用 autowiring Spring 可以通过类的自省来自动绑定其依赖部分,使得你不必明确指明 bean 的属性和构造器。Bean 的属 性可以通过属性名称或类型匹配来实现自动绑定。构造器通过类型匹配来实现自动绑定。你甚至可以指定自 动检测自动绑定模式,它可以引导 Spring 选择一种适当的运行机制。先来看看下面的一个例子: class="com.lizjason.spring.OrderService" autowire="byName" OrderService 类的属性名在容器中用于匹配 bean 实例。自动绑定可以潜在地节省一些打字和减少一些混 乱。但是在现实世界的工程里你不应该使用这种方式,这是因为它牺牲了配置的清晰性和可维护性。许多指 南和介绍中大量吹捧自动绑定是 Spring 的一种极好的特征而没有提到这一特性所带来的牺牲。依我的观点, 这就像 Spring 中的 object-pooling,它更像是一种为了占据更多市场的商业特征。它对于 XML 配置文件的小 巧化是一个好办法,但实际上也增加了复杂程度,尤其当你运行有大量类声明的工程时。虽然 Spring 允许你 混合自动绑定和手动绑定,但是这个矛盾会使 XML 配置更加晦涩难懂。 2.使用通俗的命名 这个方式对于 Java 编码也一样适用。在工程中使用清晰的、描述性的、协调的通俗名称对于开发者理解 XML 配置是十分有益的。例如对于 beanID,你可以根据通俗的 Java 类名来命名它。对于例子中 OrderServiceDAO 的 beanID 命名为 orderServiceDAO。对于大的工程,你可以在 beanID 前面加上包名作为前 缀。 3.使用简洁的形式 简洁形式避免了冗长,是因为它从子元素中将属性值和参考写到属性中。例如下面的例子: class="com.lizjason.spring.OrderService" 可以使用简洁形式将上述代码重写为: class="com.lizjason.spring.OrderService简洁形式功能在 1.2 版本中可以使用。对于没有简洁形式。 简洁形式不但可以节约你的打字,而且可以使 XML 配
总结Spring中XML配置的十二个最佳实践
置文件清晰。它最引人注目的是当在一个配置文 件中有大量定义的类时可以提高易读性。 4.对于构造器参数匹配,类型名比序号好。 当一个构造器含有一个以上的同种类型的参数,或者属性值的标签已经被占用时,Spring 允许你使用从 0 计数的序号来解决这些会带来混淆的问题。例如: class="com.lizjason.spring.BillingService" 像下面这样,利用类型属性来编写会更好一些: class="com.lizjason.spring.BillingService" value="name" 使用索引可以稍稍减少一些冗长,但是和使用类型属性相比,它还是有容易发生错误的倾向和难于阅读 的缺点。你应该只在构造器参数不明确的时候,才使用索引这一方法。 5.尽可能重用已定义过的 bean Spring 提供一种类似继承一样的机制来减少配置信息的复制并简化 XML 配置。定义一个子类可以从它父 类那里继承配置信息,而父类实质上作为子类的一个模板。这就是大工程中所谓的重用。你所需要做的就是 在父类 bean 中设置 abstract=true,然后在子 bean 注明它自己的父类 bean。例如: class="com.lizjason.spring.AbstractService" parent="abstractService" class="com.lizjason.spring.ShippingService" ShippingService 类从 abstractService 类那里继承 companyName 属性的值。如果你没有为一个 bean 指明类或 factory 方法,那么这个 bean 便是抽象的。 6.尽量使用 Applic ationContext 来装配定义的 bean 像在 Ant 脚本中的引用一样,Spring 的引用对于装配模块化的 bean 来说是很有用的。例如: class="com.lizjason.spring.OrderService" 相对于使用 import 在 XML 配置中来预装配,通过 ApplicationContext 来配置这些 beans,显得更加灵 活。利用 ApplicationContext 也使得 XML 配置易于管理。你可以像下面的例子那样在 ApplictionContext 构造 器里布置 bean: String[]serviceResources={"orderServices.xml","billingServices.xml","shippingServices.xml"}; ApplicationContextorderServiceContext=new ClassPathXmlApplicationContext(serviceResources);7.利用 id 作为 bean 的标识符 你可以指定一个 id 或名称来作为 bean 的标识符。虽然使用 id 不会提高易读性,但是它可以让 XMLparser 对 bean 的引用有效方面进行更好的验证。如果由于 XMLIDREF 的限制而不能使用某个 id,你可 以利用 names 来作为 bean 的标识符。XMLIDREF 的限制是 id 必须以字母开头(或者在 XML 规范中定义的标 点符号),后面接着字母,数字,连字号,下划线,冒号等。实际上,遇到 XMLIDREF 限制的问题是很少 见的。 8.在开发阶段使用依赖检验 你可以在 bean 中给依赖检验的属性设置值,而不采用原先默认的空值,属性设置例如 simple,object 或 all,以便容器进行依赖检验。当 bean 的全部的属性(或某类属性)需要被明确设置或自
总结Spring中XML配置的十二个最佳实践
动绑定时,依赖检验 便显得很有用。 class="com.lizjason.spring.OrderService" dependency-check="objects" 在这个例子里,容器确保为 orderServicebean 设置的属性不是 primitives 或者 collections。为所有的 bean 设置默认依赖检测也是可以的,但是我们很少这样做,是因为有些 bean 的属性根本就不必设置。 9.为每个配置文件加上一个 headercomment 最好使用 descriptiveid 和名称来代替在 XML 配置文件中的注释。此外,加上一个配置文件 header 也很有 用处,它可以概述文件中所定义的 bean。你可以选择将描述内容加入 description 标签中。例如: Thisfiledefinesbillingservice relatedbeansanditdependson baseServices.xml,whichprovides servicebeantemplates...... 使用 description 标签的一个好处是可以容易地利用工具从标签中选取出 description(的内容)。 10.对于任何变化,要与队友积极交流 当你重构 Java 代码时,你需要随时更新配置文件并且通知队友。XML 配置文件也是代码,它们是应用 程序的至关重要的部分,但是它们难于阅读和维护。大部分时间你既要阅读 XML 配置文件又要阅读运行中 的 Java 代码。 11.Setterinjection 优于 constructorinjection Spring 提供 3 种类型的依赖注入:constructorinjection,setterinjection,和 methodinjection。我们一般只用前 两种类型。 class="com.lizjason.spring.OrderService" class="com.lizjason.spring.BillingService" 这个例子中,orderService 类使用的是 constructorinjection,而 BillingService 类使用的是 setterinjection。constructorinjection 可以确保 bean 不会在一个非法状态下被创建,但是 setterinjection 更加灵活并且更易管 理,尤其当类存在很多属性并且其中一些是可选的情况下。 12.不要滥用依赖注入 作为最后一点,SpringApplicationContext 可以替你创建 Java 对象,但是并不是所有的 Java 对象都通过依 赖注入来创建的。例如,全局的对象不应该通过 ApplicationContext 来创建。Spring 是一个很棒的框架,但 是,就易读性和易管理性而言,当定义大量 bean 的时候,基于 XML 的配置问题就会突出。过度的依赖注入 会使 XML 配置变得复杂而且臃肿。记住!使用强大的 IDE 时,例如 Eclipse 和 IntelliJ,与 XML 文件相比, Java 代码更加易读,易维护,易管理。 总结 对于 Spring 的配置,XML 是很优秀的方式。但当定义大量 bean 时,基于 XML 配置会变得冗长,笨拙。 Spring 提供了丰富的配置选项。适当地利用其中的选项可以使 XML 配置清晰,但是,有些选项,例如 autowiring(自动绑定),往往会降低易读性和易维护性。文章中所列举的实例,可以帮助你创建出清晰易读 的 XML 配置文件。来源:赛迪网 作者:dxaw【关闭窗口】Copyright©2004 c114 All Right Reserved 1999-20
总结Spring中XML配置的十二个最佳实践
04 上海荧通网络信息技术有限公司版权所有 请与我们联系: c114@ 服务热线: 021-********,62991819Spring 中 bean 的基本 xml 配置在 spring 容器内拼凑 bean 叫作装配。装配 bean 的时候,你是在告诉容器,需要哪些 bean,以及容器如何使用 依赖注入将它们配合在一起。 理论上,bean 装配可以从任何资源获得,包括属性文件,关系数据库等,但 xml 是最常见的 spring 应用 系统配置源。Spring 中的几种容器都支持使用 xml 装配 bean,包括: XmlBeanFactory , ClassPathXmlApplicationContext , FileSystemXmlApplicationContext , XmlWebApplicationContext 基本的 xml 配置包括如下几个方面:1.添加一个 bean 2.设置 bean 的属性 2.1 手动设置 2.1.1 通过 Setter 方法 2.1.2 通过构造器 2.2 自动设置 其中 bean 的属性即为 bean 里的成员变量,这些成员变量值的获得可以通过 setter 方法,例如某个属性为 name,则 setter 方法为 setName(String name);或者通过构造器在类被实例化时初始化。Setter 方法(例如 setName 方法)或者构造器的调用都可以通过在 xml 文件里进行配置,从而实现让 spring 容器来自动进行。 1.添加一个 bean . 以下是一个例子: <bean id = “mybean” Class = “blog.spring.MyBean” Singleton = “false” init-method = “initMethod” destroy-method = “destroyMethod” autowire = “autowire type” /> 下面是对该标签里各个属性的解释:Id : 标识该 bean 的名称,通过 factory.getBean(“id”)来获得实例。 Class : 该 bean 的类路径。 Singleton : 默认为 true,即单实例模式,每次 getBean(“id”)时获取的都是同 一个实例,如果设置为 false,即原型模式,则每次获取的是新创建 的实例。 Init-method : 在 bean 实例化后要调用的方法(bean 里定义好的方法)。 Destroy-method : bean 从容器里删除之前要调用的方法。 Autowire : 其属性要通过何种方法进行属性的自动装配。 对于上述的各个属性,id 和 class 是必要的,其他的则可以省略。例如如果设置了 autowire 的值,则表明需 要自动装配,否则是手动装配。2.通过 Setter 方法手动设置 bean 里的属性 . Bean 里的属性通过<property>标签来标识。有以下几种情况: ● 简单类型属性 <bean id = “mybean” class = “blog.spring.MyBean”> <property name = “name”> <value>springTest</value> </property> </bean> ● 引用其他 bean <bean id = “mybean” class = “blog.spring.MyBean” /> <bean id = “mybean1” class = “blog.spring.MyBean1”> <property name = “name”> <ref bean = “mybean” /> </property> </bean> 也可以将<ref>改为 <bean class = “..”> 这样叫做内部 bean,缺点是无法在其他地方重用这个 bean 的实例。 ● 装配集合 共有以下几种集合的装配: ****装配 List 和数组**** <property
总结Spring中XML配置的十二个最佳实践
name = ”nameList”> <list> <value>something</value> <ref bean = “blog.spring.MyBean” /> <value>otherThing</value></list> </property> ****装配 Set**** <property name = ”nameList”> <set> <value>something</value> <ref bean = “blog.spring.MyBean” /> <value>otherThing</value> </set> </property> ****装配 Map**** <property name = ”nameList”> <map> <entry key = “key1”> <value>value1</value> </entry> <entry key = “key2”> <ref bean = “mybean” /> </entry> </map> </property> ****装配 Properties**** <property name = ”nameList”> <props> <prop key = “prop1”>value1</prop> <prop key = “prop2”>value2</prop> </props> </property> ● 设置 null 要将一个属性 null,需要通过<null />标签,如果不设置,则属性为默认值(在实例化时)而不是 null。 <property name=”name”> <null /> </property> 3.通过构造器手动设置 bean 里的属性 . 假设有如下一个 bean: Public class MyBean { Public MyBean( String arg1, MyBean1 arg2, String arg3 ) } 则可以在 xml 里这样配置该 bean: <bean id = “mybean” class = “blog.spring.MyBean”> <constructor-arg index = “1”><value>springTest</value> <constructor-arg> <constructor-arg index = “0”> <ref bean = “mybean1” /> <constructor-arg> </bean> 其中的 index 是用来标识该参数在构造函数里的位置的,并从 0 开始。4.让 spring 完成自动装配 . 例如: <bean id = “mybean” class = “blog.spring.MyBean” autowire = “autowire type” /> 下面是几种 autowire type 的说明: ● byname : 试图在容器中寻找和需要自动装配的属性名相同的 bean 或 id,如果没有找到相应的 bean,则这个属性未被装配上。● byType : 试图在容器中寻找一个与需要自动装配的属性类型相同的 bean 或 id,如果没有找到,则该属性 未被装配上。 ● constructor : 试图在容器中寻找与需要自动装配的 bean 的构造函数参数一致的一个或多个 bean,如果没找 到则抛出异常。 ● autodetect : 首先尝试使用 constructor 来自动装配,然后再使用 byType 方式。 从上面可以看出,如果某个 bean 不手动设置 autowire 属性,则默认为手动装配。如果需要将所有 bean 都设 置为自动装配时,可以通过在<beans>标签中设置 default-autowire 属性。<beans>标签是整个 xml 文档的根, 在它下面就是一个个的<bean>。 其中 default-autowire 的值也有 byName,byType,constructor,autodetect 四种。 例如配置如下: <beans default-autowire = “byName”> ... </beans> 自动装配可能带来不确定性问题。例如使用 byType 时可能同时发现两个相同的类型,则不知道该采用哪一 个。所以可能混合采用自动和手动装配。例如,对某个 bean 设置为自动装配,而对其某个属性则手动明确 的设置其值,例如: <bean id = “mybean” class = “blog.spring.MyBean”Autowire =
总结Spring中XML配置的十二个最佳实践
“byType” > <property name = “name”> <ref bean = “myBean1”> </property> </bean> 通过这样的配置,对 mybean 里的 name 属性进行手动装配,而对除 name 外的其他属性就进行自动装配。
正在阅读:
中小学课堂类型11-12
培训游戏集锦05-03
孔子观后感(优秀4篇)03-24
新建 细胞模型设计与制作活动方案03-04
小学科学五年级上册实验报告单01-02
函的格式范文02-16
2018年中考物理试题分析(刘建福)10-15
2012一级建造师教材编委朱红老师建筑实务考前两套押题模拟题03-08
国学经典,管子02-19
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 实践
- 配置
- 最佳
- 总结
- Spring
- XML
- 十二
- 闪银喷漆项目可行性研究报告(技术工艺+设备选型+财务概算+厂区规划)方案设计
- 2015年春季小学乒乓球部教学工作总结
- 美拉德反应与酱香型白酒
- 第四章经济法的地位和体系
- 2009年高考数学试题分类汇编_4
- 五道岭钼矿床矿物学特征及成因
- 中国人民大学税务硕士考研复习方法讲解
- 11-《中华人民共和国刑法修正案(六)》摘选
- case2-1(国家自然科学基金申请书)
- 三角函数中三角变换常用的方法和技巧
- 语文必修5第二单元练习题1
- 本钢板B:2013年半年度报告(英文版)
- 整理中里老师的关于经络穴位的功效位置
- 中国数字鸿沟报告2013
- 住宅建筑面积计算方法
- 企业资源影子价格应用例解
- 农产品质量安全基本知识
- AB-8大孔吸附树脂说明书
- 单片机课程设计_数字温度计
- 民政部关于贯彻执行《革命烈士褒扬条例》若干具体问题的解释(民〔1989〕优字19号,1988年4月17日)