java自定义注解

理解

@interface是注解的关键字,它和java中的class、interface、Enum是同级别的。它可以用于修饰 修饰,类、方法、变量、参数、包 。作用是使得加上了注解的“目标”实现额外的功能。 注解就是一种标志,单独使用注解,就相当于在类、方法、参数和包上加上一个装饰,什么功能也没有,仅仅是一个标志。一般情况下需要通过拦截器、AOP切面这些地方获取注解标志,并实现额外的功能。

元注解

元注解是指由java提供的基础注解类型,一共有4个,分别是@Target、@Retention、@Inherited、@Documented。在自定义注解的时候,需要加上元注解来配置自定义注解的属性。

# @Target用于描述自定义注解的使用范围,该注解可以使用在什么地方
ElementType.TYPE    应用于类、接口(包括注解类型)、枚举
ElementType.FIELD   应用于属性(包括枚举中的常量)
ElementType.METHOD  应用于方法
ElementType.PARAMETER   应用于方法的形参
ElementType.CONSTRUCTOR 应用于构造函数
ElementType.LOCAL_VARIABLE  应用于局部变量
ElementType.ANNOTATION_TYPE 应用于注解类型
ElementType.PACKAGE 应用于包
​
# @Retention 表明该注解的生命周期
RetentionPolicy.SOURCE  编译时被丢弃,不包含在类文件中
RetentionPolicy.CLASS   JVM加载时被丢弃,包含在类文件中,默认值
RetentionPolicy.RUNTIME 由JVM 加载,包含在类文件中,在运行时可以被获取到
一般情况下使用RetentionPolicy.RUNTIME
​
# @Inherited:它表示自定义注解是被继承的。如果一个类用上了@Inherited修饰的自定义注解,那么其子类也会继承这个自定义注解
这个用的很少
​
# @Documented:表明该注解标记的元素可以被Javadoc 或类似的工具文档化
没啥用
 

注解里面的属性

。。。

SpringAOP

。。。

springAOP+自定义注解实例

自定义注解的定义,如果只定义注解,那么该注解就仅仅只是装饰而没有任何作用

@Retention(RetentionPolicy.RUNTIME)//表明该注解在java运行时也有效
@Target(ElementType.METHOD)//表明改注解只能使用在方法上
public @interface IsRun {

}

注解切面处理类

额外的功能由该类实现,这里新增一个校验的功能

@Aspect//spring的AOP
@Component//注册bean
@SuppressWarnings("all")//告诉编译器忽略所有的警告
public class IsRunServiceAspect {

    @Autowired
    private IsRunService isRunService;
    
	//表示将使用了自定义注解的方法,作为一个切入点
    @Pointcut("@annotation(edu.likunzhu.modules.common.annotation.isrun.IsRun)")
    public void pointCut(){}

    //对切入点进行处理,这里对切入点进行一个校验
    @Around(value = "pointCut()")
    @SuppressWarnings("all")
    public void deal(ProceedingJoinPoint point) throws Throwable{
        if (isRunService.isRun()){
            point.proceed();//执行业务方法
        }
    }

}