前言
随着springboot的流行,注解使用的越来越多:
Java注解不仅让我们减少了项目中XML文件,方便了维护,同时也使我们代码更简洁。那么项目中我们如何自定义注解呢?
1. 内置注解
Java注解(Annotation
)又称Java标注,是JDK5.0引入的一种注释机制。
和Javadoc不同,Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。 Java虚拟机可以保留注释内容,在运行时可以获取到注释内容。当然它也支持自定义Java注释。
Java定义了一套注释解,共有7个,3个在java.lang
中,剩下4个在java.lang.annotation
中。
作用于代码的注解:
@Override
:检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。@Deprecated
:标记过时方法。如果使用该方法,会报编译警告。@SuppressWarnings
:指示编译器去忽略注解中声明的警告。
元注解(作用于注解的注解)
@Target
:用于描述注解的使用范围。取值(ElementType
)有:
1.CONSTRUCTOR
:应用于构造器。
2.FIELD
:应用于字段或属性(包括枚举中的常量)。
3.LOCAL_VARIABLE
:应用于局部变量。
4.METHOD
:应用于方法。
5.PACKAGE
:应用于包。
6.PARAMETER
:应用于参数。
7.TYPE
:类、接口(包括注解类型) 或enum
声明。
8.ANNOTATION_TYPE
:应用于注解类型。
9.TYPE_PARAMETER
:1.8版本新增,应用于类型变量。
10.TYPE_USE
:1.8版本新增,应用于任何使用类型的语句中(例如声明语句、泛型和强制转换语句中的类型)。@Inherited
:标记这个注解是继承于哪个注解类。@Retention
:用于描述注解的生命周期。取值(RetentionPoicy
)有:
1.SOURCE
:在源文件中有效,编译时被丢弃,不包含在类文件中。
2.CLASS
:在class文件中有效,由编译器保留,但Java虚拟机(JVM)会忽略。
3.RUNTIME
:由JVM 加载,包含在类文件中,在运行时可以被获取到。@Document
:表明该注解标记的元素可以被Javadoc 或类似的工具文档化。
从 Java 7 开始,额外添加了 3 个注解:
@SafeVarargs
:Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。@FunctionalInterface
:Java 8 开始支持,标识一个匿名函数或函数式接口。@Repeatable
:Java 8 开始支持,标识某注解可以在同一个声明上使用多次。
2. 自定义注解
使用@interface
自定义注解时,自动继承了java.lang.annotation.Annotation
接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。
@interface
用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型。
定义注解格式如下:
public @interface 注解名 {定义体}
下面是一个具体的例子:
package com.jid.java.test.annotation;
import java.lang.annotation.*;
/**
* @description: 自定义注解
* @author: jidi
* @eamil: jidi_jidi@163.com
* @create: 2020-04-07 21:19
**/
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface OptLog {
public int optType() default 0;
public String optMessage() default "";
}
注解参数的可支持数据类型:
- 所有基本数据类型(
int
,float
,boolean
,byte
,double
,char
,long
,short
) String
类型Class
类型enum
类型Annotation
类型- 以上所有类型的数组
定义体中的参数设定,按照以下规定:
- 只能用
public
或默认(default
)这两个访问权修饰.例如,String value();
这里把方法设为default
默认类型。 - 参数成员只能用基本类型:
int
,float
,boolean
,byte
,double
,char
,long
,short
八种基本数据类型和String
,Enum
,Class
,annotations
等数据类型,以及这些类型的数组。 - 如果只有一个参数成员,最好把参数名称设为
value
。
注解元素的默认值:
- 注解元素必须有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,非基本类型的注解元素的值不可为
null
。 - 使用空字符串或
0
作为默认值是一种常用的做法。
3 使用自定义注解
自定义注解跟其它框架提供的注解一样使用,只是参数值根据实际情况确定。
@OptLog(optType = 1)
public void print() {
...
}
4. spring boot框架aop配置使用自定义注解
在spring boot框架中,使用自定义注解,步骤如下:
-
在pom文件引入aop依赖
注意:在完成了引入AOP依赖包后。AOP的默认配置属性中,spring.aop.auto
属性默认是开启的,也就是说只要引入了AOP依赖后,默认已经增加了@EnableAspectJAutoProxy
,不需要在程序主类中增加@EnableAspectJAutoProxy
来启用。 -
自定义注解
-
定义切面
-
使用注解