「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」
Java注解实际上一般的修饰符使用方式没有什么区别,以我们自定义的 @OperLog注解为例:
//删除用户
@GetMapping("/deluser/{id}")
@OperLog(operModul = "用户管理",operType = "删除",operDesc = "删除用户")
public String deleteUser(@PathVariable("id")int id){
userService.delUser(id);
return "redirect:/users";
}
通过在一个方法上使用@OperLog注解后,当运行到该方法时,就会识别到这个注解.如我们运行到这个deleteUser方法时,通过注解,我们知道现在的操作模块是“用户管理”,操作类型为“删除”,操作说明为“删除用户”。
下面通过@OperLog这个我们自定义的注解,讲解注解的基本语法。
基本语法
一、声明注解与元注解
package com.tjm.config;
import java.lang.annotation.*;
/*
自定义操作日志注解
@Author tjm
*/
// 注解放置的目标位置,METHOD是可注解在方法级别上
@Target(ElementType.METHOD)
// 注解在哪个阶段执行
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface OperLog {
String operModul() default ""; //操作模块
String operType() default ""; //操作类型
String operDesc() default ""; //操作说明
}
java元注解一共有4个,分别为:@Target、@Retention、@Document、@Inherited。
(1)@Target
指定注解使用的目标范围(类、方法、字段等)。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
/**
* Returns an array of the kinds of elements an annotation type
* can be applied to.
* @return an array of the kinds of elements an annotation type
* can be applied to
*/
ElementType[] value();
}
返回的ElementType是注解类可以应用的元素类型的一个数组。
public enum ElementType {
/**标明该注解可以用于类、接口(包括注解类型)或enum声明*/
TYPE,
/** 标明该注解可以用于字段(域)声明,包括enum实例 */
FIELD,
/** 标明该注解可以用于方法声明 */
METHOD,
/** 标明该注解可以用于参数声明 */
PARAMETER,
/** 标明注解可以用于构造函数声明 */
CONSTRUCTOR,
/** 标明注解可以用于局部变量声明 */
LOCAL_VARIABLE,
/** 标明注解可以用于注解声明(应用于另一个注解上)*/
ANNOTATION_TYPE,
/** 标明注解可以用于包声明 */
PACKAGE,
/**
* 标明注解可以用于类型参数声明(1.8新加入)
* @since 1.8
*/
TYPE_PARAMETER,
/**
* 类型使用声明(1.8新加入)
* @since 1.8
*/
TYPE_USE
}
这种枚举类型的常量提供了注释在Java程序中可能出现的语法位置的简单分类。
@Target(ElementType.METHOD)就表示这个注解可以用于方法声明;
如果一个注解可用于多种元素类型,多个值用{}包含并用逗号分开,如下:
@Target(value={ FIELD,TYPE_PARAMETER, TYPE_USE,METHOD})