- 浏览: 547712 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (740)
- css (4)
- jquery (8)
- javascript (23)
- html (0)
- uml (0)
- 设计模式 (1)
- 开发工具 (14)
- json (4)
- struts 1.x (3)
- spring (3)
- hibernate (6)
- struts 2.x (17)
- JFreechart (0)
- j2se (48)
- jsp (9)
- flex (22)
- 找工作 (1)
- 技术杂谈 (18)
- 网络编程 (5)
- io流 (1)
- ORACLE (15)
- 报表 (3)
- extjs (11)
- jpbm (2)
- swing (5)
- jspereports (3)
- sql (1)
- linux (15)
- ps (1)
- storm (4)
- hbase (8)
- li (0)
- python (1)
- hive (3)
- 机器学习 (1)
- hdfs (1)
- elasticsearch (1)
- hadoop 2.2 (5)
- hadoop (1)
最新评论
-
Tristan_S:
这个有点意思
ASM -
starryskydog:
程序修改detail band部分的样式 如内容字体大小 ...
使用jasperReport实现动态表头 -
samwong:
Good, so usefule
使用YUI Compressor压缩CSS/JS -
gc715409742:
能够告诉我怎么在web项目中使用YUI Compressor? ...
使用YUI Compressor压缩CSS/JS -
JsonTeye:
您好! 我看你的代码,我现在也在做动态报表,实现功能由用户自己 ...
使用jasperreport动态生成pdf,excel,html
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;
- }
- }
@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>
<!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;
- }
@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>
<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;
- }
@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;
- }
- }
@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的意见如何?
发表评论
-
使用Java调用谷歌搜索
2013-10-19 12:50 903转自:http://yangshangchuan.iteye ... -
走出类加载器迷宫
2013-10-16 14:22 691这是前几天在看类加载器机制时搜到的一篇旧文,网上搜了搜 ... -
Log4j使用
2012-12-05 11:34 785... -
Java的JDBC数据库连接池实现方法
2012-09-14 10:20 744虽然J2EE程序员一般都有现成的应用服务器所带的JDBC数据库 ... -
什么是线程安全和线程不安全
2012-08-23 14:49 796什么是线程安全和线程 ... -
线程运行栈信息的获取
2012-08-23 14:49 834线程运行栈信息的获取 ... -
log4j 获取行号
2012-08-23 14:50 1163log4jjava 今天看log4j的日志,突然注意到log ... -
javassist【动态改字节码】学习三
2012-08-23 14:50 2670这里举个简单的例子,来记录下如何用CtClass创建一个类,并 ... -
javassist【动态改字节码】学习二
2012-08-22 11:53 840写了个例子。 有一个类: Java代码 package ... -
javassist[动态改字节码]学习一
2012-08-22 11:52 906前段时间为了公司里的 ... -
JVM启动参数
2012-08-22 11:51 948一、标准参数 1.-server -client 虚拟机服务器 ... -
使用javassist动态注入代码
2012-08-22 11:33 789关于java字节码的处理,目前有很多工具,如bcel,asm。 ... -
利用javaassist修改Class文件
2012-08-22 11:22 1505我们在开发中有时候会遇到这样的问题,就是使用的某个第三方包中的 ... -
JavaMail
2012-08-16 20:03 952在Java EE应用程序中,经常需要发送E-mail。Java ... -
让java变成脚本语言
2012-08-15 12:42 0今天在弄游戏的GM模块,大部分gm命令很简单,只是单纯改 ... -
JavaAgent
2012-08-13 23:43 1279-javaagent 这个JVM参数是JDK 5引进的. j ... -
在Eclipse RCP中实现控制反转(IoC)
2012-08-13 23:13 973摘要:这篇文章描述了 ... -
aop的几种实现方式
2012-08-05 21:14 9491 AOP各种的实现 AOP就是面向切面编程,我们可以从 ... -
Java编程中“为了性能”尽量要做到的一些地方
2012-07-28 21:36 597http://www.iteye.com/magazines/ ... -
java基础拾遗
2012-06-17 10:05 882. 电梯直达 楼主 发表于 2012-1-28 13: ...
相关推荐
通过`default`关键字,可以在Annotation定义中为参数设置默认值,这样在使用时可以选择不提供值,直接使用默认值。 6. **枚举与Annotation**: 枚举可以用于限制Annotation参数的取值范围,如`name() default My...
通过定义成员变量(通常带有默认值),可以为Annotation添加特定的元数据。自定义Annotation可以通过`@interface`关键字创建,并可以通过反射API在运行时获取。 3. 处理Annotation:处理Annotation通常是通过Java...
在Java中,Annotation定义类似于接口,使用`@interface`关键字。以下是一个简单的自定义Annotation例子: ```java public @interface MyAnnotation { String value() default ""; } ``` 这里的`MyAnnotation`就是...
- Annotation类型是一种接口,定义了Annotation的结构和名称,其成员变量具有预定义的类型和默认值。 2. 标准和自定义Annotation: - Java 5.0引入了一些标准Annotation,如`@Override`、`@Deprecated`、`@ ...
每个方法定义了一个成员,方法返回类型有限制,可以是基本类型、字符串、类、枚举、注解或它们的数组,并可以有默认值。 ```java public @interface RequestForEnhancement { int id(); String synopsis(); ...
- **Annotation 类型**: 定义了 Annotation 的名称、类型和成员的默认值。Annotation 类型本质上是一个特殊的 Java 接口,其成员变量受到一定的限制。声明 Annotation 类型时需要使用新的语法。 - **Annotation 成员...
注解可以定义参数,参数类似于类中的字段,可以通过`int`, `double`, `boolean`, `String`, `Class`, `Enum`, 或其他注解等类型指定。 ```java public @interface MyAnnotation { String value(); } ``` ##### ...
#### 一、Java Annotation 的定义及作用 Java Annotation(注解)是自 Java 5.0 开始引入的一种语言元素,它为开发者提供了在代码中添加元数据的能力。简单来说,注解就像是对代码进行标记或注释的方式,这些标记...
在Java中,Annotation定义为一种接口,可以通过反射API访问其信息。它们的使用非常灵活,可以应用于不同的程序元素,包括包、类、方法、字段、参数甚至局部变量。每个Annotation由一个名称和一个或多个成员组成,...
定义一个Annotation类型通常使用`@interface`关键字,它可以包含一些成员,这些成员可以是基本类型、字符串、枚举或其他Annotation类型。成员的默认值可以通过`default`关键字来设置。例如,定义一个简单的Marker ...
Annotation,或称为注解,是Java编程语言中的一个重要特性,自Java 5引入以来,它在软件开发中扮演着越来越重要的角色。注解是一种元数据,允许程序员在源代码中嵌入额外的信息,这些信息可以被编译器、IDE或其他...
定义注解使用`@interface`关键字,可以包含成员,成员默认值和保留策略。例如: ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { String value() ...
自定义注解以`@interface`关键字开始,你可以定义自己的属性,这些属性可以有默认值。例如: ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { ...
- **默认值**:在定义注解时,可以为元素提供默认值。这样,当使用注解时,如果未显式指定该元素,就会使用默认值。 ### 4. 注解的应用场景 - **编译时检查**:例如`@Override`确保方法确实重写了父类方法。 - **...
- 当定义一个注解时,实际上实现了`java.lang.annotation.Annotation`接口。注解类型的声明不允许有父接口或父类。 4. Retention策略: - `java.lang.annotation.Retention`:用于控制注解的生命周期,决定它在...
定义一个注解的基本结构如下: ```java import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface MyCustomAnnotation { String value() default ""; ...
自定义注解可以没有任何元素,也可以包含成员变量(通常称为元素),并为其提供默认值。 3. 注解的保留策略: - 注解的生命周期由其保留策略决定,主要有两种:SOURCE(源码级)、CLASS(编译时)和RUNTIME(运行...
Java的`javax.annotation.processing.Processor`接口定义了注解处理器的规范。 5. 使用注解 注解可以应用于类、方法、字段、参数、构造函数、包等不同级别。例如: ```java @MyAnnotation("Hello, World!") ...