简介
注解是一种能添加到Java代码中的元数据,方法,类,参数与包都可以使用注解进行修饰,可以将注解看为一种特殊的标记,在Java编译或运行过程中将有这种特殊标记的部分进行特殊处理。
自定义注解
注解创建
自定义一个新的注解包括以下基本元素
1、修饰符:注解修饰可以用于
2、关键字:关键字为@interface
3、名称:自定义注解的名称,例如java内置的 Resource
4、注解类型元素:注解中的内容,比如根据需要传递的参数等
5、元注解:主要有@Target、@Retention、@Inherited、@Documented
@Target:用于描述注解的使用范围,该注解可以使用在什么地方
Target类型 | 描述 |
ElementType.TYPE | 应用于类、接口(包括注解类型)、枚举 |
ElementType.FIELD | 应用于属性(包括枚举中的常量) |
ElementType.METHOD | 应用于方法 |
ElementType.PARAMETER | 应用于方法的形参 |
ElementType.CONSTRUCTOR | 应用于构造函数 |
ElementType.LOCAL_VARIABLE | 应用于局部变量 |
ElementType.ANNOTATION_TYPE | 应用于注解类型 |
ElementType.PACKAGE | 应用于包 |
备注:例如@Target(ElementType.METHOD),标志的注解使用在方法上,但是我们在这个注解标志在类上,就会报错
@Retention:表明该注解的生命周期
生命周期类型 | 描述 |
RetentionPolicy.SOURCE | 编译时被丢弃,不包含在类文件中 |
RetentionPolicy.CLASS | JVM加载时被丢弃,包含在类文件中,默认值 |
RetentionPolicy.RUNTIME | 由JVM 加载,包含在类文件中,在运行时可以被获取到 |
@Inherited:是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
@Documented:表明该注解标记的元素可以被Javadoc 或类似的工具文档化
案例
1、自定义认证注解@Authorize
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Authorize {
//必填参数
String[] params() default {};
}
2、创建AOP切面类拦截注解
创建一个aop切面类来拦截注解,实现注解所需要的相关业务逻辑
1、引入aop
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2、创建aop切面类
@Aspect
@Component
@Slf4j
public class AuthorizeAspect {
// 引入我们自定义的注解类做切面的拦截点
@Pointcut("@annotation(com.example.demo.annotation.Authorize)")
private void pointCut(){}
// 先执行注解的逻辑
@Before("pointCut()")
public void before(JoinPoint joinPoint){
Object[] objects = joinPoint.getArgs();
System.out.println("执行了切面");
User user = JSONObject.parseObject(JSONObject.toJSONString(objects[0]), User.class);
System.out.println(user);
}
}
3、调用示例
@RestController
public class HomeController {
@Resource
private OrderService orderService;
// 使用自定义注解进行权限验证
@GetMapping("/")
@Authorize
public String home(User user){
orderService.createOrder();
return "success";
}
}
执行了切面
User(username=jiangjx001, password=123456)
正在进行订单创建
监听到订单创建
参考:https://blog.csdn.net/qq_21187515/article/details/109643130
原创文章,作者:jiafegn,如若转载,请注明出处:https://www.techlearn.cn/archives/2026