Spring XML配置十二个最佳实践_第1页
Spring XML配置十二个最佳实践_第2页
Spring XML配置十二个最佳实践_第3页
Spring XML配置十二个最佳实践_第4页
Spring XML配置十二个最佳实践_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在这篇文章里,对于SpringXML的配置,我将向你展示12种比较好的实践。其中的一些实践不仅是好的实践,更是必要的实践。除此以外,还有其他因素,例如领域模型的设计,都能影响XML的配置,但是这篇文章重点研究XML配置的易读性和易管理性。不要使用autowiringSpring可以通过类的自省来自动绑定其依赖部分,使得你不必明确指明bean的属性和构造器。Bean的属性可以通过属性名称或类型匹配来实现自动绑定。构造器通过类型匹配来实现自动绑定。你甚至可以指定自动检测自动绑定模式,它可以引导Spring选择一种适当的运行机制。先来看看下面的一个例子:<beanid="orderService”class=”com.lizjason.spring.OrderService”autowire="byName"/>OrderService类的属性名在容器中用于匹配bean实例。自动绑定可以潜在地节省一些打字和减少一些混乱。但是在现实世界的工程里你不应该使用这种方式,这是因为它牺牲了配置的清晰性和可维护性。许多指南和介绍中大量吹捧自动绑定是Spring的一种极好的特征而没有提到这一特性所带来的牺牲。依我的观点,这就像Spring中的object—pooling,它更像是一种为了占据更多市场的商业特征。它对于XML配置文件的小巧化是一个好办法,但实际上也增加了复杂程度,尤其当你运行有大量类声明的工程时。虽然Spring允许你混合自动绑定和手动绑定,但是这个矛盾会使XML配置更加晦涩难懂。使用通俗的命名这个方式对于Java编码也一样适用。在工程中使用清晰的、描述性的、协调的通俗名称对于开发者理解XML配置是十分有益的。例如对于beanID,你可以根据通俗的Java类名来命名它。对于例子中OrderServiceDAO的beanID命名为orderServiceDAO。对于大的工程,你可以在beanID前面加上包名作为前缀。使用简洁的形式简洁形式避免了冗长,是因为它从子元素中将属性值和参考写到属性中。例如下面的例子:<beanid="orderService”class=”com.lizjason.spring.OrderService">〈propertyname="companyName"><value>lizjason</value></property><constructor-arg><refbean="orderDAO"></constructor-arg></bean>可以使用简洁形式将上述代码重写为:<beanid="orderService”class=”com.lizjason.spring.OrderService"><propertyname="companyName”value=〃lizjason〃/><constructor-argref="orderDAO"/></bean>简洁形式功能在1.2版本中可以使用。对于<reflocal="...">没有简洁形式。简洁形式不但可以节约你的打字,而且可以使XML配置文件清晰。它最引人注目的是当在一个配置文件中有大量定义的类时可以提高易读性。对于构造器参数匹配,类型名比序号好。当一个构造器含有一个以上的同种类型的参数,或者属性值的标签已经被占用时,Spring允许你使用从0计数的序号来解决这些会带来混淆的问题。例如:<beanid="billingService”class=〃com.lizjason.spring.BillingService〃><constructor-argindex="0"value="lizjason"/><constructor-argindex="1"value="100"/></bean>像下面这样,利用类型属性来编写会更好一些:<beanid="billingService"class=”com.lizjason.spring.BillingService"><constructor-argtype=”java.lang.String”value="lizjason"/><constructor-argtype="int"value="100"/></bean>使用索引可以稍稍减少一些冗长,但是和使用类型属性相比,它还是有容易发生错误的倾向和难于阅读的缺点。你应该只在构造器参数不明确的时候,才使用索引这一方法。5.尽可能重用已定义过的beanSpring提供一种类似继承一样的机制来减少配置信息的复制并简化XML配置。定义一个子类可以从它父类那里继承配置信息,而父类实质上作为子类的一个模板。这就是大工程中所谓的重用。你所需要做的就是在父类bean中设置abstract=true,然后在子bean注明它自己的父类bean。例如:<beanid="abstractService"abstract="true"class="com.lizjason.spring.AbstractService"><propertyname="companyName"value="lizjason"/></bean><beanid="shippingService"parent="abstractService"class—com.lizjason.spring.ShippingService><propertyname="shippedBy"value="lizjason"/></bean>ShippingService类从abstractService类那里继承companyName属性的值lizjason。如果你没有为一个bean指明类或factory方法,那么这个bean便是抽象的。6.尽量使用Applicationcontext来装配定义的bean像在Ant脚本中的引用一样,Spring的引用对于装配模块化的bean来说是很有用的。例如:<beans><importresource="billingServices.xml"/>〈importresource=〃shippingServices.xml〃/><beanid="orderService”class=〃com.lizjason.spring.OrderService〃/><beans>相对于使用import在XML配置中来预装配,通过Applicationcontext来配置这些beans,显得更加灵活。利用Applicationcontext也使得XML配置易于管理。你可以像下面的例子那样在ApplictionContext构造器里布置bean:String]]serviceResources=("orderServices.xml","billingServices.xml","shippingServices.xml"};ApplicationContextorderServiceContext=newClassPathXmlApplicationContext(serviceResources);利用id作为bean的标识符你可以指定一个id或名称来作为bean的标识符。虽然使用id不会提高易读性,但是它可以让XMLparser对bean的引用有效方面进行更好的验证。如果由于XMLIDREF的限制而不能使用某个id,你可以利用names来作为bean的标识符。XMLIDREF的限制是id必须以字母开头(或者在XML规范中定义的标点符号),后面接着字母,数字,连字号,下划线,冒号等。实际上,遇到XMLIDREF限制的问题是很少见的。在开发阶段使用依赖检验你可以在bean中给依赖检验的属性设置值,而不采用原先默认的空值,属性设置例如simple,object或all,以便容器进行依赖检验。当bean的全部的属性(或某类属性)需要被明确设置或自动绑定时,依赖检验便显得很有用。<beanid="orderService”class=”com.lizjason.spring.OrderService”dependency-check="objects”〉<propertyname="companyName”value="lizjason"/><constructor-argref="orderDAO"/></bean>在这个例子里,容器确保为orderServicebean设置的属性不是primitives或者collections。为所有的bean设置默认依赖检测也是可以的,但是我们很少这样做,是因为有些bean的属性根本就不必设置。9.为每个配置文件加上一个headercomment最好使用descriptiveid和名称来代替在XML配置文件中的注释。此外,加上一个配置文件header也很有用处,它可以概述文件中所定义的bean。你可以选择将描述内容加入description标签中。例如:<beans><description>ThisfiledefinesbillingservicerelatedbeansanditdependsonbaseServices.xml,whichprovidesservicebeantemplates...</description>...</beans>使用description标签的一个好处是可以容易地利用工具从标签中选取出description(的内容)。对于任何变化,要与队友积极交流当你重构Java代码时,你需要随时更新配置文件并且通知队友。XML配置文件也是代码,它们是应用程序的至关重要的部分,但是它们难于阅读和维护。大部分时间你既要阅读XML配置文件又要阅读运行中的Java代码。Setterinjection优于constructorinjectionSpring提供3种类型的依赖注入:constructorinjection,setterinjection,和methodinjectiono我们一般只用前两种类型。<beanid=〃orderService”class=〃com.lizjason.spring.OrderService〃><constructor-argref=〃orderDAO〃/></bean><beanid=〃billingService”class=〃com.lizjason.spring.BillingService〃>〈propertyname=〃billingDAO”ref=〃billingDAO〃></bean>这个例子中,orderService类使用的是constructorinjection,而BillingService类使用的是setterinjectionoconstructorinjection可以确保bean不会在一个非法状态下被创建,但是setterinjection更加灵活并且更易管理,尤其当类存在很多属性并且其中一些是可选的情况下。12.不要滥用依赖注入作为最后一点,SpringApplicationContext可以替你创建Java对象,但是并不是所有的Java对象都通过依赖注入来创建的。例如,全局的对象不应该通过ApplicationContext来创建。Spring是一个很棒的框架,但是,就易读性和易管理性而言,当定义大量bean的时候,基于XML的配置问题就会突出。过度的依赖注入会使XML配置变得复杂而且臃肿。记住!使用强大的IDE时,例如Eclipse和IntelliJ,与XML文件相比,Java代码更加易读,易维护,易管理。总结对于Spring的配置,XML是很优秀的方式。但当定义大量bean时,基于XML配置会变得冗长,笨拙。Spring提供了丰富的配置选项。适当地利用其中的选项可以使XML配置清晰,但是,有些选项,例如autowiring(自动绑定),往往会降低易读性和易维护性。文章中所列举的实例,可以帮助你创建出清晰易读的XML配置文件。Spring是什么呢?首先它是一个开源的项目,而且目前非常活跃;它是一个基于IoC和AOP的构架多层j2ee系统的框架,但它不强迫你必须在每一层中必须使用Spring,因为它模块化的很好,允许你根据自己的需要选择使用它的某一个模块;它实现了很优雅的MVC,对不同的数据访问技术提供了统一的接口,采用IoC使得可以很容易的实现bean的装配,提供了简洁的AOP并据此实现TranscationManagment,等等 Spring有几个主要的部分:Bean+ApplicationContext,以一种统一的、IoC的方式查找、管理、组装、使用系统的组件,取代一切工厂;持久化框架;web框架。“J2EE框架”是RodJohnson的愿景,他希望Spring为J2EE轻量级解决方案提供自底至顶的全面基础设施支持。”Struts+Spring+Hibernate快速入门本文是开发基于spring的web应用的入门文章,前端采用StrutsMVC框架,中间层采用spring,后台采用Hibernate。本文包含以下内容:•配置Hibernate和事务•装载Spring的applicationContext.xml文件•建立业务层和DAO之间的依赖关系.将Spring应用到Struts中简介这个例子是建立一个简单的web应用,叫MyUsers,完成用户管理操作,包含简单的数据库增,删,查,该即CRUD(新建,访问,更新,删除)操作。这是一个三层的web应用,通过Action(Struts)访问业务层,业务层访问DAO。图一简要说明了该应用的总体结构。图上的数字说明了流程顺序一从web(UserAction)到中间层(UserManager),再到数据访问层(UserDAO),然后将结果返回。Spring层的真正强大在于它的声明型事务处理,帮定和对持久层支持(例如Hiberate和iBATIS)以下下是完成这个例子的步骤:1.安装Eclipse插件数据库建表配置Hibernate和Spring建立HibernateDAO接口的实现类运行测试类,测试DAO的CRUD操作创建一个处理类,声明事务7.创建web层的Action和model运行Action的测试类测试CRUD操作创建jsp文件通过浏览器进行CRUD操作通过浏览器校验jsp安装eclipse插件Hibernate插件/hibernatesyncSpring插件/spring-ide/eclipse/updatesite/MyEclipse插件(破解版)Tomcat插件.tanghan其他插件包括xml,jsp,数据库建表createtableapp_user(idnumbernotnullprimary,firstnamevchar(32),lastnamevchar(32));新建项目新建一个webproject,新建后的目录结构同时包含了新建文件夹page用于放jsp文件,和源文件夹test用于放junit测试文件。同时将用到的包,包括struts,hibernate,spring都导入到lib目录下。创建持久层O/Rmapping在src/com.jandar.model下用hibernate插件从数据库导出app_user的.hbm.xml文件改名为User.hbm.xml<?xmlversion="1.0"?>!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD//EN""http://hibernate.sourceforge.nct/hibernate-mapping-2.0.dtd">hibernate-mappingpackage="com.jandar.model">classname="User"table="APP_USER"><idcolumn="ID"name="id"type="integer">generatorclass="assigned"/></id><propertycolumn="LASTNAME"length="10"name="lastname"not-null="false"type="string"/><propertycolumn="FIRSTNAME"length="10"name="firstname"not-null="true"type="string"/></class></hibernate-mapping>通过hibernatesynchronizer->synchronizerfile生成User.java文件,User对象对应于数据库中的app_user表注:在eclipse下自动生成的对象文件不完全相同,相同的是每个对象文件必须实现Serializable接口,必需又toString和hashCode方法;importjava.io.Serializable;importmons.lang.builder.EqualsBuilder;importmons.lang.builder.HashCodeBuilder;importmons.lang.builder.ToStringBuilder;importmons.lang.builder.ToStringStyle;publicclassBaseObjectimplementsSerializable(publicStringtoString()(returnToStringBuilder.reflectionToString(this,ToStringStyle.MULTI_LINE_STYLE);}publicbooleanequals(Objecto)(returnEqualsBuilder.reflectionEquals(this,o);}publicinthashCode()(returnHashCodeBuilder.reflectionHashCode(this);}}publicclassUserextendsBaseObject(privateLongid;privateStringfirstName;privateStringlastName;/**@returnReturnstheid.*/publicLonggetId()(returnid;}/**@paramidTheidtoset.*/publicvoidsetId(Longid)(this.id=id;}/**@returnReturnsthefirstName.*/publicStringgetFirstName()(returnfirstName;/**@paramfirstNameThefirstNametoset.*/publicvoidsetFirstName(StringfirstName)(this.firstName=firstName;}/**@returnReturnsthelastName.*/publicStringgetLastName()(returnlastName;}/**@paramlastNameThelastNametoset.*/publicvoidsetLastName(StringlastName)(this.lastName=lastName;}}创建DAO访问对象在src/com.jandar.service.dao新建IDAO.java接口,所有的DAO都继承该接口packagecom.jandar.services.dao;publicinterfaceIDAO在src/com.jandar.service.dao下新建IUserDAO.java接口publicinterfaceIUserDAOextendsDAO(ListgetUsers();UsergetUser(Integeruserid);voidsaveUser(Useruser);voidremoveUser(Integerid);}该接口提供了访问对象的方法,在src/com.jandar.service.dao.hibernate下新建UserDAOHiberante.javaimportjava.util.List;importmons.logging.Log;importmons.logging.LogFactory;importorg.springframework.orm.hibernate.support.HibernateDaoSupport;importcom.jandar.model.User;importcom.jandar.service.dao.IUserDAO;publicclassUserDaoHibernateextendsHib

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论