以前的项目都没有用到annotation,大量的xml配置文件让所有的开发人员都有一点心寒。于是最近的一个项目大范围使用annotation的项目,虽然在项目之初,我是绝对站在annotation这一边说话的,但是随着项目的推进,慢慢的我开始体会到annotation的一些不足,甚至有些怀恋xml了。
因为之前团队里很多人对大量xml产生一些恐惧或者说是反感,认为大量的xml让人维护起来实在是眼花缭乱,而且由于xml里的很多配置都基本是差不多的,在复制粘贴这些配置的时候很容易忘记改掉某些地方而产生问题。所以当一些拥有annotation的框架出现在新项目选型的范围之内时,大家都十分愿意接受它。问题就这样产生了,annotation被我们当成了救命稻草,几乎只要是能用annotation的地方绝对不用xml配置。
我们采用了struts2+spring2.5+hibernate3的主框架结构。在刚开始的一段时间annotation“成绩斐然”,我们所有的xml配置文件的内容几乎压缩到比以前方式配置helloworld多不了多少的程度了。大家对这样的成果都十分的满意,于是annotation开始被我们神话了。随着框架搭建的深入,事务、日志、安全等等考虑加入其中以后我发现问题有些不对劲了。采用annotation配置事务需要到每一个负责事务的类里面去编写相关的规则,很多相似的东西都要在每个类里重复的写。而且如此讲事务控制的代码分散在类中实在是不便于管理和调试修改。此时,我开始对annotation产生了怀疑。于是改了我的qq留言,没过2天javaeye上也看到了相关的讨论。与此同事,老大也发现了类似的一些问题。例如,我们的实体上都有很多的标签去定义,这样如果开发者仅仅是想看看某个实体有什么属性,他将不得不看到一大堆的标签,而且如果我们将此实体当作一个普通的pojo使用的话,也会附带很多无用的annotation在其上。
当天下午,我通过IM向以前的一位前辈请教,我问他对于xml和annotation的看法。问为什么现在annotation如此的火爆,有些用起来并不好的地方也被滥用了。他的回答是:我最近好一段时间都没在开发一线了,具体的可能我也说不太准,可能技术人员都喜欢捣鼓新技术吧。我觉得他的话也有一定的道理。。。。。
后来我又好好的想了一想,annotation现在肯定是被我们滥用了,这个情况需要改善。那么什么时候该用annotation什么时候该用xml呢?既然这么些流行的框架都提供的annotation的方式,那他们的用意又是什么呢?我还有几点疑惑:
1.用annotation配置难道不是配置吗?我们以前是害怕大量的xml,难道我们就不害怕大量的anntation吗?xml还是在一个地方管理,annotation散布在类中,如果后期发现前期一些设定不合适,例如事务等等,难道还跑到每个类里去修改吗?
2.用annotation注释spring管理的bean,如果我们忘记写annotation或者我们写错了,那么只用在运行代码的时候(可能是测试用例)才能发现这些问题,并且还可能打开多个类去检查。而xml的配置一般都是集中在一起便于检查,而且也只打开一个xml文件。
3.我们为什么要配置?我认为配置的初衷就是为了方便更改可配置的项,方便统一管理。换句话说就是从代码中抽出可能的变化。既然是这样,那么annotation把配置信息分散到类中的行为岂不是有为这个初衷?
由于有了这些疑问我自己都不能给自己一个很好的解释,所以我在google上又搜索一些关于xml和anntation的讨论。发现有一些观点还是不错的。
有一种说法就是java语法过于对象化,以至于很多操作调用的过程规规矩矩过于繁琐,annotation是sun为了弥补这样的情况提高java语法的功能而产生的产物。所以annotation应该用于加强java语法的地方而不是用在做配置的方面。例如在action里通过annotation来简化传递参数的过程等。我觉得还是比较合理的解释。
还有一种说法就是认为annotation适合于稳定的建模过程中,用于那些不易更改的对象。提高内聚,认为这些行为本来就属于模型本身。这个我也基本同意,只要是这个模型或者实体不用于其他方面,职责单一的情况下是比较合理的说法。
既然看上去xml并没有什么不好,那么大家为什么有些反感xml呢?
一个好几千行的xml确实让人眼花缭乱。我觉得首先是xml划分要合理,如果比较多一定要细分模块的配置文件,让模块内的配置尽量的少一些,看起来比较舒服。
其次就是xml配置项中有很多看起来都重复的地方,这个可以通过泛型通用类去解决一些只有CRUD相关操作的类的配置,可以大大减少配置文件的大小和重复性。又或是充分利用一些新版本框架对通配符的匹配来减少相似配置的出现。
最后总结一下,目前看来annotation和xml谁是谁非似乎还没有一个完全让大多数人信服的说辞。希望随着实际应用的增多,最后能有一个让大多数人信服的最佳实践产生。也希望自己在当前的项目中,进一步的对这2者的进行更深入的理解比较。实践才是检验真理的唯一标准啊。
分享到:
相关推荐
标题中的“对话框乱弹的小程序源码”指的是一个编程项目,它利用MFC(Microsoft Foundation Classes)库在VC++环境中编写,目的是创建一个整人性质的程序。这个小程序一旦运行,用户点击“开始”按钮后,会在Windows...
总的来说,通过阅读这份简谱,我们可以了解《乱弹爱丽丝》的基本旋律结构和双手配合方式。演奏者需要理解每个数字的音高,并结合节奏感来练习,逐渐掌握这首曲子的精髓。同时,对简谱的熟悉程度和对音乐的理解都将...
使用fiddler工具进行抓包,使用python进行osc乱弹抢沙发
这篇论文《浅析新媒介生态环境下广播娱乐节目的编辑特征——以FM101.1西安乱弹“刘翔来了”为例》深入探讨了在新媒体环境下,广播娱乐节目如何适应和利用新媒介特性,实现自身内容创新与传播效果的提升。通过对FM101...
《浅析新媒介生态环境下广播娱乐节目的编辑特征——以FM101.1西安乱弹“刘翔来了”为例》这篇文档探讨了在新媒体环境下广播娱乐节目编辑的新特点,以陕西地方电台“刘翔来了”为例进行深入分析。广播节目在传统媒介...
《浅析新媒介生态环境下广播娱乐节目的编辑特征——以FM101.1西安乱弹“刘翔来了”为例》.zip
关于Ajax的数据格式选择,XML曾是标准,但XML的冗余信息和处理复杂性使得JSON(JavaScript Object Notation)成为更优的选择。JSON以键值对形式存储数据,与JavaScript天生兼容,无需额外转换,且在.NET框架中支持...
传统企业面临着前所未有的挑战和机遇,如何在变革的大潮中找到自己的位置,实现成功转型并与互联网紧密结合,是当前众多企业家和管理者必须思考的问题。康国庆在into沙龙的分享中,探讨了这一主题,旨在为传统企业...
修复单类代码生成器4个问题。 2.新增创建加载数据库时,表名过滤功能。 3.表名生成命名规则,字符串替换功能。 4.模板中字段排序方法公开。 5.字段默认值函数的处理。 6.导出的sql脚本中,单引号 '的问题。...
在程序设计中,这种不断弹窗的效果通常是通过循环结构和消息对话框函数实现的。 在VB中,`MsgBox`函数用于显示一个带有指定文本、图标和按钮的消息框。这个程序可能是设置了一个无限循环,每次循环都会调用`MsgBox`...
8. **安装文件**:“Ncstudio V5.4.55 中文 Setup yc”是该软件的安装程序,用户可以通过这个文件在计算机上安装和配置Ncstudio,享受其带来的便捷和高效。 9. **兼容性**:Ncstudio通常会兼容主流的操作系统,如...
浙江的传统戏剧种类繁多,如婺剧、木偶戏、乱弹、和剧等,它们融合了唱、做、念、打,形成了各自鲜明的艺术特色。王海清、胡定才等戏剧表演艺术家,通过他们的精彩演绎,使传统戏剧得以传承和发展。 这些非物质文化...
8. 乱弹戏曲:乱弹是河北的传统戏曲艺术形式,历史悠久,是当地人民的文化遗产,也是中国戏曲的重要组成部分。 以上知识点涵盖了金融交易、行政职务、合同法、职业道德、公务员制度、信用消费、个人隐私权以及传统...
10. **办公室管理**:下班后关闭用电器和接线板,禁止乱弹烟灰和乱扔烟蒂,下班后检查公共区域,确保遵守消防安全规定。 11. **项目综合和工作人员**:项目应开展日常消防安全检查,员工应接受消防安全培训,了解并...
经历了数月艰苦的开放和程序员最痛苦的测试,今天,世上最强,最完善,最稳定和测试最充分,文档最完整的旗舰版和平之翼Java通用代码生成器SMEU 3.2.0 正式版乌篷船盛装发布了。欢迎大家下载使用。 请至本项目码云...
这里的“悠然乱弹”可能是指作者以轻松幽默的方式讨论技术话题,比如螺旋矩阵和蛇型矩阵的实现。这些内容可能并不是书中主要介绍的技术细节,而是穿插在书中,作为技术讨论之外的调剂。 4. 未分类: 这一部分可能...
文件列表中的“八木天线乱弹(一)原理篇”似乎是一系列介绍八木天线原理的资料,可能包含天线的设计、计算方法、制作步骤以及实际应用等内容。例如,“页面_01.jpg”可能是介绍八木天线基本结构的图解,“页面_05....
此外,像织梦乱弹和理想帝国这类网站提供了DW、FW、PS、FL等工具的插件、滤镜、字体、样式以及JS、ASP、PHP、DHTML等技术的教程和资源。 【综合学习平台与资源分享】 一些综合性的学习平台,如3D壁纸和模型下载...