`
cats_tiger
  • 浏览: 276542 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

对Annotations忍耐的极限,谈谈常用框架Annotations使用感受

阅读更多
今天看到iBatis3已经支持Annotation了,不禁有点头晕目眩,看来又一次的抉择开始了。Annotions的确带来了便利,看看Spring的配置:
@Controller
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class DeptRuleAction extends BaseAction {
  @Autowired
  private DeptRuleManager manager;
  @Autowired
  private LoginUserService loginUserSerivce;
  @PostConstruct
  public void init() {
  }
  @Transactional
  //Action哪里有事务呀,呵呵
}

嗯,的确比XML简单,也容易维护。也许有其他的问题,比如自动装配带来的隐忧,比如静态数据的注入等等。但是瑕不掩瑜,Spring的Annotation是我喜欢的。
再看看Hibernate:
@Entity
@Table(name = "capital_sources")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class CapitalSource extends BaseModel {
  
  private Integer id;
  @Id
  @GeneratedValue(generator = "hibseq")
  @GenericGenerator(name = "hibseq", strategy = "hilo")
  @Column(name = "id", unique = true, nullable = false)
  public Integer getId() {
    return id;
  }
}

hibernate的配置也很简单(上面的代码已经算是复杂了),而且遵循COC风格,与Spring配合几乎做到了领配置。这个,我也喜欢。
Struts2的Annotaions就比较夸张了,下面的代码是Annotaion验证:
@Validations(requiredStrings = {
      @RequiredStringValidator(fieldName = "model.loginId", message = "登录名是必须的."),
      @RequiredStringValidator(fieldName = "model.password", message = "密码是必须的."),
      @RequiredStringValidator(fieldName = "model.email", message = "电子邮件是必须的."),
      @RequiredStringValidator(fieldName = "model.confirmPwd", message = "请两次输入密码.") }, stringLengthFields = { @StringLengthFieldValidator(fieldName = "password", minLength = "3", maxLength = "32", message = "密码应多于3字符", trim = true) }, emails = { @EmailValidator(fieldName = "model.email", message = "请输入正确的e-Mail.") }, expressions = { @ExpressionValidator(message = "两次输入的密码必须相同.", expression = "model.password==model.confirmPwd") })
public String save() {
}


晕了,这哪里是简化,分明是代码污染!再看看strut2的Action配置:
@Action(value="/different/url", 
    results={@Result(name="success", type="httpheader", params={"status", "500", "errorMessage", "Internal Error"})}
  )
  public String execute() {
    return SUCCESS;
  }

这是struts2文档中的例子,我无语了.....
其实struts2的XML配置Action已经很简单了:
<action name="*/*" class="{1}Action" method="{2}">
		     <result name="index" type="dispatcher">/pages/vehicles/basic/{1}/index.jsp</result>
		     <result name="input">/pages/vehicles/basic/{1}/edit.jsp</result>
		     <result name="success" type="redirect">{1}/index.do</result>
		 </action>		 

在实际的项目中,我用这段XML匹配了8个Action,每个Action都有完整的CRUD操作,这,要比Annotation简单多了吧。
BTW:要说MVC框架,我还是更喜欢SpringMVC,用它做过一个小项目,那才叫零配置,那才叫灵活,那才叫零侵入....可惜我们已经上了Struts2的船了。

所以,Annotations就像盐,放少了没有味道,放多了就候儿了。现在,iBatis又为我们带来了新的Annotations,不知道这道菜是咸还是淡。
分享到:
评论
28 楼 freej 2009-08-12  
用annoation最大的缺点就是如果要更改配置需要重新编译Java类,而且配置与代码混为一谈。如果用xml就没有这种麻烦,所以至今我的建议还是尽可能的少用annoation。
27 楼 haole 2009-08-12  
cats_tiger 写道
haole 写道
问一个题外问题,在spring MVC annotations中,表示session的标注中,如果session过期如何处理,即使判断为null,也是报后台错,最好能够判断,给出合适的提示。

永远都不要用session吧。
关于SpringMVC,比较令人讨厌的是总离不开request之类的servlet对象,我们参考了struts2的做法,将request对象绑定在ThreadLocal中,接合springMVC的interceptor,可以很好的解决这个问题。至于Session,如果万不得已非要使用,那么就从request中获取吧。



谢谢,能够不用session当然很好,但是在一般管理软件中避开session比较困难吧?
26 楼 dwangel 2009-08-12  
struts2 用annotations来声明action属于哪个package方便

声明action的result麻烦。

所以result还是用xml配,或者利用新特性中的convention的自动查找。
25 楼 lw223 2009-08-12  
annotations 一个被疯炒的东西。本身是个好东西,但是现在被炒过了。弄得现在要是没有用过annotations,就不好意思和人打招呼
24 楼 whh121 2009-08-12  
呵呵,其实用annotation在某些方面还是很方便的,例如AOP切面编程,事务控制,权限管理等,在这一块,大家可以好好研究一下,这里就不举例子了。真正的高手应该是annotation+xml都要用,对整个系统的耦合程度了解了,合理应用,会大大提高便捷。
23 楼 cats_tiger 2009-08-12  
mysoko 写道
cats_tiger 写道
mysoko 写道
struts2实现restful就需要annotation

不是吧,用XML可以的。


je回复的地址,你如何xml:
http://www.iteye.com/forums/39/topics/444789/posts/1126891/quote

我的意思s2的restful用annotation简单,比如
@Namespace("/forums/{forumId}/topics/{topicId}")
PostsController就很简单了。


曾经对strut2的restful插件很感兴趣了一段时间,后来发现这不是真正意义上的REST,只不过URL有Rest的风格罢了。而且,对开发效率的提升没有什么帮助,所以后来就不用了。@Namespace("/forums/{forumId}/topics/{topicId}")比XML的namespace简单吗,没有看出来。XML的还可以复用,只要遵循COC的原则,一个配置文件可以匹配很多Action。
22 楼 mysoko 2009-08-12  
cats_tiger 写道
mysoko 写道
struts2实现restful就需要annotation

不是吧,用XML可以的。


je回复的地址,你如何xml:
http://www.iteye.com/forums/39/topics/444789/posts/1126891/quote

我的意思s2的restful用annotation简单,比如
@Namespace("/forums/{forumId}/topics/{topicId}")
PostsController就很简单了。

21 楼 cats_tiger 2009-08-12  
haole 写道
问一个题外问题,在spring MVC annotations中,表示session的标注中,如果session过期如何处理,即使判断为null,也是报后台错,最好能够判断,给出合适的提示。

永远都不要用session吧。
关于SpringMVC,比较令人讨厌的是总离不开request之类的servlet对象,我们参考了struts2的做法,将request对象绑定在ThreadLocal中,接合springMVC的interceptor,可以很好的解决这个问题。至于Session,如果万不得已非要使用,那么就从request中获取吧。
20 楼 cats_tiger 2009-08-12  
rongxh7 写道
各大开源框架都在加大对Annotation的支持,这也是应Java新版本的需要。若能活用,能对开发带来较大的便利。
Spring从2.0开始对Annotation支持,当时可能不够完善,但2.5以及以后稳定版本的3.0会更加完善。
同理,iBatis刚开始支持Annotation,也需要在一定时间的更新版本中完善。
Hibernate的Annotation本就是Hibernate项目下的一个子框架,有着较久的历史,现在的版本已发展3.4.0GA。随着Hibernate得到Java官方的认同,Hibernate Annotation也大大弥补了JPA的不足。
至于Struts2的Validation框架,不管是XML形式还是Annotation形式,个人都不建议使用。直接写Java语句验证或者通过整合Ajax的方式异步验证,也不失为一种好方法。Struts 2.0加进的Annotation也是不完善的版本,但2.1.6GA版本,Annotation在Action配置方面做得非常不错,不妨学习使用。

很多时候,新事物都需要经历漫长的时间才能让人们接受,原因之一是新事物尚不够完善,原因之二是人们的观念还不能转变。Annotation的目的是使那些厌倦了大量XML配置文件的开发者,能够以另一种便捷的方式来开发,本意是好的。而且,那些框架的背后,都会有一群积极的开发者正在不断完善Annotation方面的API,所以,会越来越完善。

如果Annotation这么容易就能令楼主达到忍耐的极限的话,可能,Annotation真的不适合你吧!建议楼主以后勿用Annotaion也,用回XML配置文件,这样对你会好点。开玩笑说一句:搞程序的最重要是要确保让自己心情舒畅,自寻烦恼就没有必要了!呵呵

我受不了的是struts2 Acion配置将xxx.jsp之类的东西写在代码里面,另外,如果一个Action的Result多一些,就更麻烦了。还有就是XML+COC风格的配置已经足够简单,比Annotation还要简单,所以觉得Annotation有点鸡肋了。
至于验证,我完全同意你的观点。
19 楼 haole 2009-08-12  
问一个题外问题,在spring MVC annotations中,表示session的标注中,如果session过期如何处理,即使判断为null,也是报后台错,最好能够判断,给出合适的提示。
18 楼 cats_tiger 2009-08-12  
mysoko 写道
struts2实现restful就需要annotation

不是吧,用XML可以的。
17 楼 mysoko 2009-08-12  
struts2实现restful就需要annotation
16 楼 rongxh7 2009-08-12  
各大开源框架都在加大对Annotation的支持,这也是应Java新版本的需要。若能活用,能对开发带来较大的便利。
Spring从2.0开始对Annotation支持,当时可能不够完善,但2.5以及以后稳定版本的3.0会更加完善。
同理,iBatis刚开始支持Annotation,也需要在一定时间的更新版本中完善。
Hibernate的Annotation本就是Hibernate项目下的一个子框架,有着较久的历史,现在的版本已发展3.4.0GA。随着Hibernate得到Java官方的认同,Hibernate Annotation也大大弥补了JPA的不足。
至于Struts2的Validation框架,不管是XML形式还是Annotation形式,个人都不建议使用。直接写Java语句验证或者通过整合Ajax的方式异步验证,也不失为一种好方法。Struts 2.0加进的Annotation也是不完善的版本,但2.1.6GA版本,Annotation在Action配置方面做得非常不错,不妨学习使用。

很多时候,新事物都需要经历漫长的时间才能让人们接受,原因之一是新事物尚不够完善,原因之二是人们的观念还不能转变。Annotation的目的是使那些厌倦了大量XML配置文件的开发者,能够以另一种便捷的方式来开发,本意是好的。而且,那些框架的背后,都会有一群积极的开发者正在不断完善Annotation方面的API,所以,会越来越完善。

如果Annotation这么容易就能令楼主达到忍耐的极限的话,可能,Annotation真的不适合你吧!建议楼主以后勿用Annotaion也,用回XML配置文件,这样对你会好点。开玩笑说一句:哪种方式适合你的就用哪种吧,搞程序的最重要是要确保让自己心情舒畅,自寻烦恼就没有必要了!呵呵
15 楼 lunch 2009-08-12  
Struts2的Annoation验证着实的不好用呢.
14 楼 cats_tiger 2009-08-12  
DoubleEO 写道
用spring和hibernate的注解,决定能做到0配置,现在就用着呢,深有体会

不是吧,应该是“准0配置”,XML还是有一点的。
13 楼 DoubleEO 2009-08-12  
用spring和hibernate的注解,决定能做到0配置,现在就用着呢,深有体会
12 楼 cats_tiger 2009-08-12  
haojia0716 写道
我认为annotation只有orm和aop方便,其他还是用xml。
但是作为框架,annotation和xml两种配置方式都是要提供的。

是呀,站在框架制作的角度是应该这样。但是象struts2那样,也有点过分。
11 楼 arienya 2009-08-12  
我不喜欢用annoation方式,感觉找不到一个统一看配置的地方,而且用annoation还很乱.
10 楼 Dreamer 2009-08-12  
架构设计需要平衡之美,再好的东西要是用的过了分也会变味儿的。个人觉得Struts2中的form验证信息还是不要使用annotation为好。
9 楼 mark_wang_9527 2009-08-12  
其实感觉关键在于Annotation里面没有更加简介的对象语言,如果能够自建annotation对象并自动解析这个对象就OK了

相关推荐

    Android Annotations框架使用实例

    Android Annotations框架是一个强大的工具,它通过使用Java注解(Annotations)来简化Android应用的开发,提高了编码效率。本文将深入探讨Android Annotations的使用方法和优势,帮助开发者更好地理解和运用这一框架...

    annotations-13.0-API文档-中文版.zip

    赠送jar包:annotations-13.0.jar; 赠送原API文档:annotations-13.0-javadoc.jar; 赠送源代码:annotations-13.0-sources.jar; 赠送Maven依赖信息文件:annotations-13.0.pom; 包含翻译后的API文档:...

    swagger-annotations-2.1.2-API文档-中文版.zip

    赠送jar包:swagger-annotations-2.1.2.jar; 赠送原API文档:swagger-annotations-2.1.2-javadoc.jar; 赠送源代码:swagger-annotations-2.1.2-sources.jar; 赠送Maven依赖信息文件:swagger-annotations-2.1.2....

    annotations-23.0.0-API文档-中文版.zip

    赠送jar包:annotations-23.0.0.jar; 赠送原API文档:annotations-23.0.0-javadoc.jar; 赠送源代码:annotations-23.0.0-sources.jar; 赠送Maven依赖信息文件:annotations-23.0.0.pom; 包含翻译后的API文档:...

    swagger-annotations-1.6.2-API文档-中文版.zip

    赠送jar包:swagger-annotations-1.6.2.jar; 赠送原API文档:swagger-annotations-1.6.2-javadoc.jar; 赠送源代码:swagger-annotations-1.6.2-sources.jar; 赠送Maven依赖信息文件:swagger-annotations-1.6.2....

    audience-annotations-0.5.0-API文档-中英对照版.zip

    赠送jar包:audience-annotations-0.5.0.jar; 赠送原API文档:audience-annotations-0.5.0-javadoc.jar; 赠送源代码:audience-annotations-0.5.0-sources.jar; 赠送Maven依赖信息文件:audience-annotations-...

    swagger-annotations-1.5.20-API文档-中文版.zip

    赠送jar包:swagger-annotations-1.5.20.jar; 赠送原API文档:swagger-annotations-1.5.20-javadoc.jar; 赠送源代码:swagger-annotations-1.5.20-sources.jar; 赠送Maven依赖信息文件:swagger-annotations-...

    hibernate-annotations-3.4.0.GA

    Hibernate是Java领域中广泛应用的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。而Hibernate Annotations是Hibernate框架的一个重要组成部分,它引入了基于注解...

    swagger-annotations-1.5.24-API文档-中文版.zip

    赠送jar包:swagger-annotations-1.5.24.jar; 赠送原API文档:swagger-annotations-1.5.24-javadoc.jar; 赠送源代码:swagger-annotations-1.5.24-sources.jar; 赠送Maven依赖信息文件:swagger-annotations-...

    jackson-annotations-2.9.0-API文档-中文版.zip

    赠送jar包:jackson-annotations-2.9.0.jar; 赠送原API文档:jackson-annotations-2.9.0-javadoc.jar; 赠送源代码:jackson-annotations-2.9.0-sources.jar; 赠送Maven依赖信息文件:jackson-annotations-2.9.0....

    j2objc-annotations-1.3-API文档-中文版.zip

    赠送jar包:j2objc-annotations-1.3.jar; 赠送原API文档:j2objc-annotations-1.3-javadoc.jar; 赠送源代码:j2objc-annotations-1.3-sources.jar; 赠送Maven依赖信息文件:j2objc-annotations-1.3.pom; 包含...

    jackson-annotations-2.13.1-API文档-中文版.zip

    赠送jar包:jackson-annotations-2.13.1.jar; 赠送原API文档:jackson-annotations-2.13.1-javadoc.jar; 赠送源代码:jackson-annotations-2.13.1-sources.jar; 赠送Maven依赖信息文件:jackson-annotations-...

    error_prone_annotations-2.3.2-API文档-中文版.zip

    赠送jar包:error_prone_annotations-2.3.2.jar; 赠送原API文档:error_prone_annotations-2.3.2-javadoc.jar; 赠送源代码:error_prone_annotations-2.3.2-sources.jar; 赠送Maven依赖信息文件:error_prone_...

    开发工具 jackson-annotations-2.8.6

    开发工具 jackson-annotations-2.8.6开发工具 jackson-annotations-2.8.6开发工具 jackson-annotations-2.8.6开发工具 jackson-annotations-2.8.6开发工具 jackson-annotations-2.8.6开发工具 jackson-annotations-...

    error_prone_annotations-2.10.0-API文档-中英对照版.zip

    赠送jar包:error_prone_annotations-2.10.0.jar; 赠送原API文档:error_prone_annotations-2.10.0-javadoc.jar; 赠送源代码:error_prone_annotations-2.10.0-sources.jar; 赠送Maven依赖信息文件:error_prone_...

    jackson-annotations-2.11.4-API文档-中文版.zip

    赠送jar包:jackson-annotations-2.11.4.jar; 赠送原API文档:jackson-annotations-2.11.4-javadoc.jar; 赠送源代码:jackson-annotations-2.11.4-sources.jar; 赠送Maven依赖信息文件:jackson-annotations-...

    j2objc-annotations-1.1-API文档-中文版.zip

    赠送jar包:j2objc-annotations-1.1.jar; 赠送原API文档:j2objc-annotations-1.1-javadoc.jar; 赠送源代码:j2objc-annotations-1.1-sources.jar; 赠送Maven依赖信息文件:j2objc-annotations-1.1.pom; 包含...

    hibernate3-[annotations-commons-annotations].rar

    它是使用Hibernate进行开发时必不可少的部分,提供了对数据库的基本操作支持,如实体的创建、更新、删除和查询。 接下来,我们重点讨论`hibernate3-annotations.jar`。这是Hibernate3引入注解支持的扩展库,使得...

    hibernate-annotations.jar

    《Hibernate Annotations 框架详解》 在Java领域,Hibernate是一个广泛应用的对象关系映射(ORM)框架,它极大地简化了数据库操作。而`hibernate-annotations.jar`是Hibernate框架中的一个重要组件,主要负责处理...

    DETRAC-Train-Annotations-XML

    接着,他们会使用这些样本训练一个深度学习模型,如使用TensorFlow、PyTorch或Keras等框架。训练过程中,模型会逐步优化其权重,以最小化预测边界框与真实边界框之间的差异。最后,通过在独立的测试集上评估模型性能...

Global site tag (gtag.js) - Google Analytics