什么是注解?
注解(Annontation),Java5引入的新特性,位于java.lang.annotation包中。提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。主要用于简化代码,提高变成的效率
注解如何定义?
public @interface 注解名{}和定义接口多了一个@符号 接口: public interface 接口名
注解: public @interface 注解名
元注解:
元注解是描述注解的注解,也就是专门为自定注解发明使用的注解
- @Retention
用于定义注解的生命周期,设置值在枚举类RetentionPolicy里面
参数 | 作用 |
---|---|
RetentionPolicy.SOURCE | 标记的注解仅保留在源级别中,而被编译器忽略 |
RetentionPolicy.CLASS | 标记的注解在class文件中有效,但 Java 虚拟机(JVM)会忽略 |
RetentionPolicy.RUNTIME | 标记的注解由 JVM 保留,因此运行时环境可以使用它 |
- @Documented
注解表示是否将此注解的相关信息添加到javadoc文档中,用于描述生成帮助文档时是否要保留其注解信息。
- @Inherited
用于描述被它修饰的注解是否具有继承性,是否可以被继承
- @Target
用于描述注解的使用范围,也就是注解可以用在什么地方,如果我们想要同时满足两种需求,多个参数只需要用大括号抱起来,逗号隔开就可以了
参数 | 作用 |
---|---|
ElementType.CONSTRUCTOR | 描述构造器 |
ElementType.FIELD | 描述字段 |
ElementType.ANNOTATION_TYPE | 注解类型 |
ElementType.PACKAGE | 包声明 |
ElementType.METHOD | 方法级注解 |
ElementType.PARAMETER | 方法的参数 |
ElementType.TYPE | 类的任何元素 |
如下,这样我们就完成了自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface Limit {
String key() default "";
double permitsPerSecond() ;
long timeout();
TimeUnit timeunit() default TimeUnit.MILLISECONDS;
}
如何去使用自定义注解完成想要的功能
1.导入Aop的依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
2.开启Aop功能
@SpringBootApplication
//添加此注解,启用AspectJ自动代理。它会自动检测带有@Aspect注解的类,并为其创建代理对象
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
3.书写切面类
@Aspect
@Component
public class LimitAop {
private final Map<String, RateLimiter> limitMap =Maps.newConcurrentMap();
@Around("@annotation(com.***.Annotation.Limit)")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
代码实现....
}
也可以根据不同的实际开发场景,选择不同的通知类型