Java注解大全

从JDK5开始,Java增加了对元数据(MetaData)的支持,也就是Annotation(注解)。

Annotation提供了一种为程序元素设置元数据的方法,从某意义上级来看Annotation就像修饰符一样,可用于修饰包,类、构造器、方法、成员变量、参数、局部变量的声明、这些信息被存储在Annotation的name=value对中。
Annotation是一个接口,程序可以通过反射来获取指定元素的Annotation对象,然后通过Annotation对象来取得注释里的元数据。
Annotation 能被用来为程序元素(类,方法,成员变量等)设置元数据。值得指出的是,Annotation不影响程序代码的执行,无论增加、删除Anntation,代码始终如一地执行。
如果希望让程序中的Annotation在运行时起一定的作用,只有通过某种配套的工具对Annotation中的信息进行访问额处理,访问和处理Annotation的工具统称为APT(AnnotationProcessingTool)
基本Annotation
Annotation必须使用工具来处理工具负责提取Annotation里包含的元数据,工具还会根据这些元数据增加额外的功能。在系统学习新的Annotation语法之前,先看下Java提供的4个基本Annotation的用法——使用Annotation时要在其前面加上@符号,并把Annotation当成一个修饰符使用,用于修饰它支持的程序元素。
4个基本的Annotation如下:
@Override
@Deprecated
@SuppresWarnings
@SafeVarargs
上面4个基本Annotation中的@SafeVarargs是Java7新增的。这4个基本的Annotation都定义在Java.lang包下,读者可以通过查阅它们的API文档来了解关于它们的更过细节。
限定重写父类方法:@Override
@Override就是用来指定方法的覆载的,它可以强制一个子类必须覆盖父类的方法。
标识已过时:@Deprecated
@Deprecated用于表示某个程序元素(类,方法等)已过时,当其他程序使用已过时的类、方法时,编译器将会给出警告。
抑制编译器警告:@SuppressWarnings
@suppressWarnings指示被该Annotation修饰的程序元素(以及该程序元素中的所有子元素)取消显示指定的编译器警告。@SuppressWarnings会一直作用于该程序元素的所有子元素。
堆污染警告与@SafeVarargs Java把可能引发异常,而在编译器不报错的代码称之为堆污染
JDK的元Annotation
JDK除了在Java.lang下提供了4个基本的Annotation之外,还在Java.lang.annotation包下提供了4个Meta Annotation(元 Annotation)这4个元Annotation都用于修饰其他的Annotation定义。

使用@Retention
@Retention只能用于修饰一个Annotation定义,用于指定被修饰的Annotation可以保留多长时间,@Retention包含一个RetentionPolicy类型的value成员变量,所以使用@Retention时必训为该value成员变量指定值。
value成员变量的值只能是如下3个
RetentionPolicy.CLASS:编译器将把Annotation记录在class文件中。当运行Java程序是, JVM不再保留Annotation.这是默认值。
RetentionPolicy.RUNTIME:编译器将把Annotation记录在class文件中。当运行Java程序是,JVM也会保留Annotation,程序可以通过反射获取该Annotation信息。
RetentionPolicy.SOURCE:Annotation只保留在源码中,编译器直接丢弃这种Annotation
如果需要通过反射获取注释信息,就需要使用value属性值为RetentionPolicy.RUNTIME的@Retention.使用@Retention元数据Annotation可采用如下代码为value指定值
//定义下面的Testable Annotation保留到运行时
@Retention(value=RetentionPolicy.RUNTIME)
public @interface Testable{}
//定义下面的TestableAnnotation将被编译器直接丢弃
@Retention(RetentionPolicy.SOURCE)
public @interface Testable{}
使用@Target
@Target也只能修饰一个Annotation定义,它用于指定被修饰的Annotation能用于修饰那些程序单元。@Target元Annotation也包含一个名为value的成员变量,该成员变量的值只能是如下几个。
ElementType.ANNOTATION_TYPE:指定该策略的Annotation只能修饰Annotation.
ElementType.CONSTRUCTOR:指定该策略的Annotation只能修饰构造器
ElementType.FIELD:指定该策略的Annotation只能修饰成员变量
ElementType.LOCAL_VARIABLE:指定该策略的Annotation只能修饰局部变量
ElementType.PMETHOD:指定该策略的Annotation只能修饰方法定义
ElementType.PARAMETE:指定该策略的Annotation可以修饰参数
ElementType.TYPE:指定该策略的Annotation可以修饰类、接口(包括注释类型)或枚举类
使用@Documented
@Documented用于指定被该元Annotation修饰的Annotation类将被Javadoc工具提取成文档,如果定义Annotation类是使用了@Documented修饰,则所有使用该Annotation修饰的程序元素的API文档中将会包含该Annotation说明。
使用@Inherited
@Inherited元Annotation指定被它修饰的Annotation将具有继承性——如果某个类使用了@A Annotation(定义该Annotation时使用了@Inherited修饰)修饰,则其子类将自动被@A修饰。
自定义Annotation
定义新的Annotation
定义新的Annotation类型使用@interface关键字(在原有的interface关键字前增加@符号)定义一个新的Annotation类型与定义一个接口非常像。
提取Annotation信息
当开发者使用Annotation修饰了类、方法、Field等成员之后,这些Annotation不会自己生效,必须由开发者提供相应的工具来提取并处理Annotation信息
Java使用Annotation接口来代表程序元素前面的注释,该接口是所有Annotation类型的父接口。Java5在Java.lang.reflect包下新增了AnnotatedElement接口,该接口代表程序中可以接受注解的程序元素。该接口主要有如下几个实现类。
Class:类定义
Constructor:构造器定义
Field:类的成员变量定义
Method:类的方法定义
Package:类的包定义
java.lang.reflect包下主要包含一些实现反射功能的工具类,从Java5开始,java.lang.reflect包所提供的反射API扩充了读取允许是Annotation的能力。当一个Annotation类型被定义为运行时的Annontatin后,该Annotation才会在运行时可见,JVM才会在装载*.class文件是读取保存在class文件中的Annotation。
AnnotatedElement接口是所有程序元素(如Class、Method、Constructor等)的接口。所以程序通过反射获取了某个类的AnnotatedElement对象(如:Class、method、Constructor等)的父类接口,所以程序通过反射获取某个类的AnnotatedElement对象(如Class、Method、Constructor等)之后,程序就可以调用该对象的如下3个方法来访问Annotation信息。
· getAnnotation(ClassannotationClass):返回该程序元素上存在的指定类型的注释,如果该类型的注释不存在,则返回null。
Annotation[] getAnnotations():返回该程序元素上存在的所有注释。
bolean isAnnotationPresent(Class<?extends Annotation> annotationClass):判断该程序元素上是否存在指定类型的注释,如果存在则返回true,否则返回false。
编译时处理Annotation。
APT(Annotation Processing Tool)是一种处理注释的工具,它对源代码文件进行检测找出其中的Annotation后,对Annotation进行额外的处理。
Annotation处理器在处理Annotation时可以根据文件中的Annotation生成额外的源文件和其他文件(文件的具体内容有Annotation处理器的编写者觉得),APT还会编译生成的源代码文件和原来的源文件,将他们一起生成class文件。
使用APT的主要目的是简化开发者的工作量,因为APT可以在编译程序源代码的同时生成一些附属文件(比如源文件、类文件、程序发布描述文件等),这些附属文件的内容也都与源代码相关。
了解过Hibernate早期版本的读者都知道:每写一个Java类文件,还必须额外地维护一个Hibernate映射文件(名为*.hbn.xml)的文件,也有一些工具可以自动生成。
Servlet的Annotation
Servlet3.0的一个显著改变是顺应了潮流,抛弃了采用web.xml配置Servlet、Filter、Listener的繁琐的步骤,允许开发人员使用Annotation修饰他们,从而进行部署。
@WebServlet:用于修饰一个Servlet类,用户部署Servlet类
@WebInitParam:用于与@WebServlet或@WebFiter一起使用,为Servlet、Filter配置参数。
@WebListener:用于修饰Litener类用于部署Litener类
@WebFilter:用于修饰Fitert类,用于部署Filter类。
@MultipartConfig:用于修饰Servlet,指定该Servlet将会负责处理multipart/form-data类型的请求(主要用于文件上传)
@ServletSecurity:这是一个与JAAS有关的Annotation,修饰Servlet指定该Servlet的安全与授权控制。
@HttpConstranint:用于与@ServletSecurity一起使用,用于指定该Servlet的安全与授权控制。
@HttpMethodConstraint:用于与@ServletSecurity一起使用,用于指 `定该Servlet的安全与授权控制。
JPA Annotation支持
早期Hibernate使用XML映射文件管理持久类和数据表之间的映射关系,而JPA规范则推荐使用更加简单、易用的Annotation来管理实体类与数据表之间的映射关系,这样就避免了一个实体需要同时维护两份文件(Java类和XML映射文件),实体类的Java代码以及映射信息(写在Annotation中)都可集中在一份文件中。
当采用Annotation来管理实体类后,可以得到如下公式:
PO =POJO+@Annotation
@Entity用于标注该类是一个持久化类
@EmbeddedId用于标注符合类型呢的标示属性
@Embedded用于标注一个组件属性
·Spring注解
当使用XML配置方式来配置Bean实例时,可以通过scope来指定Bean实例的作用于,没有指定scope属性的Bean实例的作用域默认是singleton
当我们采用零配置方式来管理Bean实例时,可使用@Scope Annotation,只要在该Annotation中提供作用域的名称即可。
@Resource配置依赖
@Resource位于java.annotation报下,是来自JavaEE规范的一个Annotation,Spring直接借鉴了该Annotation,通过使用该Annotation为目标bean指定协作者Bean
@Resource有一个name属性,在默认情况下,Spring将这个值解释为需要注入Bean实例的名字。换句话说,使用@Resource与<property…/>元素的ref属性有相同的效果。
@PostConstruct和@PreDestroy定制生命周期行为
@PostConstruct和@preDestroy同样位于Java.annotation包下,也是来自JavaEE规范的两个annotation,Spring直接借鉴了它们,用于定制Spring容器中Bean的生命周期行为。
前者修饰的方法是Bean的初始化方法,后者修饰的方法是Bean销毁之前的方法。
Spring3.0新增的Annotation
Spring 3.0再次增加了两个Annotation:@DependsOn和@Lazy,其中@DependsOn用于强制初始化其他Bean,而@Lazy则用于指定该Bean是否取消初始化。
@DependsOn可以修饰Bean类或方法,使用该Annotation是可以指定一个字符串数组作为参数,每个数组元素对应于一个强制初始化的Bean
@Lazy主要用于修饰SpringBean类,用于指定Bean的初始化行为,使用该Annotation是可指定一个boolean型的value属性,该属性觉得是否要预初始化该Bean
自动装配和精确装配
Spring提供了@Autowired Annotation来指定自动装配,使用@Autowired可以标注setter方法、普通方法、Field和构造器等。当使用@utowired标注setter方法是,默认采用的是byType的自动装配策略
当@Autowired来标注一个Field是,Spring将会吧容器中与该Field类型匹配的Bean注入该属性
为了实现精准的自动装配,Spring提供了@Qualifier Annotation,通过了使用@Qualifier,允许根据Bean标示来指定自动装配。
@Qualifer通常可用于修饰Field.
使用@Transactional
Spring还允许将事务配置放在Java类中定义,这需要借助于@Transactional Annotation,该Annotation即可以用于修饰SpringBean类也可用于修饰Bean类中的某个方法。
如果使用@Transactional修饰Bean类,表明这些事务设置对整个Bean类起作用;如果使用@Transactional修饰Bean类的某个方法,表明这些事务只对该方法有效、
使用@Transactional是可以指定如下方法。
isolation:用于指定事务的隔离级别。默认为底层事务的隔离级别
noRollbackFor:指定遇到指定异常是强制不回滚事务
noRollbackForClassName:指定遇到指定多个异常是强制不回滚事务。该属性值可以指定多个异常类名。
propagation:指定事务传播属性。
readOnly:指定事务是否只读
rollbackFor:指定遇到异常是强制回滚事务。
rollbackForClassName:指定遇到指定多个异常是强制回滚事务。该属性值可以指定多个异常类名。
timeout:指定事务的超时时长。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值