`
cats_tiger
  • 浏览: 276540 次
  • 性别: 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,不知道这道菜是咸还是淡。
分享到:
评论
48 楼 steeven 2009-08-16  
spring验证的annotation太让人崩溃鸟。
看看jsr的验证标准,还是比较简单,hibernate主要参与的。
47 楼 iaimstar 2009-08-14  
caoyangx 写道
鸦雀焉知鸿鹏之志

我是来拜你的头像的
46 楼 bonny 2009-08-14  
很多项目的Annotations用的让人崩溃。看这些代码简直受罪。

如果是框架内部还好,如果业务类中也这么用,想让人死呢
45 楼 Blithe 2009-08-13  
写程序 又不是玩配置 真是的
44 楼 andyyehoo 2009-08-13  
Frederick 写道
想用annotation来配置web的controller,那么都不可能简单。spring mvc的annotation我一开始也想用,但是最后还是放弃了。
因为我无法相信如果一个请求有几十个参数传递的话,使用annotation配置会是什么样子。

任何一种技术都有其适用范围,试图在这个范围之外使用,就会变成无比糟糕的技术,无论它原本有多优秀。


完全赞同最后一句话,很有大家风范
43 楼 Frederick 2009-08-13  
想用annotation来配置web的controller,那么都不可能简单。spring mvc的annotation我一开始也想用,但是最后还是放弃了。
因为我无法相信如果一个请求有几十个参数传递的话,使用annotation配置会是什么样子。

任何一种技术都有其适用范围,试图在这个范围之外使用,就会变成无比糟糕的技术,无论它原本有多优秀。
42 楼 zozoh 2009-08-13  
我觉得:
1. MVC 应该用 配置文件
2. ORM 应该用 Ann
41 楼 caoyangx 2009-08-13  
鸦雀焉知鸿鹏之志
40 楼 cats_tiger 2009-08-13  
herowzz 写道
什么用什么东西都有个度,过了就不好
当初xml风行的时候不也是一个项目满地的配置文件吗?
你看不惯,不用就好了,人家用自然有人家爽的理由,既然人家用的爽,你又有什么不能忍耐的呢?

我的意思是在合适的地方用合适的技术,这和你的“度”是一致的。至于忍耐,那是我自己的事情,从来也没有管别人是不是爽。
39 楼 guji528 2009-08-13  
还没玩过annoation,看到那些符号怪怪的,不知带来哪些效率
38 楼 herowzz 2009-08-13  
什么用什么东西都有个度,过了就不好
当初xml风行的时候不也是一个项目满地的配置文件吗?
你看不惯,不用就好了,人家用自然有人家爽的理由,既然人家用的爽,你又有什么不能忍耐的呢?
37 楼 reallyafei 2009-08-13  
lw223 写道
annotations 一个被疯炒的东西。本身是个好东西,但是现在被炒过了。弄得现在要是没有用过annotations,就不好意思和人打招呼

你说话真幽默,呵呵!
36 楼 h521999 2009-08-13  
Annotaion与xml配置文件各有千秋吧,灵活使用的话,还是很不错的。
35 楼 joknm 2009-08-12  
呵呵。本人也不知道annotations是个什么东西,不过好像要用到ejb3(注释)的东西。
34 楼 whaosoft 2009-08-12  
注解和xml各有优缺点吧
33 楼 jltest 2009-08-12  
spring mvc的annotation很爽
32 楼 andyyehoo 2009-08-12  
freej 写道
用annoation最大的缺点就是如果要更改配置需要重新编译Java类,而且配置与代码混为一谈。如果用xml就没有这种麻烦,所以至今我的建议还是尽可能的少用annoation。


我也同意少用annotation,不过不是因为编译问题,而是项目控制问题。

Hibernate虽然使用annotation后,类很多有annotation,但是范围很小,基本上都会局限在domain包,spring的我们都尽量少用,最多用事务。

这个主要是个可控问题,如果项目annotation满天飞,找个bug半天发现是个微妙的annotation错误,那是很痛苦的。
31 楼 shenjianwangyi 2009-08-12  
说真的 不过 我用struts2的annoation还真没有这么用 楼主那段struts2的代码是在action里面写验证 貌似没有人这么干吧
30 楼 cats_tiger 2009-08-12  
所以现在才恶补ROR嘛,Rails是任何Java框架都比不了的,就是苦于没有能派上用场的项目。
29 楼 icewubin 2009-08-12  
freej 写道
用annoation最大的缺点就是如果要更改配置需要重新编译Java类,而且配置与代码混为一谈。如果用xml就没有这种麻烦,所以至今我的建议还是尽可能的少用annoation。

你所谓的“配置”有很多本来就不是配置,例如Hibernate的所谓配置信息,原本就是企业架构模式中的元数据映射所需要的信息,以前由于源代码没有annotation这类比较方便的存放这类信息的工具,其实就是java语言本身一些不方便的地方,但是才会建议和考虑把此类信息放在xml中,这类所谓的“配置文件”和真正的系统配置文件根本就是两码事。

不要拍脑袋认为当初这类框架的作者把这些信息放在xml中,是为了不需要编译java文件,你有见过很规范的线上项目,只修改或者只更新Hibernate(或Spring)的配置文件,而不更新其他任何东西的么?根本不可能的,这些xml不是类似于数据库连接的配置信息,要做上线的版本控制,这些xml不可能允许某个运维或支持的人单独修改的。

还有在一些动态语言的框架中,所谓的“配置文件”和源代码文件的区别是很模糊的,你能说他们也是配置代码混为一谈么?

原本就应该在代码里的,现在回到代码中,不是很好么?有IDE(JDT)的强大重构支持,编译期的检查,代码可读性提高,为什么要拒绝呢?(当然Struts2的那种不合理的使用annotation的除外)

相关推荐

    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