JAVA自定义注解运用

一、为什么会用到自定注解?

  在实际开发中,会遇到很多重复性的代码。比如,登录状态的校验,登录用户信息的获取,对指定代码块增加日志打印。这些代码都是一些重复性冗余的代码。为了减少这些代码,我们通常会用AOP机制去切割。但不足的地方是不够灵活,如果有一个东西可以让我们可以灵活的标记指定的方法或参数。如果有一个类充当标记点,就能让AOP准确的切割。而自定义注解就充当了这个角色
  在常用的框架中,也有自定义的注解的痕迹。最常见的hibernate Valiator框架中,对参数的校验@NotNull。spring mvc中Controller,Service的注解,@RestController、@Service。
  所以自定义注解可以减少重复性代码,增加系统的扩展性以及代码的灵活性。

二、自定义注解组成

首先我们需要对注解进行分类,有元注解(java自带的注解,用来创建自定义注解)、一般注解(计算机产生的源代码)、标记注解(自定义注解)
JAVA自定义注解运用_第1张图片

#自定义注解
@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodInfo{
    String author() default 'Pankaj';
    String date();
    int revision() default 1;
    String comments();
}

  使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation。不能继承其他注解和接口。@interface是用来声明一个注解。其中每个方法就是注解中的属性。方法名为属性名,返回类型为属性类型,可以声明一个默认值default。注意:返回值类型只能为基本类型,class,String,enum。

其次是定义注解时所需的元注解:
- @Documented——声明该类可被javadoc工具文档化。即JDK API文档。
- @Target——声明该注解类型可注解的元素范围。即注解范围。该元注解的取值可以为TYPE,METHOD,CONSTRUCTOR,FIELD等

表示该注解可以用于什么地方,可能的ElementType参数有:
CONSTRUCTOR:构造器的声明
FIELD:域声明(包括enum实例)
LOCAL_VARIABLE:局部变量声明
METHOD:方法声明
PACKAGE:包声明
PARAMETER:参数声明
TYPE:类、接口(包括注解类型)或enum声明


  • @Inherited——允许子类继承父类中的注解
  • @Retention——指保留的时间长短

SOURCE:注解将被编译器丢弃
CLASS:注解在class文件中可用,但会被VM丢弃
RUNTIME:VM将在运行期间保留注解,因此可以通过反射机制读取注解的信息

三、自定义注解的实际应用

下面举个最常用的自定义注解——登陆验证
/**
 * 校验登陆注解
 * Created by live on 2018-06-10.
 */
@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckLogin {
    boolean required() default true;
}
/**
 * 登录校验AOP切面
 * Created by live on 2018-06-10.
 */
@Aspect
public class LoginAspect {

    @Pointcut("@annotation(com.linyoga.annotation.CheckLogin)")
    public void checkLogin(){}

    @Before("checkLogin()")
    public void checkloginValiator(JoinPoint joinPoint){
        System.out.printf("登陆校验 start");
    }
}

四、总结

  • 善用自定义注解去解决重复性代码问题,是提高工作效率以及增加系统扩展性的方法之一。虽说自定义注解给开发人员带来方便,但也要考虑因反射所带来的性能上的消耗

你可能感兴趣的:(java基础)