13 注解
注解的定义
注解是Java 1.5 引入的,目前已被广泛应用于各种Java框架,如Hibernate,Jersey,Spring。注解相当于是一种嵌入在程序中的 元数据 ,可以使用注解解析工具或编译器对其进行解析,也可以指定注解在编译期或运行期有效。在注解诞生之前,程序的元数据存在的形式仅限于java注释或javadoc,但注解可以提供更多功能,它不仅包含元数据,还能作用于运行期,注解解析器能够使用注解决定处理流程。Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和任何元数据 (metadata)的途径和方法。Annotation是一个接口,程序可以通过反射来获取指定程序元素的Annotation对象,然后通过Annotation对象来获取注解里面的元数据。注解API非常强大,被广泛应用于各种Java框架。
注解的作用
1,编译检查
Annotation具有“让编译器进行编译检查的作用”。,例如,@SuppressWarnings, @Deprecated和@Override都具有编译检查作用。
2,在反射中使用Annotation
在反射的Class, Method, Field等函数中,有许多于Annotation相关接口。这也意味着,我们可以在反射中解析并使用Annotation。
3,根据Annotation生成帮助文档
通过给Annotation注解加上@Documented标签,能使该Annotation标签出现在javadoc中。
4,能够帮忙查看查看代码
通过@Override, @Deprecated等,我们能很方便的了解程序的大致结构。另外,我们也可以通过自定义Annotation来实现一些功能。
5,注解处理器
如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了。使用注解的过程中,很重要的一部分就是创建于使用注解处理器。Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处理器。
6,在框架中的作用
在开发Java程序,尤其是Java EE应用的时候,总是免不了与各种配置文件打交道。
以Java EE中典型的S(pring)S(truts)H(ibernate)架构来说,Spring、Struts和Hibernate这三个框架都有自己的XML格式的配置文件。这些配置文件需要与Java源代码保存同步,否则的话就可能出现错误。而且这些错误有可能到了运行时刻才被发现。把同一份信息保存在两个地方,总是个坏的主意。理想的情况是在一个地方维护这些信息就好了。其它部分所需的信息则通过自动的方式来生成。JDK 5中引入了源代码中的注解(annotation)这一机制。
注解使得Java源代码中不但可以包含功能性的实现代码,还可以添加元数据。注解的功能类似于代码中的注释,所不同的是注解不是提供代码功能的说明,而是实现程序功能的重要组成部分。Java注解已经在很多框架中得到了广泛的使用,用来简化程序中的配置。
因为注解大多都有自己的配置参数,而配置参数以名值对的方式出现,所以从某种角度来说,可以把注解看成是一个XML元素,该元素可以有不同的预定义的属性。而属性的值是可以在声明该元素的时候自行指定的。在代码中使用注解,就相当于把一部分元数据从XML文件移到了代码本身之中,在一个地方管理和维护。 上面两段话其实已经阐述了java注解的主要作用之一,就是跟踪代码依赖性,实现替代配置文件功能。比较常见的是Spring等框架中的基于注解配置。现在的框架很多都使用了这种方式来减少配置文件的数量。基本上秉持着这么一个原则,与具体场景相关的配置应该使用注解的方式与数据关联,与具体场景无关的配置放于配置文件中。在另一方面我们还可以在通过设置注解的@Retention 级别在运行时使用反射对不同的注解进行处理。
注解的原理
注解 注解就相当于标记然后后期再做出一些操作,实现自动化一些配置,或生产一些文件。按照给出模式套路,注解就相当于快捷键,省略了一些重复操作。
定义规则,自动化实现一些结构,自动补全。
注解的使用
jdk注解
形式 | 作用 |
---|---|
@Override 重写 | 标记重写方法 |
@Deprecated 过时 | 标记过时方法 |
@SuppressWarnings(“某种警告”) | 标记忽略警告 |
第三方注解
SpringMVC
Spring
MyBatis
形式 | 作用 |
---|---|
@Select | |
@Results | |
@Result | |
@Delete | |
@Param | |
@RestultMap | |
@Insert | |
@SelectKey | |
@Update |
注解自定义
自己定义的注解,让别人去使用,完整的注解分两块,一块是注解的定义,与之配套的会有相应的解析器。对我们而言,就是使用注解,能看懂别人的注解即可。学习自定义注解就是以后看到一个注解能够使用。
简单入门
@interface:用来声明一个注解。注解类里的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型。可以通过default来声明参数的默认值。
@interface Simple{
//注解形式
//注解值
}
元注解
元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的 meta-annotation 类型,它们被用来提供对其
它 annotation类型作说明。Java5.0定义的元注解有四个,这些类型和它们所支持的类在java.lang.annotation包中可以找到。
元注解 | 解释 |
---|---|
@Target 目标,靶子 此注解只能用在方法上 @Target(ElementType.METHOD) | 描述注解的使用范围 CONSTRUCTOR:用于描述构造器 FIELD:用于描述域 LOCAL_VARIABLE:用于描述局部变量 METHOD:用于描述方法 PACKAGE:用于描述包 PARAMETER:用于描述参数 TYPE:用于描述类、接口(包括注解类型) 或enum声明 |
@Retention @Retention(RetentionPolicy.RUNTIME) | 用于描述注解的生命周期 SOURCE:在源文件中有效(即源文件保留) CLASS:在class文件中有效(即class保留) RUNTIME:在运行时有效(即运行时保留) |
@Documented | 被javadoc或类似工具文档化, 它应用于类型声明,类型声明的注解会影响客户端对注 解元素的使用。 |
@Inherited | 表示一个注解类型会被自动继承,如果用户在类声明的 时候查询注解类型,同时类声明中也没有这个类型的注 解,那么注解类型会自动查询该类的父类,这个过程将 会不停地重复,直到该类型的注解被找到为止,或是到 达类结构的顶层(Object)。 |