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();//执行业务方法
}
}
}