Annotation是java 5加入的新功能,可以加在java代码的类,域,方法和参数上,丰富程序语义。我一度认为引入annotation后,可以轻松地抛弃html,但是现在我发现annotation也有不好的地方:
- 侵入java代码,被标注代码会对标注产生依赖,比如,如果在类里加了javax.persistence.Entity标注,这意味着编译时得把javax.persistence.Entity所在包加入类路径,即使你并不实际使用这个标注。如果编译期不检测,到运行期才寻找Annotation定义的话,会好很多。xml则不会对代码有任何入侵。
- 需要重新编译才能升效。用XML时,只要更新一下XML重部署,现在是要把java代码也得重新编译。
- 要配置的信息很多时,多个annotation加在同一个目标上,格式很难排,不易读。
- 配置信息散在文档各个地方,不易于查找。
我觉得,使用Annotation时,最好要想清楚,你的代码是不是不会迁移到其它坏境,和annotation的耦合也是没问题可以接受的,否则,不要用annotation了。如果真的要用,最好只用annotation来做标注,但不要来做“配置”。比方说,如果你在用一个标注来配合做权限控制,在调用被标注的方法前,做一些权限的检测。那么,最好只在方法前的标注里说明这个方法需要被做权限检测,但不要说明需要被做怎么样的权限检测,例如下面的这个就很好,
@NeedPermission(methodName="writePost")
但是下面这个就不好
@NeedPermission(methodName="writePost", permission="read,write,admin" condition="and")
上面的写法,暴露了太多的细节(配置信息),而这些信息很可能会随着业务变化而变动。我觉得,把配置的细节统一存放到一个XML中,再用annotation来定义这些配置应该应用到哪里。