直接进入主题,什么是注解?
注解是一种能被添加到Java代码中的元数据,类、方法、变量、参数和包都可以用注解来修饰。注解对于它所修饰的代码并没有直接的影响。
元注解:
元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:
1.@Target,
2.@Retention,
3.@Documented,
4.@Inherited
@Target说明了Annotation所修饰的对象范围
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention定义了该Annotation被保留的时间长短
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
@Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。
@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
实例:自定义注解,代码主要分为三块,
1,自定义注解类的编写:MyAnnotion
2,切面的编写:MyAspect;
3,自定义注解的使用+测试;
代码结构如下所示
注解类MyAnnotation详细代码,@Target(ElementType.METHOD)代表该注解作用于方法,@Retention(RetentionPolicy.RUNTIME)表示在运行时保留,
package com.aop.annotation;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation {
String value() default "";
}
MyAspect详细代码。 @Pointcut(value = "@annotation(com.aop.annotation.MyAnnotation)")表示切点为带有MyAnnotation的方法,
package com.aop.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.lang.annotation.Annotation;
@Aspect
@Component
public class MyAspect {
private static final Logger logger = LoggerFactory.getLogger(MyAspect.class);
@Pointcut(value = "@annotation(com.aop.annotation.MyAnnotation)")
public void annotationPointCut() {
}
//@Around("annotationPointCut()")
@Before("annotationPointCut()")
public Object doBefore(JoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
String methodName = signature.getMethod().getName();
System.out.println("方法名:" + methodName);
Annotation[] annotations = signature.getMethod().getAnnotations();
for (int i = 0; i < annotations.length; i++) {
System.out.println(annotations[i]);
}
return null;
}
}
使用注解类
package com.aop.controller;
import com.aop.annotation.MyAnnotation;
import org.springframework.stereotype.Service;
@Service
public class AopController {
@MyAnnotation("yangNiMa")
public void testAopAndAnnotion(){
System.out.println("=======12345678=========");
}
}
测试类
package com.aop;
import com.aop.annotation.MyAnnotation;
import com.aop.controller.AopController;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class AopApplicationTests {
@Autowired
private AopController aopController;
@Test
void contextLoads() {
}
@Test
public void testAnnotionAndAspect() {
aopController.testAopAndAnnotion();
}
}
测试结果,通过Aspect切面拿到带有注解类的方法和自定义注解的值