`
cats_tiger
  • 浏览: 274204 次
  • 性别: 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,不知道这道菜是咸还是淡。
分享到:
评论
68 楼 dsjt 2010-05-26  
还是用专门配置文件来管理配置的比较好,可以纵览全局,一目了然!!

简化配置的努力方向应该是:分离配置文件,将不同功能的配置放置到不同的文件中,以缩小单个配置文件体积,便于维护。
例如 seam 将JSF 的导航规则分离到 [页面文件名].page.xml中,很方便
67 楼 icewubin 2009-09-24  
thinkinperson 写道
Hibernate中使用annocation可是没感觉

Hibernate中使用约定方式的COC,几乎就没有什么注解配置了。
66 楼 helin 2009-09-24  
还是顶 Annotation.的确不错。看怎么用了。
65 楼 zozoh 2009-09-11  
daquan198163 写道
这个问题以前好像讨论过吧,我记得当时得到的结论是:
xml是把配置外部化,annotation是把配置内部化,他们各自的优缺点、适用场合应该是很明显的。
如果一个配置只是用来描述某个组件本身的属性,那么annotation优先,比如hibernate、validate;优点是配置和组件往往需要同时修改,放在一起便于维护、保证一致性;
反之,如果配置是描述一堆组件如何协作、关联,或者很难说清是针对哪个组件的,那么应该用xml,比如spring配置。优点是配置集中、架构清晰、维护配置不需修改组件代码,反之亦然。


说的非常好。 对于 ORM ,因为 POJO 字段与数据库字段的映射是固定的,适合内部化
而 Ioc 的注入信息,适合外部化


64 楼 enilu 2009-09-10  
淡了放盐,咸了扔掉它,要不你放电醋
63 楼 daquan198163 2009-08-24  
这个问题以前好像讨论过吧,我记得当时得到的结论是:
xml是把配置外部化,annotation是把配置内部化,他们各自的优缺点、适用场合应该是很明显的。
如果一个配置只是用来描述某个组件本身的属性,那么annotation优先,比如hibernate、validate;优点是配置和组件往往需要同时修改,放在一起便于维护、保证一致性;
反之,如果配置是描述一堆组件如何协作、关联,或者很难说清是针对哪个组件的,那么应该用xml,比如spring配置。优点是配置集中、架构清晰、维护配置不需修改组件代码,反之亦然。
62 楼 icewubin 2009-08-24  
hepeng421 写道
在团队开发的话,xml肯定更加好,毕竟满天飞的注释,真的维护起来比较麻烦。

当一个xml都比相关的java本身都要复杂或者是行数超过一倍的时候,还能说xml维护更简单么?

你说这话的前提就是“满天飞的注释”,那如果不是满天飞呢,我还可以说满天飞的XML远比满天飞的注释更可怕,注释可以利用IDE一下全部搜到,清清楚楚,重构也超级方便,还能编译器检查,XML能么?XML最多只能基于名字的重构,能力有限,而且因为是基于名字的,重构的时候还必须复查。
61 楼 hepeng421 2009-08-23  
在团队开发的话,xml肯定更加好,毕竟满天飞的注释,真的维护起来比较麻烦。
60 楼 xiaobaozi 2009-08-23  
Annotation我感觉在hibernate上使用最有优势!因为好多映射文件都不用写了,同时可移植性得到加强!
59 楼 huanggang212 2009-08-20  
ibatis支持annotation还是不错的,但是我也用不到,因为公司都是用spring提供的ibatis实现,spring太强大了!
58 楼 ytffhvk 2009-08-20  
个人觉得还是HIBERNATE的ANNOTATIONS比较方便些,有代码提示,有高亮,较XML先进、方便很多 ,更有些只需要简单的配置Entity ,id即可。
57 楼 karidyang 2009-08-20  
我觉得xml配置的好的话,也许能比annotation更简单,annotation滥用的话只会引起复杂度增加
56 楼 Simon.Wang 2009-08-20  
Frederick 写道
想用annotation来配置web的controller,那么都不可能简单。spring mvc的annotation我一开始也想用,但是最后还是放弃了。
因为我无法相信如果一个请求有几十个参数传递的话,使用annotation配置会是什么样子。

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



一个请求为什么会有几十个参数?为什么不是一个参数的几十个项目或者几个参数的十几个项目?
55 楼 peteronline 2009-08-19  
刚学struts2,感觉配置XML挺人性化的
54 楼 szhnet 2009-08-18  
什么都不能用过了 要遵守适度原则
53 楼 wondery 2009-08-18  
哪里零配置了??明明是将配置挪到代码里了么.
52 楼 zwq4166506 2009-08-17  
最近也在研究Struts2的annoation,最后还是转回了xml配置,感觉Struts2的annoation还是不够灵活
51 楼 whaosoft 2009-08-17  
其实也确实少写了点代码~! 想想annotation 替你完成了什么 你就知道了
50 楼 night_stalker 2009-08-16  
xml 是啰嗦弱化版 lisp,你们最后还是得靠 lisp。
49 楼 steeven 2009-08-16  
另外,eclipse应该有个annotation视图插件,把java bean的properties上面的annotation拉成表格来看。

相关推荐

    Android Annotations框架使用实例

    Android 注解入门,方便以后的学习,提高代码开发效率。

    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....

    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-...

    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.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....

    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.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-...

    jackson-module-jaxb-annotations-2.2.3-API文档-中文版.zip

    赠送jar包:jackson-module-jaxb-annotations-2.2.3.jar; 赠送原API文档:jackson-module-jaxb-annotations-2.2.3-javadoc.jar; 赠送源代码:jackson-module-jaxb-annotations-2.2.3-sources.jar; 赠送Maven依赖...

    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; 包含...

    hadoop-annotations-2.7.3-API文档-中文版.zip

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

    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文档:...

    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.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-...

    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.5.1-API文档-中文版.zip

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

    hibernate-annotations-3.4.0.GA

    hibernate-annotations-3.4.0.GA hibernate-annotations-3.4.0.GA hibernate-annotations-3.4.0.GA

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

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

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

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

Global site tag (gtag.js) - Google Analytics