随笔-10  评论-22  文章-1  trackbacks-0
  2010年8月10日
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 @ 2010-08-10 16:47 独孤行 阅读(1681) | 评论 (1)编辑 收藏