前言
本来想从接口处入手的,但是一下看到接口里几十个方法,眼睛有点抗拒,想想还是先看作者写的自定义注解吧。
项目里有三个自定义注解:
分别是AccessLimit注解、OperationLogger注解、VisitLogger注解
AccessLimit注解
这是一个访问控制注解,主要功能是在固定周期内限制访问次数,避免某些恶意访问。
@Target(ElementType.METHOD):说明该注解作用于方法上
@Retention(RetentionPolicy.RUNTIME):注解在运行时仍然存在,可以通过反射读取它的信息
使用时,要传入限制周期和周期内限制次数和提示字符串三个参数,最后一个有默认值可以不需要自己传参。
注意:
在Java中,定义注解(Annotation)时,您需要指定注解的元素(即属性),并且每个元素定义后面都需要加上括号。这是因为注解元素的语法要求。
package com.rawchen.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Description: 访问控制
* @Date: 2021-04-04
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AccessLimit {
/**
* 限制周期(秒)
*/
int seconds();
/**
* 规定周期内限制次数
*/
int maxCount();
/**
* 触发限制时的消息提示
*/
String msg() default "操作频率过高";
}
这是项目里该注解的具体运用处,注解规定了30秒内只能访问一下,否则会出现提示信息。提示信息一般是之后通过反射读取出来的,注解本身并不会进行这些逻辑。
OperationLogger注解
这是一个记录操作日志的注解,也是作用在方法上,运行时保留。
需要传入字符串记录具体操作了什么,不传参的话就是个空字符串。
package com.rawchen.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Description: 用于需要记录操作日志的方法
* @Date: 2020-11-29
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OperationLogger {
/**
* 操作描述
*/
String value() default "";
}
这是项目里该注解的具体运用处,方法执行时会记录注解传入的字符串,也就是具体操作,不过这个记录过程不单单是靠注解就能将日志操作写入文件或者数据库的,这个以后再说。
VisitLogger注解
这个是记录访客操作日志记录的注解,也是作用于方法之上,运行时保留
通过传入两个字符串来记录这个被该注解修饰的方法具体是干什么的,然后再通过反射读取写到日志中去。
package com.rawchen.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Description: 用于需要记录访客访问日志的方法
* @Date: 2020-12-04
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface VisitLogger {
/**
* 访问行为
*/
String behavior() default "";
/**
* 访问内容
*/
String content() default "";
}
注解看完了
这样看还是很轻松的,看完注解后理所当然的就该看切面了。
因为通常情况下,一个自定义注解会对应一个切面(Aspect)。
在面向切面编程(AOP)中,切面是一种编程范式,它允许开发者定义跨多个对象的横切关注点(cross-cutting concerns),比如日志记录、事务管理、安全检查等。使用注解来标记那些需要横切关注点处理的方法,然后通过切面来实现这些横切关注点的逻辑,是一种非常优雅和高效的方式。
举个例子,上面提到,项目定义了一个名为OperationLogger的注解,用来标记需要记录操作日志的方法。然后,我们就需要可以创建一个切面来拦截所有带有OperationLogger注解修饰的方法,并在这些方法执行前后添加日志记录的逻辑。
这也就是我上面说的单靠注解是无法完成日志记录等逻辑的。
拜拜!