文章目录

  • 1. 前言
  • 2. 自定义注解
  • 2.1. 元注解
  • 2.2. 自定义注解
  • 2.3. 使用注解
  • 3. AOP
  • 3.1 引入依赖
  • 3.2. Aspect类
  • 3.3. 小结
  • 参考


1. 前言

此文主要讲解 自定义注解、AOP编程 搭配使用,实用而不失优雅,哈哈哈哈

2. 自定义注解

2.1. 元注解

元注解是修饰注解的注解,Java 5定义的元注解:

  • @Target
  • @Retention
  • @Documented
  • @Inherited

@Target 定义 Annotation 所修饰的对象范围,例如:作用于类或者接口上使用 TYPE
@Retention 定义 Annotation 保留时间,例如:在 “运行时” 有效使用 RUNTIME
@Documented 定义描述其它类型的annotation应该被作为被标注的程序成员的公共API,被修饰的注解可以被文档化
@Inherited 定义该注解效果是否能被注解修饰的类的子类所拥有

更多详细资料可以参考 深入浅出Java Annotation(元注解和自定义注解)

2.2. 自定义注解

新建 注解类,这里仅做演示,随意取名。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AnnotationTest {
    String value() default "v1";
}

参数解释:

  • @Target(ElementType.METHOD) 表示该注解作用于 方法
  • @Retention(RetentionPolicy.RUNTIME) 表示 运行时有效
  • @Documented 可被文档化

此时自定义注解已经定义完成了,可直接作用于类上。目前我们没有做任何实现,使用到了类上并没有任何效果。

2.3. 使用注解

public class AnnotationServiceDemo 
    // 此处使用自定义注解
    @AnnotationTest("v2")
    public String arroud(String name){
        System.out.println("AnnotationServiceDemo#arroud");
        return "AnnotationServiceDemo#arroud";
    }
}

3. AOP

3.1 引入依赖

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>${aspectjweaver.version}</version>
</dependency>

aspectjweaver.version 建议使用最新版本

3.2. Aspect类

新建类,采用 @Aspect 注解进行修饰,表示是 Aspect 类。

@Aspect
@Component
public class AnnotationAspect {

	// 定义切点。将AOP和自定义注解进行结合的关键所在
    @Pointcut("@annotation(AnnotationTest)")
    public void annotationPointCut() 
    }   

    // 环绕增强
    @Around("annotationPointCut()")
    public String around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();
        Method method = methodSignature.getMethod();
        // 获取到注解      
        AnnotationTest annotation = method.getAnnotation(AnnotationTest.class);
        System.out.println("注解式拦截:" + annotation.value());        
        // 获取方法参数
        for (int i = 0; i < proceedingJoinPoint.getArgs().length ; i++){
            System.out.println(proceedingJoinPoint.getArgs()[i]);
        }        
        // 获取注解属性值
        if ("v2".equalsIgnoreCase(annotation.value())){
            System.out.println("执行了 around v2");
            return "执行了 around v2";
        } else {        
            // 执行注解修饰的方法
            proceedingJoinPoint.proceed();
            System.out.println("执行around 尾部");
            return "执行around 尾部";
        }
    }
}

代码中关键地方已进行了注释说明。此处采用了 环绕增强 和自定义注解进行搭配使用进行演示。

3.3. 小结

自定义注解+AOP编程方式联合使用,重点在于如何实现注解功能,正好通过AOP方式很优雅的实现。

鉴于知识有限,如有错误,欢迎评论指正。