先来一副图...
真正对注解有了莫名的共鸣还是在学习springIOC那块,在xml可配置bean的方式到注解的形式的改变,当时的问题是,为什么xml那一堆的bean配置怎么就突然变成了使用spring注解就能解决依赖注入的问题呢?在博客《SpringIOC注解工作机制》已有答案。加上最近学习注解,顺便总结一下。
一:What
1·定义
注解,一种元数据形式,提供了一个不属于程序本身的关于对程序描述的数据。注解对他们进行注解的代码的操作没有任何直接的影响。
注解(Annotation)相当于一种标记,正如思维导图体现出来的。在程序中加入注解就等于为程序打上某种标记,没有加,则等于没有任何标记,以后,javac编译器、开发工具和其他程序可以通过反射来了解你的类及各种元素上有无何种标记,看你的程序有什么标记,就去干相应的事,标记可以加在包、类,属性、方法,方法的参数以及局部变量上。
2·分类
按照注解的使用途径分类,分别为标准注解,元注解,自定义注解。
A标准注解:JDK1.5之后内部提供了三个注解
@Deprecated 意思是“废弃的,过时的”
@Override 意思是“重写、覆盖”
@SuppressWarnings 意思是“压缩警告”
B 元注解:用来注解注解的注解。(好绕…)
其实元注解是一种注解,他可以加在一般的注解上用于限制该注解的使用范围,生命周期等。一般在自定义注解时候使用的多。在jdk的中java.lang.annotation包中定义了四个元注解:
@Target:指定被修饰的注解的作用范围
@Retention:指定了被修饰的注解的生命周期
@Documented:指定了被修饰的注解是可以被例如Javadoc等工具文档化的
@Inherited:指定了被修饰的注解修饰程序元素的时候是可以被子类
C 自定义注解:通过@interface来定义一个全新的注解。(会在最后添加一个demo)
二:Why
这就要说道注解的发展历史了。注解是JDK1.5之后才有的新特性。在分类中已有解释。同时Spring2.5以上都是基于注解的,Hibernate3.X也是基于注解的。注解的出现,大都应用在一些通用框架上,所以,了解注解还是很重要的。
那注解是给我们带来了什么好处呢?
1、编译器的信息 - 编译器可以使用注释来检测错误或平息警告。(例如@Override和@SuppressWarnings)
2、编译时和部署时处理 - 使用软件工具可以处理注解信息以生成代码,XML文件等。(例如spring的注解替换了xml配置bean方式)
3、运行时处理 - 有些注解可在运行时检查。(例如spring注解@controller,@Service等,都是在运行时的一些spring类解析)
三:When
这个注解什么时候使用?首先,要知道一点的是注解的分类。
·自定义注解
·系统注解
如果是系统注解,比如说spring框架提供的注解,如果你需要把类标记为spring容器的bean,或者需要把B类注入到A类中,这个时候就需要使用注解了。
如果是自定义注解,其实自定义注解,我们使用的很少,主要是意义不是很大。但我们同样可以使用。比如说,在类上添加的注释,我们完全可以用自定义注解来替代,然后通过注解处理器添加操作即可。
四:where
在哪里使用注解?其实这个很好说明。通过元注解@Target就可以很好的解释清楚。先看该注解源码:
/* @since 1.5
* @jls 9.6.4.1 @Target
* @jls 9.7.4 Where Annotations May Appear
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interfaceTarget {
/**
* Returns an array of the kinds ofelements an annotation type
* can be applied to.
* @return an array of the kinds ofelements an annotation type
* can be applied to
*/
ElementType[] value();
}
使用Target注解限定了被注解内容的作用范围,具体参数值代表如下:
- CONSTRUCTOR:用于描述构造器
- FIELD:用于描述域
- LOCAL_VARIABLE:用于描述局部变量
- METHOD:用于描述方法
- PACKAGE:用于描述包
- PARAMETER:用于描述参数
- TYPE:用于描述类、接口(包括注解类型) 或enum声明
五:how
最后一个也是很关键的一点,注解怎么使用的问题。先来看一幅图:
是不是一目了然的赶脚?其实这幅图道出了注解工作本质。
其实不管是自定义注解还是非自定义注解,都是一样的工作机制。首先肯定要存在这样的一个注解A,然后在类B(或者其它属性方法等)上使用注解A,最后在类C中通过反射机制,获取被注解了的类B,进行接下来的一些列工作。在spring框架中,我们只需要在哪里使用注解直接加上一行代码即可。注解解析的工作已经被spring框架封装好了,所以,我们不用做第一,三部工作。
关于注解的四个W一个H总结到这里,我会在接下来的系列博客中分别介绍如何自定义注解以及重复注解,以及注解的常见问题,敬请期待...