- 浏览: 51462 次
- 性别:
- 来自: 南京
最新评论
-
wangying95599:
type= "Hello/css " ty ...
GWT CSS -
oceanG_Y:
这个框架和struts1的差不多,也是分三部分,视图,控制器, ...
配置mojavi -
liyh:
你觉得这个框架怎么样。
配置mojavi -
chaiyanxing:
怎么不写完呀?
Struts2 分页 -
hurui3550:
原文地址:
http://s2container.seasar ...
开源框架 Seasar2
Spring 配XML的技巧!
1. 避免使用自动装配
Spring可以通过bean类的自省来实现自动装配依赖,这样的话你就不必明确地描述bean的属性或者构造函数的参数。根据属性名称活匹配类型,bean属性可以自动进行装配。而构造函数可以根据匹配类型自动装配。你甚至可以设置自动装配进行自动侦测,这样Spring替 你就会选择一个合适的机制。请看下面的例子:
<bean id="orderService"
class="com.lizjason.spring.OrderService"
autowire="byName"/>
OrderService类的属性名被用来和容器中的一个bean实例进行匹配。自动装配会默默的保存一些类型信息并降低混乱。然而,由于它会牺牲掉这种配置的直观性和可维护性,你在实际的项目中将不会用到它。许多指南和陈述材料都把它吹捧为Spring的一个非常cool的特性,而没有提到它的这个缺点。依我之见,就像Spring的对象池一样,它更多了一些商业味道。它看起来好像可以使XML配置文件更精简一些,但实际上却增加其复杂性,尤其是在你的较大规模的工程中已经定义了很多bean的时候更是如此。Spring允许你混合使用自动和手动装配,但是这种矛盾会使XML配置更加的令人费解。
2. 使用命名规范
和Java编码的理念一样,在项目中始终用清晰的,描述性的,一致的命名规范对开发人员理解XML配置非常有用。拿bean ID举例来说,你可以遵循Java类中属性的命名规范。比如说,OrderServiceDAO的bean ID应该是orderServiceDAO。对于大项目来说,在bean ID前加包名来作为前缀。
3. 使用简化格式
简化格式有利于减少冗余,因为它把属性值和引用作为属性,而不是子元素。看下面的例子:
<bean id="orderService"
class="com.lizjason.spring.OrderService">
<property name="companyName">
<value>lizjason</value>
</property>
<constructor-arg>
<ref bean="orderDAO">
</constructor-arg>
</bean>
以上程序可以重新以简化格式书写为:
<bean id="orderService"
class="com.lizjason.spring.OrderService">
<property name="companyName"
value="lizjason"/>
<constructor-arg ref="orderDAO"/>
</bean>
简化格式在1.2版本时已经可用了,但请注意不存在<ref local="...">这种简化格式不仅可以较少你的代码输入量,而且可以使XML配置更加的清晰。当你的配置文件中存在大量的bean定义时,它可以显著地提高可读性。
4. 尽量使用type而不是index去解决构造函数参数的匹配问题
当构造函数中有多个同类型的参数时,Spring只允许你使用从0开始的index或者value标签来解决这个问题。请看下面的例子:
<bean id="billingService"
class="com.lizjason.spring.BillingService">
<constructor-arg index="0" value="lizjason"/>
<constructor-arg index="1" value="100"/>
</bean>
最好用type属性取代上面的做法:
<bean id="billingService"
class="com.lizjason.spring.BillingService">
<constructor-arg type="java.lang.String"
value="lizjason"/>
<constructor-arg type="int" value="100"/>
</bean>
用index可以稍微减少冗余,但是它更容易出错且不如type属性可读性高。你应该仅在构造函数中有参数冲突时使用index。
5. 如可能,尽量复用bean定义
Spring提供了一种类似于继承的机制来降低配置信息的重复并使XML配置更加的简单。一个子bean可以从它的父bean继承配置信息,本质上这个父bean就像它的子bean的一个模板。这是一个在大型项目中必须使用的特性。所有你要做的就是把父bean的abstract属性置为true,并在子bean中加以引用。例如:
<bean id="abstractService" abstract="true"
class="com.lizjason.spring.AbstractService">
<property name="companyName"
value="lizjason"/>
</bean>
<bean id="shippingService"
parent="abstractService"
class="com.lizjason.spring.ShippingService">
<property name="shippedBy" value="lizjason"/>
</bean>
shippingService bean继承了abstractService bean的属性companyName的值lizjason。注意,如果你为bean声名一个class或工厂方法,这个bean将会默认为abstract
6. 尽量使用ApplicationContext装配bean,而不是用import
像Ant脚本中imports一样,Spring的import 元素对于模块化bean的装配非常有用,例如:
<beans>
<import resource="billingServices.xml"/>
<import resource="shippingServices.xml"/>
<bean id="orderService"
class="com.lizjason.spring.OrderService"/>
<beans>
然而,比起在XML中用imports预装配这些bean,利用ApplicationContext来配置它们将更加灵活,也可以使XML配置更加的易于管理。你可以像下面这样传递一个bean定义数组到ApplicationContext的构造函数中:
String[] serviceResources =
{"orderServices.xml",
"billingServices.xml",
"shippingServices.xml"};
ApplicationContext orderServiceContext = new
ClassPathXmlApplicationContext(serviceResources);
7. 用id来标识bean
你可以用id或名字作为bean的标识。用id可读性较差,但是它可以影响XML分析器使bean的reference有效。如果id由于XML IDREF约束而无法使用,你可以用name作为bean的标识。XML IDREF约束是指id必须以字母开始(或者是在XML声名了的一个标点符号),后面可以是字母,数字,连字符,下划线,冒号或full stops(不知道怎么翻译好)。在实际应用中很少会遇到XML IDREF约束问题。
8. 在开发阶段使用依赖检查
你可以为bean的dependency-check属性设置一个值来取代默认的none,比如说simple,objects或者all,这样的话容器将替你做依赖有效性的检查。当一个bean的所有属性(或者某些属性目录)都被明确设置,或利用自动装配时将会非常有用。
<bean id="orderService"
class="com.lizjason.spring.OrderService"
dependency-check="objects">
<property name="companyName"
value="lizjason"/>
<constructor-arg ref="orderDAO"/>
</bean>
在这个例子中,容器将确保这些属性不是privitives或者保证collections是为orderService bean设置的。为所有的bean设置默认的依赖检查是可能的,但这个特性由于有些bean的属性不需要设置而很少使用。
9. 为每个配置文件加一个描述注释
在XML配置文件中最好使用有描述性的id和name,而不是成堆的注释。另外,加一个文件描述头将会非常有用,这个描述可以概括文件中定义的bean。另一个选择,你可以在description元素中加入描述信息。例如:
[size=large][/size]
<beans>
<description>
This file defines billing service
related beans and it depends on
baseServices.xml,which provides
service bean templates...
</description>
...
</beans>
用description元素的一个好处就是工具可以很容易的把描述信息从这个元素中提取出来。
10.和team members沟通变更
当你修改java源码后,要确保更改了配置文件中的相应部分并把这个情况告知你的team members。XML配置文件也是代码,它们是程序的重要组成部分,但它们很难阅读和维护。大多数时间里,你需要同时看XML配置文件和java代码才能知道是怎么回事。
11.setter注入和构造函数注入,优先使用前者
Spring提供了三种注入方式:构造函数注入,setter注入和方法注入。一般我们使用前两种。
<bean id="orderService"
class="com.lizjason.spring.OrderService">
<constructor-arg ref="orderDAO"/>
</bean>
<bean id="billingService"
class="com.lizjason.spring.BillingService">
<property name="billingDAO"
ref="billingDAO">
</bean>
在这个例子中,orderService bean用了构造函数注入,而BillingService bean用了setter注入。构造函数注入可以确保bean正确地构建,但是setter注入更加的灵活和易于控制,特别是当class有多个属性并且它们中的一些是可选的情况是更是如此。
12. 不要滥用注入
就像前面提到的,Spring的ApplicationContext可以替你创建java对象,但不是所有的java对象都应该通过注入创建。例如,域对象就不应该通过ApplicationContext创建。Spring是一个优秀的框架,但是考虑到可读性和可操控性,基于XML配置的配置会在定义很多bean的时候出现麻烦。过渡使用依赖注入将会使XML配置更加的复杂和冗长。切记,当使用高效的IDE时,例如Eclipse and IntelliJ,java代码更加的易于阅读,维护和管理比使XML文件
结论
XML是Spring流行的配置格式。存在大量bean定义时,基于XML的配置会变得冗长而不易使用。Spring提供了丰富的配置选项。适当地使用这些选项可以使XML配置更加的清晰,但其它的一些选项,例如自动装配,可能会降低可读性和可维护性。参考本文中提到的这些技巧可能会帮助你创建干净而易读的XML配置文件
Spring可以通过bean类的自省来实现自动装配依赖,这样的话你就不必明确地描述bean的属性或者构造函数的参数。根据属性名称活匹配类型,bean属性可以自动进行装配。而构造函数可以根据匹配类型自动装配。你甚至可以设置自动装配进行自动侦测,这样Spring替 你就会选择一个合适的机制。请看下面的例子:
<bean id="orderService"
class="com.lizjason.spring.OrderService"
autowire="byName"/>
OrderService类的属性名被用来和容器中的一个bean实例进行匹配。自动装配会默默的保存一些类型信息并降低混乱。然而,由于它会牺牲掉这种配置的直观性和可维护性,你在实际的项目中将不会用到它。许多指南和陈述材料都把它吹捧为Spring的一个非常cool的特性,而没有提到它的这个缺点。依我之见,就像Spring的对象池一样,它更多了一些商业味道。它看起来好像可以使XML配置文件更精简一些,但实际上却增加其复杂性,尤其是在你的较大规模的工程中已经定义了很多bean的时候更是如此。Spring允许你混合使用自动和手动装配,但是这种矛盾会使XML配置更加的令人费解。
2. 使用命名规范
和Java编码的理念一样,在项目中始终用清晰的,描述性的,一致的命名规范对开发人员理解XML配置非常有用。拿bean ID举例来说,你可以遵循Java类中属性的命名规范。比如说,OrderServiceDAO的bean ID应该是orderServiceDAO。对于大项目来说,在bean ID前加包名来作为前缀。
3. 使用简化格式
简化格式有利于减少冗余,因为它把属性值和引用作为属性,而不是子元素。看下面的例子:
<bean id="orderService"
class="com.lizjason.spring.OrderService">
<property name="companyName">
<value>lizjason</value>
</property>
<constructor-arg>
<ref bean="orderDAO">
</constructor-arg>
</bean>
以上程序可以重新以简化格式书写为:
<bean id="orderService"
class="com.lizjason.spring.OrderService">
<property name="companyName"
value="lizjason"/>
<constructor-arg ref="orderDAO"/>
</bean>
简化格式在1.2版本时已经可用了,但请注意不存在<ref local="...">这种简化格式不仅可以较少你的代码输入量,而且可以使XML配置更加的清晰。当你的配置文件中存在大量的bean定义时,它可以显著地提高可读性。
4. 尽量使用type而不是index去解决构造函数参数的匹配问题
当构造函数中有多个同类型的参数时,Spring只允许你使用从0开始的index或者value标签来解决这个问题。请看下面的例子:
<bean id="billingService"
class="com.lizjason.spring.BillingService">
<constructor-arg index="0" value="lizjason"/>
<constructor-arg index="1" value="100"/>
</bean>
最好用type属性取代上面的做法:
<bean id="billingService"
class="com.lizjason.spring.BillingService">
<constructor-arg type="java.lang.String"
value="lizjason"/>
<constructor-arg type="int" value="100"/>
</bean>
用index可以稍微减少冗余,但是它更容易出错且不如type属性可读性高。你应该仅在构造函数中有参数冲突时使用index。
5. 如可能,尽量复用bean定义
Spring提供了一种类似于继承的机制来降低配置信息的重复并使XML配置更加的简单。一个子bean可以从它的父bean继承配置信息,本质上这个父bean就像它的子bean的一个模板。这是一个在大型项目中必须使用的特性。所有你要做的就是把父bean的abstract属性置为true,并在子bean中加以引用。例如:
<bean id="abstractService" abstract="true"
class="com.lizjason.spring.AbstractService">
<property name="companyName"
value="lizjason"/>
</bean>
<bean id="shippingService"
parent="abstractService"
class="com.lizjason.spring.ShippingService">
<property name="shippedBy" value="lizjason"/>
</bean>
shippingService bean继承了abstractService bean的属性companyName的值lizjason。注意,如果你为bean声名一个class或工厂方法,这个bean将会默认为abstract
6. 尽量使用ApplicationContext装配bean,而不是用import
像Ant脚本中imports一样,Spring的import 元素对于模块化bean的装配非常有用,例如:
<beans>
<import resource="billingServices.xml"/>
<import resource="shippingServices.xml"/>
<bean id="orderService"
class="com.lizjason.spring.OrderService"/>
<beans>
然而,比起在XML中用imports预装配这些bean,利用ApplicationContext来配置它们将更加灵活,也可以使XML配置更加的易于管理。你可以像下面这样传递一个bean定义数组到ApplicationContext的构造函数中:
String[] serviceResources =
{"orderServices.xml",
"billingServices.xml",
"shippingServices.xml"};
ApplicationContext orderServiceContext = new
ClassPathXmlApplicationContext(serviceResources);
7. 用id来标识bean
你可以用id或名字作为bean的标识。用id可读性较差,但是它可以影响XML分析器使bean的reference有效。如果id由于XML IDREF约束而无法使用,你可以用name作为bean的标识。XML IDREF约束是指id必须以字母开始(或者是在XML声名了的一个标点符号),后面可以是字母,数字,连字符,下划线,冒号或full stops(不知道怎么翻译好)。在实际应用中很少会遇到XML IDREF约束问题。
8. 在开发阶段使用依赖检查
你可以为bean的dependency-check属性设置一个值来取代默认的none,比如说simple,objects或者all,这样的话容器将替你做依赖有效性的检查。当一个bean的所有属性(或者某些属性目录)都被明确设置,或利用自动装配时将会非常有用。
<bean id="orderService"
class="com.lizjason.spring.OrderService"
dependency-check="objects">
<property name="companyName"
value="lizjason"/>
<constructor-arg ref="orderDAO"/>
</bean>
在这个例子中,容器将确保这些属性不是privitives或者保证collections是为orderService bean设置的。为所有的bean设置默认的依赖检查是可能的,但这个特性由于有些bean的属性不需要设置而很少使用。
9. 为每个配置文件加一个描述注释
在XML配置文件中最好使用有描述性的id和name,而不是成堆的注释。另外,加一个文件描述头将会非常有用,这个描述可以概括文件中定义的bean。另一个选择,你可以在description元素中加入描述信息。例如:
[size=large][/size]
<beans>
<description>
This file defines billing service
related beans and it depends on
baseServices.xml,which provides
service bean templates...
</description>
...
</beans>
用description元素的一个好处就是工具可以很容易的把描述信息从这个元素中提取出来。
10.和team members沟通变更
当你修改java源码后,要确保更改了配置文件中的相应部分并把这个情况告知你的team members。XML配置文件也是代码,它们是程序的重要组成部分,但它们很难阅读和维护。大多数时间里,你需要同时看XML配置文件和java代码才能知道是怎么回事。
11.setter注入和构造函数注入,优先使用前者
Spring提供了三种注入方式:构造函数注入,setter注入和方法注入。一般我们使用前两种。
<bean id="orderService"
class="com.lizjason.spring.OrderService">
<constructor-arg ref="orderDAO"/>
</bean>
<bean id="billingService"
class="com.lizjason.spring.BillingService">
<property name="billingDAO"
ref="billingDAO">
</bean>
在这个例子中,orderService bean用了构造函数注入,而BillingService bean用了setter注入。构造函数注入可以确保bean正确地构建,但是setter注入更加的灵活和易于控制,特别是当class有多个属性并且它们中的一些是可选的情况是更是如此。
12. 不要滥用注入
就像前面提到的,Spring的ApplicationContext可以替你创建java对象,但不是所有的java对象都应该通过注入创建。例如,域对象就不应该通过ApplicationContext创建。Spring是一个优秀的框架,但是考虑到可读性和可操控性,基于XML配置的配置会在定义很多bean的时候出现麻烦。过渡使用依赖注入将会使XML配置更加的复杂和冗长。切记,当使用高效的IDE时,例如Eclipse and IntelliJ,java代码更加的易于阅读,维护和管理比使XML文件
结论
XML是Spring流行的配置格式。存在大量bean定义时,基于XML的配置会变得冗长而不易使用。Spring提供了丰富的配置选项。适当地使用这些选项可以使XML配置更加的清晰,但其它的一些选项,例如自动装配,可能会降低可读性和可维护性。参考本文中提到的这些技巧可能会帮助你创建干净而易读的XML配置文件
发表评论
-
Extjs grid数据手动排序
2010-01-10 11:31 0在使用ExtJS的grid控件的时候,经常需要对gri ... -
关于 商业智能
2009-04-21 00:29 143各位版油们,有没有是做商务智能行业的,请大家谈谈对该行业未来. ... -
XMLHttpRequest对象池
2008-12-06 11:20 872在ajax应用中,通常一个页面要同时发送多个请求,如果只有一个 ... -
程序员的七种武器
2008-11-22 23:43 885程序员的七种武器 第 ... -
java 数据库 基础知识
2008-10-18 13:32 1016数据库方面: 1. 存储过程和函数的区别 存储过程是用 ... -
java 基本知识
2008-10-18 13:31 885面向对象的特征有哪些方面 1. 抽象: 抽 ... -
GWT Grid 列合并
2008-05-31 12:08 977我建了一个10行2列的grid的表格;我想让某一行或多行的两列 ... -
GWT CSS
2008-05-29 23:25 1294在Hello.gwt.xml里加上 <styleshee ... -
DIV 层 透明
2008-05-27 22:32 1897<center><div style=&qu ... -
API Developer's Guide: Java
2008-05-19 23:44 1074引自:http://code.google.com/apis/ ... -
妻子的说明书
2008-05-19 17:16 783妻子的说明书 (已经国家食药监局注册司备案)【品名】妻子 ... -
IE Developer
2008-05-15 11:13 855Name:piaodown.com Serial:88QWS- ... -
GWT学习笔记(一)
2008-05-12 20:20 1800Language Support Intrinsi ... -
GWT开发的8个忠告
2008-05-11 22:06 1171Google Web工具包(GWT)确 ... -
GWT开发中注意点:
2008-05-11 21:47 1215引自:http://www.blogjava.net/stee ... -
Google Web ToolKit
2008-05-10 00:49 863引自:http://www.ibm.com/developer ... -
Java with Crystal Reports
2008-05-08 23:26 5252引用自:http://forum.java.sun.com/t ... -
工作中,一般都会用几种语言?
2008-05-05 13:48 1544我工作中,用JAVA和PHP,还有C#,交替开发;都要给累死了 ... -
开源框架 Seasar2
2008-04-25 16:51 9510在日本,Seasar2这个框架十分的流行。Seasar2其实就 ... -
Struts2 分页
2008-04-25 16:31 2845一、 准备工作 开发环境:MyEclipse5.0 ...
相关推荐
Spring 配XML的十二种技巧
在探讨Spring配XML的十二种技巧时,我们深入解析了几个关键点,这些技巧旨在提升Spring框架中XML配置文件的可读性、可维护性和效率。以下是对文章中提到的几点技巧的详细解读: ### 1. 避免使用自动装配 尽管...
这份压缩包包含了详细的代码示例和配套的PPT讲解,旨在帮助学习者深入理解并掌握Spring框架的核心功能和使用技巧。 Spring框架是Java企业级应用开发中的主流框架,它以其依赖注入(Dependency Injection,DI)和...
现在我总结配出一套,给大家参考参考,可能有不足,请大家多多交流。 附:内有弹出对话框,Action乱码处理和一些好技巧。 2008-5-28 修改: 今天修改了 applicationContext.xml,以后的事务控制就万事大吉了,...
通过实际操作,读者可以快速掌握Spring的使用技巧,并能够将其应用到自己的项目中。 总的来说,《Spring2.5开发简明教程中文版》是一份非常适合初学者入门的教程,它不仅讲解了Spring的基础知识,还提供了丰富的...
Spring Framework 2是Java开发中的一个关键框架,它为构建企业级应用提供了全面的基础设施支持。...通过这个教学资源包,学习者可以逐步掌握Spring的核心概念和实践技巧,为成为一名熟练的Spring开发者打下坚实的基础。
MyBatis是另一种轻量级的ORM框架,它允许开发者将SQL语句直接写在XML配置文件或者注解中,使得SQL与代码更加紧密地结合。MyBatis强调SQL的灵活性,开发者可以编写复杂和高性能的查询,同时保持良好的可维护性。 ...
2. **起步驱动配置**:解释Spring Boot如何通过 starter 包实现自动化配置,减少XML配置。 3. **Actuator**:讲解Actuator组件如何提供健康检查、应用信息和监控功能。 4. **Spring Boot应用结构**:讨论标准的...
在系统实现过程中,Spring通过XML配置或注解方式管理Bean,实现依赖注入,降低了组件间的耦合度。SpringMVC接收HTTP请求,调用业务逻辑处理,然后返回响应。MyBatis通过Mapper接口和XML映射文件,将SQL语句与Java...
它通过`@EnableAutoConfiguration`注解,根据项目中的依赖自动配置Bean,省去了大量的XML配置工作。 2. **起步依赖(Starters)**:SpringBoot2提供了各种起步依赖,如`spring-boot-starter-web`、`spring-boot-...
《Maven应用实战》这本书由杨式文和孙会军编著,提供了丰富的实践案例和详尽的解析,帮助读者深入理解并掌握Maven的使用技巧。本篇将基于该书的配套源码,探讨Maven的核心概念和关键功能。 首先,我们需要了解Maven...
4. 整合过程中的配置文件,如struts.xml、spring-context.xml、hibernate.cfg.xml等的编写。 5. 整合过程中可能出现的问题及解决方案,如类加载冲突、事务管理配置等。 6. 使用Eclipse或IntelliJ IDEA等IDE进行项目...
标题“spring-practice”指的是一个关于Spring框架的实践项目,可能是为了帮助学习者掌握Spring的核心概念和使用技巧。Spring是一个广泛应用于企业级Java开发的开源框架,它简化了应用程序的构建,提供了依赖注入、...
mail组件、程序日志组件、JavaScript脚本语言、CSS样式、XML入门技术、在JSP中应用Ajax技术、在JSP中应用DOM解析XML、在JSP中应用JDOM解析XML、在JSP中应用SAX解析XML、EL表达式、JSTL标签库、自定义标签、Hibernate...
在缺少数据库文件的情况下,MyBatis的XML映射文件或注解形式的SQL语句是系统与数据库交互的重要部分。 4. **JDBC**:尽管MyBatis提供了更高级的数据库操作方式,但基础的Java Database Connectivity (JDBC)仍会作为...
mail组件、程序日志组件、JavaScript脚本语言、CSS样式、XML入门技术、在JSP中应用Ajax技术、在JSP中应用DOM解析XML、在JSP中应用JDOM解析XML、在JSP中应用SAX解析XML、EL表达式、JSTL标签库、自定义标签、Hibernate...
mail组件、程序日志组件、JavaScript脚本语言、CSS样式、XML入门技术、在JSP中应用Ajax技术、在JSP中应用DOM解析XML、在JSP中应用JDOM解析XML、在JSP中应用SAX解析XML、EL表达式、JSTL标签库、自定义标签、Hibernate...
教程覆盖了从基础到进阶的多个主题,帮助用户熟练掌握MyEclipse的使用技巧以及Java编程的核心概念。 在前10章中,教程通常会涵盖以下内容: 1. **MyEclipse简介**:解释MyEclipse作为一款强大的Java EE IDE,如何...
MyBatis则是一个持久层框架,它简化了SQL操作,通过XML或注解方式配置,将Java对象与数据库记录映射起来。 在数据库设计方面,班级管理系统的数据库通常会包含以下几个主要表: 1. 用户表(Users):存储用户的...