- 浏览: 391893 次
- 性别:
- 来自: 长沙
文章分类
最新评论
-
hylandtecliulei:
现在JSF在国外很火的,我们公司的开发平台就是基于JSF
JSF的各种框架实现(对目前JSF群雄一个了解)(转) -
bcabchappy:
在哪呢?压力挺大的,诶。
flex 三大数据传输格式 json,xml,object相互转换的api -
simple8888:
JSF现在还有吗?
JSF的各种框架实现(对目前JSF群雄一个了解)(转) -
游其是你:
请问channelset写在哪儿啊?最后写个小项目“hello ...
用as实现RemoteObject -
hans.org:
mark it
自定义组件中的元数据标签
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选择一种适当的运行机制。先来看看下面的一个例子:
<bean id="orderService"
class="com.lizjason.spring.OrderService"
autowire="byName"/>
OrderService
类的属性名在容器中用于匹配bean实例。自动绑定可能会节省一些键入工作量并减少混乱。但是在现实项目中不应该使用这种方式,因为它牺牲了配置的可读性
和可维护性。许多指南和介绍中大肆吹捧自动绑定是Spring的一项极好的特性,而没有提到这一特性所带来的牺牲。依我来看,这就像Spring中的对象
池(object-pooling),更大程度上只是宣传的噱头。对于精简XML配置文件来说,它是一个好办法,但它实际上增加了复杂性,尤其是在运行包
含大量类声明的项目时。虽然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配置文件更清晰。当一个配置文件中定义了大量的类时,它可以显著提高可读性。
4. 对于构造函数参数匹配,类型比下标好
当构造函数含有一个以上同种类型的参数,或者属性值的标签已经被占用时,Spring允许使用从0开始的下标来避免混淆。例如:
<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中设置abstract=true,然后在子bean中指定parent引用。例如:
<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类从abstractService类继承companyName属性的值——lizjason。如果一个bean没有指定类或工厂方法,那么这个bean便是抽象的。
6. 在导入时,首选通过ApplicationContext来汇编bean定义
像Ant脚本中的导入一样,Spring的import元素对于汇编模块化的bean定义来说是很有用的。例如:
<beans>
<import resource="billingServices.xml"/>
<import resource="shippingServices.xml"/>
<bean id="orderService"
class="com.lizjason.spring.OrderService"/>
<beans>
然 而,相对于使用import在XML配置中进行预汇编,通过ApplicationContext来配置这些bean则显得更加灵活。使用
ApplicationContext的话,XML配置也更易于管理。可以向ApplictionContext构造函数传递一组bean定义,如下:
String[] serviceResources =
{"orderServices.xml",
"billingServices.xml",
"shippingServices.xml"};
ApplicationContext orderServiceContext = new
ClassPathXmlApplicationContext(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的全部属性(或某类属性)时,依赖性检查便显得很有用。
<bean id="orderService"
class="com.lizjason.spring.OrderService"
dependency-check="objects">
<property name="companyName"
value="lizjason"/>
<constructor-arg ref="orderDAO"/>
</bean>
在这个例子中,容器确保为orderService bean设置的属性不是primitives或collections。也可以为所有的bean设置默认依赖性检查,但是我们很少这样做,因为有些bean属性根本就不必设置。
9. 为每个配置文件添加首部注释
最好使用描述性的id和名称来取代XML配置文件中的内置注释。此外,添加一个配置文件首部也很有用,它可以概述文件中所定义的bean。可以选择将描述添加到description标签中。例如:
<beans>
<description>
This file defines billing service
related beans and it depends on
baseServices.xml,which provides
service bean templates...
</description>
...
</beans>
使用description标签的一个好处是可以轻松地利用工具从标签中选获取描述内容。
10. 对于更改,团队成员要积极交流
在重构Java代码时,需要随时更新配置文件并通知团队成员。XML配置文件也是代码,它们是应用程序的至关重要的部分,但是它们难于阅读和维护。大部分情况下,需要同时阅读XML配置文件和运行中的Java代码。
11. Setter注入优于构造函数注入
Spring提供了3种类型的依赖注入:构造函数注入(constructor injection)、setter注入(setter injection)和方法注入(method injection)。我们一般只用前两种。
<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类使用的是构造函数注入,而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配置文件。
发表评论
-
OFBIZ应用程序结构
2010-11-03 11:03 27141)ofbiz可以整个看作一 ... -
jboss 的debug启动4法
2010-06-05 23:36 6647方式一: 使用myeclipse,全自动化,不再赘述 ... -
数据绑定
2010-04-10 18:32 1342原文地址:http://livedocs.adobe.com/ ... -
Log4J 最佳实践之全能配置文件
2009-09-21 22:44 895给出得Log4J配置文件实现了输出到控制台,文件,回滚文件 ... -
glassfish下错误两个
2009-06-07 23:45 18241、在配置文件中开启jsp预编译: <!-- u ... -
Blaze Data Services还是LiveCycle Data Services?
2009-05-17 22:22 2399摘要 现在已经有不少 ... -
Junit入门和基本运行结构分析
2009-05-11 09:26 2370The test code must be writte ... -
servlet 补习1
2009-04-01 17:54 1060getServletPath: /pic.upload get ... -
精通批处理
2009-03-04 17:17 1274ECHO 墨西哥语: 8 ECHO 墨 ... -
软件开发者面试百问
2009-03-03 14:35 893想雇到搞软件开发的聪 ... -
spring配置5种方法
2009-02-23 22:27 8651、 <context-param> < ... -
sevlet上传原理
2009-02-13 09:55 1437点滴:最近基于apache的上传组件写了一个配置上传的组件。想 ... -
j2ee页面转向
2009-02-12 16:06 1086各种框架的不管看起来 ... -
spring事务配置二
2009-02-10 11:20 1357面介绍一种优秀的事务代理配置策略:采用这种配置策略,完全可以避 ... -
spring事务配置一
2009-02-10 11:19 1478通常建议采用声明式事务管理。声明式事务管理的优势非常明显:代码 ... -
活用SiteMesh,一个装饰器就可支撑整个网站结构
2009-01-27 11:00 2023在寻求网站结构的高效 ... -
spring中数据库的配置
2009-01-27 10:11 1375对于不同的数据库存取需求,我们使用JDBC来解决这个问题,对 ... -
log4j(1)配置日志的去向
2009-01-25 00:19 1117log4j 1.在Eclipse ... -
j2ee的认知
2009-01-23 17:52 1189关于spring,struts,hibernate,sitem ... -
翻译力作 - Advanced SiteMesh
2008-11-27 09:34 1146假设你打算结合多种技术来构建一个企业级web站点。比如,你准备 ...
相关推荐
综上所述,本"spring cloud最佳实践项目"是一个全面展示Spring Cloud微服务架构的实战案例,涵盖了多种分布式事务处理策略,对于理解和应用Spring Cloud有着极高的参考价值。通过深入研究此项目,开发者不仅能掌握...
在使用 Spring Cloud 时,需要注意到由于“非法密钥大小”而导致的异常问题,可以通过安装 Java 加密扩展(JCE)无限强度管理策略文件来解决。 Spring Cloud 根据非限制性 Apache 2.0 许可证发布,开发人员可以自由...
2. **配置文件**:在Spring的XML配置文件中,需要添加Spring Security的相关配置,例如定义安全拦截器、认证提供者、访问决策策略等。 3. **代码集成**:在业务代码中,可以通过`@Secured`注解来标记需要权限控制的...
这些视频课程结合源码分析和课件学习,可以帮助开发者深入理解SpringBoot和SpringCloud的核心原理,并掌握实际应用中的最佳实践。对于想要在微服务领域深入发展的IT专业人士来说,这是一个非常有价值的资源。通过...
以下是对Spring整合Quartz使用实例的详细说明: 1. **Quartz简介** Quartz是一个强大的、完全开源的作业调度框架,它支持复杂的调度策略,如按日期、时间间隔或自定义表达式执行。Quartz可以在Java应用中作为独立...
而spring.pdf文件可能是Spring的进阶教程或者特定主题的深度探讨,可能包括最佳实践、案例研究或常见问题解答,对于深化对Spring的理解和提升开发技能都非常有帮助。 综上所述,Spring 2.0中文手册及使用指南是Java...
本文将深入探讨如何使用Spring进行数据访问,包括其数据访问组件的使用、配置以及最佳实践。 首先,Spring框架提供了多种数据访问机制,如JDBC(Java Database Connectivity)、ORM(Object-Relational Mapping)...
- 最佳实践中,推荐使用HibernateTemplate或者HibernateDaoSupport,它们是Spring提供的对Hibernate的简单包装,可以避免手动管理Session和事务。 7. **测试与优化** - 使用JUnit进行单元测试,验证整合是否成功...
文档中提到的微服务最佳实践可能包括服务发现、API网关、容错机制和持续集成/持续部署(CI/CD)策略等。 8. **Spring Cloud Config**: Spring Cloud Config是一个分布式配置中心,它支持微服务配置的集中管理和版本...
这份源码旨在帮助读者更好地理解和实践Spring框架的各种功能和最佳实践。 Spring框架是Java开发中最受欢迎的轻量级应用框架之一,它为构建企业级应用程序提供了全面的解决方案。通过分析这份源码,我们可以学习到...
Spring提供了多种缓存解决方案,包括基于注解的缓存支持,帮助开发者轻松地集成缓存策略到他们的应用程序中。 #### 使用Spring构建RESTful Web服务 第十一章聚焦于如何使用Spring构建RESTful Web服务。RESTful架构...
7. **测试**:涵盖单元测试、集成测试的策略,以及Spring Boot提供的测试支持,如@Test标签和Mockito库的使用。 8. **部署与运行**:讨论如何打包Spring Boot应用为可执行JAR或WAR文件,以及如何在Docker容器、云...
12. **备考策略**:分享备考技巧,模拟试题和解答,帮助考生了解考试格式和要求。 通过阅读《Spring Professional Certification Study Guide》并结合提供的PDF资源,学习者可以系统地学习Spring框架,提升自己的...
【Spring使用Redis1】这篇文章是关于如何在Spring项目中整合并使用Redis的简要指南。首先,Redis被定义为一个开源、基于内存的数据结构存储系统,它可以作为一个数据库、缓存和消息中间件。Redis提供了丰富的数据...
这些策略可以根据业务需求灵活选择,以实现最佳事务处理。 在实际项目中,Spring TX还与Spring Data JPA、Hibernate等ORM框架紧密结合,提供了无缝的事务管理。例如,当使用JPA进行数据库操作时,Spring TX能够自动...
Spring Web是Spring框架的核心模块之一,它为构建Web应用程序提供了基础支持。在Spring框架中,Spring Web主要负责处理...在实际项目中,学习并掌握Spring Web的各项功能和最佳实践,将有助于提升开发效率和代码质量。
这部分也涵盖了Spring框架下的测试策略,包括DAO和JDBC测试支持。 数据访问章节涵盖了使用Spring JDBC框架进行数据访问的技术,包括数据库连接管理、批量操作、异常处理机制以及内嵌数据库支持。 ORM和数据访问...
4. **Security增强**:Spring Security在5.3.20中提供了更丰富的安全控制和认证策略,增强了OAuth2的支持。 5. **WebSocket改进**:WebSocket API进行了优化,提升了与客户端的交互体验。 6. **错误处理增强**:...
- **标准Java实践:** SpringRoo遵循Java的最佳实践,这意味着生成的应用程序符合行业标准。 - **易于学习和使用:** SpringRoo的设计考虑了易用性,即使是初学者也能很快上手。 - **无工程妥协:** 使用SpringRoo并...
在Spring Security的官方文档中,包含了详细的配置指南、API参考、示例代码和最佳实践,帮助开发者深入理解并有效使用这个框架。例如,5.1版本的新特性包括对Servlet和WebFlux的支持增强,以及与其他第三方库的集成...