一、什么是注解?
注解是源代码的元数据,是代码的标签。其本质如下:
1、它是一个附属品,依赖于其他元素存在;
2、本身没有任何作用,在恰当的时候由外部程序解析产生预定作用。
二、注解的作用
1、简化配置;
2、增加代码的可读性;
3、提升系统的可维护性。
spring中定义了很多自定义注解,spring的注解分为两类,一是初始化类注解,二是aop类注解。
三、注解的分类
按定义分类:
1、内置注解,由jdk自身提供,如:@Override,@Deprecated,@SuppressWarning等。
2、自定义注解。
按声明周期分类:
1、SOURCE:表示编译时这个注解会被移除,不会包含在编译后产生的class文件中。
2、CLASS:表示这个注解会包含在class文件中,但是在运行时会被移除。
3、RUNNING:表示这个注解会保留到运行时,在运行时可以被jvm访问到,我们可以在运行时通过反射解析这个注解。
四、注解的属性
1、Retention
定义注解的生命周期,可选值为:SOURCE,CLASS,RUNNING。
2、Documented
文档化注解,会被javadoc工具文档化。
3、Inherited
注解是自动继承的,想让一个类和它的子类都包含某个注解,就可以使用它来修饰这个注解。
4、Target
说明了被修饰的注解的应用范围,包括:
TYPE:表示可以用来修饰类、接口、注解类型或枚举类型。
PACKAGE:表示可以用来修饰包。
PARAMETER:表示可以用来修饰参数。
ANNOTATION_TYPE:表示可以用来修饰注解类型。
METHOD:表示可以用来修饰方法。
FIELD:表示可以用来修饰属性(包括枚举常量)。
CONSTRUCTOR:表示可以用来修饰构造器。
LOCAL_VARIABLE:表示可以用来修饰局部变量。
五、如何定义一个注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface CacheResult {
String key();
String cacheName();
boolean needLock() default false;
}
六、如何使用注解
通过jdk反射获取注解信息:
Class clazz = OrderDetaiServiceImpl.class;
Class annoClazz = CacheResult .class;
if(clazz .isAnnotationPresent(annoClazz )){
Annotion annotion = (CacheResult )clazz .getAnnotation(annoClazz );
System.out.println(annotion .key());
System.out.println(annotion .cacheName());
}
七、注解使用场景
注解通常与aop结合使用,步骤:
编写自定义注解,将注解增加到主拦截方法上,编写切面。
准备工作包括:引入aspect包,在配置文件中增加:<aop:aspect-autoproxy proxy-target-class="true"/>让aop注解生效。
网友评论