自定义注解示例
---------------------------------------------
@Transactional 注解示例
伦理片 http://www.gxuy.com/
- package org.springframework.transaction.annotation;
- import java.lang.annotation.Documented;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Inherited;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- import org.springframework.transaction.TransactionDefinition;
- @Target({ElementType.METHOD, ElementType.TYPE})//可以作用在类上和方法上
- @Retention(RetentionPolicy.RUNTIME)//可以通过反射读取注解
- @Inherited//可以被子类继承
- @Documented//javadoc生成文件档时,包含本注解信息
- public @interface Transactional {
- String value() default "";//使用时没有指定key,值默认赋给value,如:Transactional("abc")
- Propagation propagation() default Propagation.REQUIRED;
- Isolation isolation() default Isolation.DEFAULT;
- int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;
- boolean readOnly() default false;
- Class<? extends Throwable>[] rollbackFor() default {};
- String[] rollbackForClassName() default {};
- Class<? extends Throwable>[] noRollbackFor() default {};
- String[] noRollbackForClassName() default {};
- }
J2SE5.0为注解单独提供了4种注解
---------------------------------------------
它们是Target、Retention、Documented和Inherited。
可以在自定义注解时使用这4个注解。
@Inherited
---------------------------------------------
继承是java主要的特性之一。在类中的protected和public成员都将会被子类继承,但是父类的注解会不会被子类继承呢?
很遗憾的告诉大家,在默认的情况下,父类的注解并不会被子类继承。如果要让这个注解可以被继承,就必须在定义注解时在源码上加上@Inherited注解。
- 自大定义一个MyAnnotation注解
- @Inherited
- @interface MyAnnotation { }
- 使用MyAnnotation注解
- @MyAnnotation
- public class ParentClass {}
- 子类继承父类
- public class ChildClass extends ParentClass { }
在以上代码中ChildClass和ParentClass一样都已被MyAnnotation注解了。
@Retention
---------------------------------------------
成功通过反射读取类上或方法上的注解,是有前提的--要使用@Retention,就是设置注解是否保存在class文件中。
下面的代码是Retention的详细用法。
- @Retention(RetentionPolicy.SOURCE)
- @interface MyAnnotation1 { }
- //作用是不将注解保存在class文件中,也就是说象“//”一样在编译时被过滤掉了。
- @Retention(RetentionPolicy.CLASS)
- @interface MyAnnotation2 {}
- //作用是只将注解保存在class文件中,而使用反射读取注解时忽略这些注解。
- @Retention(RetentionPolicy.RUNTIME)
- @interface MyAnnotation3 {}
- //作用是即将注解保存在class文件中,也可以通过反射读取注解。这也是最常用的值
@Target
---------------------------------------------
标识自定义注解 可以作用于 类上、方法上、成员变量上、构造方法、其它...
@Documented
---------------------------------------------
在默认的情况下在使用javadoc自动生成文档时,注解将被忽略掉。如果想在文档中也包含注解,必须使用Documented为文档注解。
如何读取注解--类上的注解
---------------------------------------------
- //取得类上的指定的注解
- Annotation annotation = 类.class.getAnnotation(MyAnnotation.class);
- //取得类上的所有注解,包括继承的注解。
- Annotation[] annotations = 类.class.getAnnotations();
- //取当前类上的所有的注解,不包括继承的
- Annotation[] annotations = 类.class.getDeclaredAnnotations();
如何读取注解--方法上的注解
---------------------------------------------
- //取得方法上的指定的注解
- Method m=?
- Annotation annotation = m.getAnnotation(MyAnnotation.class);
- //取得方法上的所有注解,包括继承的注解。
- Annotation[] annotations = m.getAnnotations();
- //取当前方法上的所有的注解,不包括继承的
- Annotation[] annotations = m.getDeclaredAnnotations();
注:要想使用反射得到注解信息,这个注解在定义时源码中必须使用
@Retention(RetentionPolicy.RUNTIME)进行注解。