SpringApplicationContext.xml配置地12个技巧_第1页
SpringApplicationContext.xml配置地12个技巧_第2页
SpringApplicationContext.xml配置地12个技巧_第3页
SpringApplicationContext.xml配置地12个技巧_第4页
SpringApplicationContext.xml配置地12个技巧_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、实用文案标准文档Spring ApplicationContext.xml配置的 12 个技巧Spring是一个强有力的java程序框架,其被广泛应用于java的程序中。它用POJO提供了企业级服务。Spring利用依赖注入可以获得简单而有效的测试能 力。Spring beans,依赖关系,以及服务所需要的 bean都将在配置文件中予 以描述,配置文件一般采用 XML格式。然而XML配置文件冗长而不易使用, 在你进行一 个使用了大量bean的大项目中它将变得难以阅读和控制。在这篇文章中我将给你展示12种的有关Spring XML配置文件的最佳技巧。它 们中的一些具有更多的实际意义,而不仅是最好

2、的技巧。请注意另外一些因素, 例如域模型的设计,会影响到 XML配置,但是这篇文章更关注于 XML配置的 可读性和可操控性。1 避免使用自动装配Spring可以通过bean类的自省来实现自动装配依赖,这样的话你就不必明确 地描述bean的属性或者构造函数的参数。根据属性名称活匹配类型,bean属性可以 自动进行装配。而构造函数可以根据匹配类型自动装配。你甚至可以设 置自动装配进行自动侦测,这样 Spring替你就会选择一个合适的机制。请看下 面的例子:Spring可以通过bean类的自省来实现自动装配依赖,这样的话你就不必明确 地描述bean的属性或者构造函数的参数。根据属性名称活匹配类型,b

3、ean属实用文案标准文档性可以 自动进行装配。而构造函数可以根据匹配类型自动装配。你甚至可以设 置自动装配进行自动侦测,这样 Spring替你就会选择一个合适的机制。请看下 面的例子:OrderService 类的属性名被用来和容器中的一个 bean实例进行匹配。自动装 配会默默的保存一些类型信息并降低混乱。然而,由于它会牺牲掉这种配置的直观性和可维护性, 你在实际的项目中将不会用到它。许多指南和陈述材料都把它吹捧为Spring的一个非常cool的特性,而没有提到它的这个缺点。依我之 见,就像Spring的对象池一样,它更多了一些商业味道。它看起来好像可以使 XML配置文件更精简一些,但实际上

4、却增加其复杂性,尤其是在你的较大规模 的工程中已经定义了很多bean的时候更是如此。Spring允许你混合使用自动 和手动装配,但是这种矛盾会使 XML配置更加的令人费解。2使用命名规范和Java编码的理念一样,在项目中始终用清晰的,描述性的,一致的命名规范对开发人员理解XML配置非常有用。拿bean ID举例来说,你可以遵循Java类中属性的命名规范。比如说,OrderServiceDAO 的bean ID 应该是orderServiceDAO 。对于大项目来说,在 bean ID 前加包名来作为前缀。实用文案标准文档3 使用简化格式简化格式有利于减少冗余,因为它把属性值和引用作为属性,而不

5、是子元素。看 下面的例子:vproperty n ame=compa ny Namelizjas on/valuev/con structor-arg以上程序可以重新以简化格式书写为:vproperty n ame=compa ny Namevalue=lizjas on /v/bea n简化格式在1.2版本时已经可用了,但请注意不存在 这种简化 实用文案标准文档格式不仅可以较少你的代码输入量,而且可以使 XML配置更加的清晰。当你的 配置文件中存在大量的bean定义时,它可以显著地提高可读性。4 .尽量使用type而不是index去解决构造函数参数的匹配问题当构造函数中有多个同类型的参数时,

6、Spring只允许你使用从0开始的index 或者value标签来解决这个问题。请看下面的例子:bean id=billingServiceclass=com.lizjas on .spri ng.Billi ngServicev/bea n最好用type属性取代上面的做法:bean id=billingServiceclass=com.lizjas on .spri ng.Billi ngServicev/bea n用index可以稍微减少冗余,但是它更容易出错且不如type属性可读性高。你实用文案标准文档应该仅在构造函数中有参数冲突时使用index 。5 .如可能,尽量复用bean定义Sp

7、ring提供了一种类似于继承的机制来降低配置信息的重复并使XML配置更加的简单。一个子bean可以从它的父bean继承配置信息,本质上这个父bean 就像 它的子bean的一个模板。这是一个在大型项目中必须使用的特性。所有 你要做的就是把父bean的abstract属性置为true,并在子bean中加 以引用。 例如:vproperty n ame=compa ny Namevalue=lizjas on /shippingService bean继承了 abstractService bean的属性 companyName的值lizjason。注意,如果你为bean声名一个class或工厂方

8、法,这个 bean将会默认为abstract6 .尽量使用 ApplicationContext装配 bean,而不是用 import实用文案标准文档像Ant脚本中imports 一样,Spring的import 元素对于模块化bean的装配非常有用,例如:然而,比起在XML中用imports 预装配这些bea n,利用Applicati on Co ntext来配置它们将更加灵活,也可以使 XML配置更加的易于管理。你可以像下面这样传递一个bean定义数组到 ApplicationContext的构造函数中:Stri ng serviceResources =orderServices.xm

9、l,billi ngServices.xml,shipp in gServices.xml;Applicati onCon text orderServiceC on text = newClassPathXmlApplicatio nCon text(serviceResources);7 .用id来标识bean你可以用id或名字作为bean的标识。用id可读性较差,但是它可以影响XML分析器使bean的referenee有效。如果id由于XML IDREF约束而无法使用, 你可以用name作为bean的标识。XML IDREF约束是指id必须以字母开始(或 者是在XML声名了的一个标点符号

10、),后面可以是字母,数字,连字符,下划线, 冒号或full stops(不知道怎么翻译好)。在实际应用中很少会遇到 XML IDREF 约束问题。实用文案标准文档8 在开发阶段使用依赖检查你可以为bean的dependency-check属性设置一个值来取代默认的none,比如说simple ,objects或者all,这样的话容器将替你做依赖有效性的检查。当 一个bean的所有属性(或者某些属性目录)都被明确设置,或利用自动装配时将 会非常有用。在这个例子中,容器将确保这些属性不是privitives或者保证collections是为orderService bean 设置的。为所有的bea

11、n设置默认的依赖检查是可能的,但 这个特性由于有些bean的属性不需要设置而很少使用。9 为每个配置文件加一个描述注释在XML配置文件中最好使用有描述性的id和name,而不是成堆的注释。另外, 加一个文件描述头将会非常有用,这个描述可以概括文件中定义的bean。另一个选择,你可以在description元素中加入描述信息。例如:实用文案标准文档vdescripti onThis file defines billing servicerelated bea ns and it depe nds onbaseServices.xml,which providesservice bea n te

12、mplates.用description元素的一个好处就是工具可以很容易的把描述信息从这个元素中 提取出来。10 . 和team members沟通变更当你修改java源码后,要确保更改了配置文件中的相应部分并把这个情况告知 你的team members 。XML配置文件也是代码,它们是程序的重要组成部分, 但它们很难阅读和维护。大多数时间里,你需要同时看 XML配置文件和java 代码才能知道是怎么回事。11 . setter注入和构造函数注入,优先使用前者Spring提供了三种注入方式:构造函数注入,setter注入和方法注入。一般我 们使用前两种。v/bea nv/bea n在这个例子中

13、,orderService bean 用了构造函数注入,而BillingService bean 用了 setter注入。构造函数注入可以确保 bean正确地构建,但是setter注入 更加的灵活和易于控制,特别是当class有多个属性并且它们中的一些是可选的 情况是更是如此。12 .不要滥用注入就像前面提到的,Spring 的 ApplicationContextEclipse and IntelliJ ,java 代码更加的易于阅读,维护和管理比使XML文件可以替你创建java对象,但不是 所有的java对象都应该通过注入创建。例如,域对象就不应该通过ApplicationContext创

14、建。Spring是一个优秀的框架,但是考虑到可读性和可操控性,基于XML配置的配置会在定义很多bean的时候出现麻烦。过渡使用 依赖注入将会使XML配置更加的复杂和冗长。切记,当使用高效的 IDE时,例 如实用文案标准文档结论XML是Spring流行的配置格式。存在大量bean定义时,基于XML的配置会 变得冗长而不易使用。Spring提供了丰富的配置选项。适当地使用这些选项可 以使XML配 置更加的清晰,但其它的一些选项,例如自动装配,可能会降低可读性和可维护性。参考本文中提到的这些技巧可能会帮助你创建干净而易读的XML配置文件(14)v/bea n(1) 、id: Bean的唯一标识名。它

15、必须是合法的 XML ID,在整个XML文档中 唯一。(2) 、name:用来为id创建一个或多个别名。它可以是任意的字母符合。多 个别名之间用逗号或空格分开。(3)、class:用来定义类的全限定名(包名+类名)。只有子类Bean不用定义该属性。(4) 、pare nt:子类Bea n定义它所引用它的父类 Bea n。这时前面的class属 性失效。子类Bean会继承父类Bean的所有属性,子类Bean也可以覆盖父类 Bean的属性。注意:子类Bean和父类Bean是同一个Java类。实用文案标准文档(5) 、abstract (默认为” false ”):用来定义Bean是否为抽象Bean

16、。它表 示这个Bean将不会被实例化,一般用于父类 Bean,因为父类Bean主要是供 子类Bean继承使用。(6)、singleton (默认为“ true ”):定义 Bean 是否是 Singleton (单例)。 如果设为“ true ”,则在BeanFactory作用范围内,只维护此Bean的一个实例。 如果设为“ flase ”,Bean将是Prototype (原型)状态,BeanFactory 将为每 次Bean请求创建一个新的Bean实例。(7) 、lazy-init (默认为“ default ”):用来定义这个Bean是否实现懒初始 化。如果为“true ”,它将在Bea

17、nFactory 启动时初始化所有的 Singleton Bean 。 反之,如果为“ false ”,它只在Bean请求时才开始创建 Singleton Bean 。(8) 、autowire (自动装配,默认为“ default ”):它定义了 Bean的自动装 载方式。1、 “ no ”:不使用自动装配功能。2、 “ byName ” :通过Bean的属性名实现自动装配。3、 “byType ”通过Bean的类型实现自动装配。4、 “ constructor ” :类似于byType,但它是用于构造函数的参数的自动组装。5、 “ autodetect ”通过Bean类的反省机制(intr

18、ospection )决定是使用实用文案标准文档“ constructor ”还是使用“ byType ”。(9)、dependency-check(依赖检查,默认为“ default ”):它用来确保Bean组件通过JavaBean描述的所以依赖关系都得到满足。在与自动装配功能 一起使用时,它特别有用。1、 none :不进行依赖检查。2、 objects :只做对象间依赖的检查。3、 simple :只做原始类型和String类型依赖的检查4、 all:对所有类型的依赖进行检查。它包括了前面的objects和simple 。(10 )、depends-on (依赖对象):这个 Bean在初

19、始化时依赖的对象,这个对象会在这个Bean初始化之前创建。(11 )、init-method:用来定义Bean的初始化方法,它会在 Bean组装之后调 用。它必须是一个无参数的方法。(12 )、destroy-method :用来定义 Bean 的销毁方法,它在 BeanFactory 关闭时调用。同样,它也必须是一个无参数的方法。它只能应用于sin glet onBean。(13) 、factory-method:定义创建该Bean对象的工厂方法。它用于下面的实用文案标准文档“ factory-bean ”,表示这个Bean是通过工厂方法创建。此时,“ class ”属 性失效。(14) 、

20、factory-bean:定义创建该Bean对象的工厂类。如果使用了“ factory-bean ”贝厂 class ”属性失效。下面列出ref元素的所有可用的指定方式:bean :可以在当前文件中查找依赖对象,也可以在应用上下文(Applicatio nCo ntext)中查找其它配置文件的对象。local :只在当前文件中查找依赖对象。这个属性是一个XML IDREF,所以它指定的对象必须存在,否则它的验证检查会报错。external :在其它文件中查找依赖对象,而不在当前文件中查找。总的来说,ref bea n=./ 和ref local=./大部分的时候可以通用。“ bean ”是最灵

21、活的方式,它允许你在多个文件之间共享 Bean。而“ local ”则提供了便利的XML验证。实用文案标准文档如何使用spring的作用域:这里的scope就是用来配置spring bean 的作用域,它标识bean的作用域。在 spring2.0 之前 bean 只有 2 种作用域即:singleton(单例)、non-singleton(也称 prototype ), Spring2.0 以后,增加了 session、request global session三种专用于 Web应用程序上下文的Bean。因此,默认情况下Spring2.0现在 有五种类型的Bean。当然,Spring2.0

22、对Bean的类型的设计进行了重构,并 设计出灵活的Bean类型支持,理论上可以有无数多种类型的Bean,用户可以根据自己的需要,增加新的Bean类 型,满足实际应用需求。1、singleton 作用域当一个bean的作用域设置为singleton,那么Spring IOC 容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹 配,则只会返回bean的同一实例。换言之,当把一个bean定义设置为 singleton 作用域时,Spring IOC容器只会创建该bean定义的唯一实例。这个 单一实例会被存储到单例缓存(sin gleton cache )中,

23、并且所有针对该bea n 的后续请求和引用都将返回被缓存的对象实例,这里要注意的是sin glet on作用域和GOF设计模式中的单例是完全不同的,单例设计模式表示一个 ClassLoader中只有一个class存在,而这里的singleton 则表示一个容器对 应一个bean ,也就是说当一个bean被标识为singleton 时候,spring的IOC 实用文案标准文档容器中只会存在一个该bean。配置实例:或者2、prototypeprototype 作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)都会产生一个新的bean实

24、例,相 当与一个new的操作,对于prototype 作用域的bean,有一点非常重要,那 就是Spring不能对一个prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个 prototype实例后,将它交给客户端,随后就对 该prototype 实例不闻不问了。不管何种作用域,容器都会调用所有对象的初 始化生命周期回调方法,而对 prototype 而言,任何配置好的析构生命周期回 调方法都将不会被调用。清除prototype 作用域的对象并释放任何prototypebean所持有的昂贵资源,都是客户端代码的职责。(让Spring容器释放被singleton

25、作用域bean占用资源的一种可行方式是,通过使用bean的后置处理器,该处理器持有要被清除的 bean的引用。) 配置实例:或者3、requestrequest表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效,配置实例:request、session、global session 使用的时候首先要在初始化 web 的 web.xml中做如下配置:如果你使用的是Servlet 2.4及以上的web容器,那么你仅需要在 web应用的XML声明文件web.xml中增加下述ContextListener 即可: org.springframew

26、ork.web.context.request.RequestConte xtListener 实用文案标准文档,如果是Servlet2.4 以前的web容器,那么你要使用一个javax.servlet.Filter 的实现: requestContextFilter org.springframework.web.filter.RequestContextFilter requestContextFilter/* 接着既可以配置bean的作用域了:4、sessionsession作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效,

27、配置实例:实用文案标准文档配置实例:和request配置实例的前提一样,配置好 web启动文件就可以如下配置:5、global sessionglobal session 作用域类似于标准的 HTTP Session作用域,不过它仅仅在基于 portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它 被所有构成某个 portlet web应用的各种不同的portlet所共享。在globalsession作用域中定义的bean被限定于全局portlet Session的生命周期范围内。如果你在 web中使用global session 作用域来标识bean,那么web会自 动当成session类型来使用。

温馨提示

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

评论

0/150

提交评论