1. 前言
自JDK1.5以后,推出了注解新特性。注解的推出其实最主要的目的是为了让广大的用户认知EJB3.0,因为EJB2.X广受大多数开发者的诟骂和质疑。为了减少配置、让注解替代配置。有了注解,我们以前看似一般的、普通的JavaBean就有了活力,有了内涵,有了新的契机。配合Sun的JPA规范,EJB3.X又再次在企业级开发中大放异彩,让很多开发者赞不绝口。也许是无心插柳,这种“零配置”思维也影响着Java其他的开源项目——像Struts、Spring、Hibernate(也就是咱们耳熟能详的SSH)不都是具有“零配置”支持嘛!Java现在也是往动态、敏捷的方向发展着。有可能将来配置文件越来越少、规范、约定、注解代替了繁琐的配置信息。而XML估计会回归原始的使命——数据传输与数据交换。
2. 自定义注解
至于已有的注解,比如:JPA、EJB、Spring零配置等等怎么使用相信各位读者都能掌握,这里主要是说如何自定义自己的注解,自己使用自定义的注解。
我们先用一个简单的例子来看
- package annotation;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- /**
- * 注解
- *
- * @author Administrator
- */
- @Retention(RetentionPolicy.RUNTIME)
- public @interface Test {
- String isAop() default "false";
- }
package annotation;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;/** * 注解 * * @author Administrator */@Retention(RetentionPolicy.RUNTIME)public @interface Test { String isAop() default "false";}用关键字 @interface定义一个注解标记,使用 @interface关键字实际上的意思就是该接口继承自java.lang.annotation.Annotation接口。
String isAop() default "false";
这句话代表的意思就是在Test注解中可以含有属性名为isAop,此属性的类型是字符串类型。客户端使用的时候可以根据需要自己指定相关的属性值。如果客户端不指定值,默认值是false
- @Retention(RetentionPolicy.RUNTIME)
- package use;
- import annotation.Test;
- import annotation.TestImpl.TestProcess;
- @Test(isAop = "true")
- public class UseTest {
- /**
- * @param args
- * @throws ClassNotFoundException
- */
- public static void main(String[] args) throws ClassNotFoundException {
- TestProcess.process("use.UseTest");
- }
- }
@Retention(RetentionPolicy.RUNTIME)package use;import annotation.Test;import annotation.TestImpl.TestProcess;@Test(isAop = "true")public class UseTest { /** * @param args * @throws ClassNotFoundException */ public static void main(String[] args) throws ClassNotFoundException { TestProcess.process("use.UseTest"); }}
在客户端调用中在类UseTest上使用了@Test(isAop = "true")注解。仅仅定义了注解就像《三国杀》里,刘备是主公,他有“激将”的主公计,下了个命令:“蜀将何在?”,刘备的这句话太抽象了,蜀将相当于一个注解。在场的所有蜀将就像加了此注解的类,都会受到这句话的影响。具体替不替刘备出杀,~~~~个人表现不同(得先看看自己的身份啊)反贼的表现是:“这个真没有”;忠臣的表现是,先看看手上有杀吗?有,出击吧!没有就说:“这个……真没有!”;内奸的反应是:“唉,先保命还是装一装忠臣?比较纠结!”。这里的身份就好像是注解的属性的不同值。具体的处理就相当于针对注解的处理实现类。注解的具体实现类就是处理注解的业务逻辑,它需要Java的反射机制来处理客户目标类的具体注解,我们就来看看这个注解处理实现类。