Annotation是JavaSE5开始引入的,在Java的世界已是大行其道,各大开源框架Hibernate、Spring等都对它无缝集成,足见其份量了。。
其实很早就出现在程序员的视野,只是关注的比较少:@Override、@SuppressWarnings("unchecked"),开始主要觉得没什么用处,后来公司的框架用到它,感觉还不错。。于是来一记:
在网上搜Annotation的学习资料不是很多,还是用的人不多
,比较经典的入门就是这个:
实战篇:设计自己的Annotation,很清楚,通俗易懂,这里我就不赘述了。然而仅仅是弄懂它是怎么回事,具体还是没什么用处,这也是大多数开发人员的感觉。
在现在的公司的经历两次框架升级,第一次没有用到Annotation,xml配置文件大行其道:Action跳转、Ibatis sqlmapper、Form表单(我们的表单都是从后台生成的),整个项目xml眼花缭乱,每个模块都有自己专属的配置文件,然后集中到一起处理,而我们最痛苦的莫过于写那大量重复的配置文件。
后来公司接了个ERP的单子,技术总监马上意识到框架该升级了,他技术很牛,我们公司的框架就是他一人写的,两周之后,新框架出炉,xml只保留三分之一:Action跳转、Form表单都不再使用xml配置,而是Annotation横空出世,给我的感觉:它就像一个救世主,让我们的框架重生,它就是这次升级的最大亮点,只有sqlmapper依然保留,这无可厚非,因为它原本是ibatis封装的,Action控制器既不是Struts1,Struts2,也不是Webwork,是总监自己封装的Servlet,Form表单都由后台生成js组件抛到前端,通过反编译看到源码,其实还是很基础的,贴些代码上来看下吧:
1.Action请求部分:
/**
* 显示新增页面
* author YuWenLin
* date 2010-5-13 上午10:31:57
* @param data
*/
@Action("/add.shtml")
@Permission("client.ContractType.add")
public void add(ActionData data){
FormBuilder builder = data.getService(FormBuilder.class);
builder.append(Type.class);
builder.setAction("client/contract/type/add.do");
data.put("script", builder);
//向页面抛出cookie提示信息
MessageUtil.putMessage(data);
data.setResulter("template");
data.setPath("client/contract/type/type.shtml");
}
可能大家看得不太明白(每个公司都有自己框架),没有关系,就两句:
@Action("/add.shtml")
它就是负责请求显示新增的页面,就这一句,不需要像我们以前的action.xml(类似Struts2的跳转),干净利索吧,当然底层后台有处理,但是公共的,不需我们管,至于
@Permission("client.ContractType.add")
就是用来处理权限管理的,也是Annotation的使用,就这一句。就权限管理,后面我也会记述。。。
2.再来看看@Action底层的定义:
package org.plugbase.action;
import java.lang.annotation.Annotation;
public interface Action
extends Annotation
{
public abstract String value();
}
说明下:extends Annotation跟 @interface是一样的效果,只不过前者手动extends,后者自动的。
怎么样,很基础吧,跟jdk源码是一样的。。。
3.JavaBean生成表单:
@Widget(value="TextBox")
@Valider({"notempty","len(2,8)"})
public void setName(String name) {
this.name = name;
}
给setter方法加Annotation,@Widget是组件,@Valider是验证
意思就是给name字段生成TextBox组件,并做验证处理,后台有相应的公共js组件,验证控件库调用,我们所有的表单组件都是这样生成的,说实话,这样生成一个页面真有点繁锁,既要写js,又要写后台,前端还要配,还真是有技术含量,呵呵。。。但是它保证一致性,所有表单组件,验证控件,如TextBox我们只有一套,所有人都去调用这一套,不得再重造,因为它是框架。。。
4.@Widget底层定义:
import java.lang.annotation.Annotation;
public interface Widget
extends Annotation
{
public abstract String value();
public abstract String defaultValue();
public abstract String dataType();
public abstract String dataSource();
}
@Valider类似,当然这些都只是定义、声明,具体怎么用,这里就不贴了,毕竟是人家东西嘛
怎么样,看到这些,似乎觉得Annotation开始起作用了,其实我一直觉得,Annotation就是为xml所生,因为它们俩是死对头,不管单一地用谁,都有缺陷,
只有结合才是完善,正所谓,没有最好,只有更好,合理就行。
在这里我可能没有贴出什么@Annotation技术含量的东西,但是我想要表达的是一种思想,一种框架的思想,并不是什么地方都能用到Annotation,一般的中小型项目根本没必要用它,因为xml就搞定,所以用在需要用的地方,将它的能量发挥到最大。。。
以上仅为一家之言,欢迎拍砖。。。
posted on 2010-08-10 16:47
独孤行 阅读(1699)
评论(1) 编辑 收藏 所属分类:
JavaSE