原创作者: Readonly   阅读:3307次   评论:4条   更新时间:2011-05-26    
java1.5引入了annotation,初看起来非常cool,但是仔细想想它可以被用在什么地方呢?什么样的需求才是用annotation的最佳方式呢?

偶先举几个例子吧:
1. O/R Mapping
比如EJB3的持久化映射, 具体就不用说了, 规范里面非常清楚了, 看代码:
@NamedQueries({
    @NamedQuery(
        name="authorPosts",
        queryString="select p from Post p where p.author = :author"
    );,
    @NamedQuery(
        name="allPosts",
        queryString="select p from Post p"
    );
});

@Entity
@Table(name="FORUM_POST", schema="javaeye");
public class Post {
    private Long _id;
    private String _title;
    private String _content;
    private User _author;
    
    @Id(generate=SEQUENCE, generator ="POST_SEQ");    
    public Long getId(); {
        return _id;
    }
    
    @Column(name="TITLE", nullable=false, length=255);
    public String getTitle(); {
        return _title;   
    }
    
    @Column(name="CONTENT", columnDefinition="CLOB NOT NULL");
    public String getContent(); {
        return _content;
    }
    
    @ManyToOne(optional=false);
    @JoinColumn(name="AUTHOR_ID", nullable=false, updatable=false);
    public User getAuthor(); {
        return _author;
    }
}


2. 校验
比如WebWork的visitor方式校验,能够将action的校验,转发到Entity上, 以前的写法是写一个Post-validation.xml:

<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>
	<field name="title">
        <field-validator type="requiredstring">
            <message>Please input title.</message>
        </field-validator>
    </field>
    <field name="content">
        <field-validator type="requiredstring">
            <message>Please input content.</message>
        </field-validator>
    </field>
</validators>


改用annotation成:
    @Validator(type="requiredstring", message="Please input title.");
    public String getTitle(); {
        return _title;   
    }
    
    @Validator(type="requiredstring", message="Please input content.");
    public String getContent(); {
        return _content;
    }


3. 索引
比如用lucene做全文搜索,以前是写一个Post-lucene.xml, 当一个Post被持久化的时候,能够自动根据这个配置文件对相应的属性做不同的索引处理:
<lucene>
    <field type="Keyword" fieldName="title"/>
    <field type="Text" fieldName="content"/>
</lucene>


改用annotation成:
    @LuceneIndex(type="KEYWORD");
    public String getTitle(); {
        return _title;   
    }
    
    @LuceneIndex(type="TEXT");
    public String getContent(); {
        return _content;
    }




如果将3种annotation都混合在一起,整个Post Entity将会变成:
@NamedQueries({
    @NamedQuery(
        name="authorPosts",
        queryString="select p from Post p where p.author = :author"
    );,
    @NamedQuery(
        name="allPosts",
        queryString="select p from Post p"
    );
});

@Entity
@Table(name="FORUM_POST", schema="javaeye");
public class Post {
    private Long _id;
    private String _title;
    private String _content;
    private User _author;
    
    @Id(generate=SEQUENCE, generator ="POST_SEQ");    
    public Long getId(); {
        return _id;
    }
    
    @Column(name="TITLE", nullable=false, length=255);
    @Validator(type="requiredstring", message="Please input title.");
    @LuceneIndex(type="KEYWORD");
    public String getTitle(); {
        return _title;   
    }
    
    @Column(name="CONTENT", columnDefinition="CLOB NOT NULL");
    @Validator(type="requiredstring", message="Please input content.");
    @LuceneIndex(type="TEXT");
    public String getContent(); {
        return _content;
    }
    
    @ManyToOne(optional=false);
    @JoinColumn(name="AUTHOR_ID", nullable=false, updatable=false);
    public User getAuthor(); {
        return _author;
    }
}


本来干干净净的一个Post POJO,变成了充满annotation的怪家伙,这可以称之为annotation的滥用么?难道又一个AOP出现了?难道以后偶们打开一个Java文件必须用Eclipse之类的IDE,好让它自动将annotation fold,免得花了眼睛么?

你对annotation的意见如何?
评论 共 4 条 请登录后发表评论
4 楼 liusp_eye 2011-05-26 17:22
几行代码,昨天放配置文件里,今天又放到注释里,这是技术创新吗? 还是小两口过家家找新鲜感?
3 楼 hazyhao 2009-05-07 10:14
1楼的说法不赞成,合适不合适由谁来决定,由我们自己吗?

项目工程本来就不是以个人意愿来决定的,所以还得有项目

coding rule 或者 类似写POJO的业内常规一样。
2 楼 hazyhao 2009-05-07 10:10
适可而止,一个Entity+Mapping内容已经够多的了,

如果再填入其他东西,那么何言【良好的编码风格】
1 楼 wmuu 2008-12-03 10:17
只是一个功能,你可以在合适的用,不合适的地方不用

发表评论

您还没有登录,请您登录后再发表评论

文章信息

Global site tag (gtag.js) - Google Analytics