(1)首先我们可以通过@interface来定义一个注解:
import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Documented; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.Target; @Inherited //@Documented @Retention(RUNTIME) @Target(METHOD) public @interface TestAnnotation { /** * 业务名称 * @return */ String value() default ""; }
此时可能需要读者先去了解元注解的概念,元注解主要有以下几个:
该注解的参数主要是RetentionPolicy类型数据,它的取值有:
SOURCE:源码级别保留,编译后即丢弃。 CLASS:编译级别保留,编译后的class文件中存在,在jvm运行时丢弃,这是默认值。 RUNTIME:运行级别保留,编译后的class文件中存在,在jvm运行时保留,可以被反射调用
该注解的参数格式为:
@Retention(RetentionPolicy.RUNTIME)
该注解的参数主要是ElementType枚举类型数据,它的取值有:
TYPE:类,接口或者枚举 FIELD:域,包含枚举常量 METHOD:方法 PARAMETER:参数 CONSTRUCTOR:构造方法 LOCAL_VARIABLE:局部变量 ANNOTATION_TYPE:注解类型 PACKAGE:包
其中该注解分为单个参数和多个参数两种形式:
(1)单个参数 //如果导入的是import java.lang.annotation.ElementType; @Target(ElementType.TYPE) //如果导入的是import java.lang.annotation.ElementType.TYPE; @Target(TYPE) (2)多个参数 @Retention(value = { ElementType.TYPE,ElementType.METHOD,.....})
该注解用于标注一个父类的注解是否可以被子类继承,如果一个注解需要被其子类所继承,则在声明时直接使用@Inherited注解即可。如果没有写此注解,则无法被子类继承。
该注解表明当前注解应该被 javadoc工具记录。 默认情况下,javadoc是不包括注解的。 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理,所以注解类型信息也会被包括在生成的文档中,是一个标记注解,没有成员。
(2)为了实现注解的功能,我们可以定义一个切面testAspect,其代码如下:
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; @Aspect //标注增强处理类(切面类) @Component //交由Spring容器管理 public class TestAspect { /* * 切入点,即我们所定义的注解类路径 * */ @Pointcut("@annotation(com.cicoding.annotation.TestAnnotation)") public void testCut() { } /* * 方法环绕,增强谋个方法的业务逻辑功能,该注解的参数是填写切入点所作用的方法名称 * 在创建环绕通知的时候,point这个参数是必须写的。因为需要在通知中使用ProceedingJoinPoint.proceed()方法调用被通知的方法。 * 另外,如果忘记调用proceed()方法,那么通知实际上会阻塞对被通知方法的调用。 * 阻塞的意思就是当前注解的方法不会往下执行,只执行到此处。 * */ @Around("testCut()") public Object test(ProceedingJoinPoint point) throws Throwable { // 执行方法 Object result = point.proceed(); System.out.println("已经执行该方法"); return result; } }
最后我们只需要在controller层的方法中加上这个注解,然后再执行这个方法即可,如下图所示:
当程序执行到此处时,就会执行该注解所实现的功能,该案例主要应用的方面有登录日志的记录,用户操作等。
地址:https://www.it610.com/article/1304675483471876096.htm