文章目录
- 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方式很优雅的实现。
鉴于知识有限,如有错误,欢迎评论指正。