当你想对自定义权限进行控制,或者对很多需要的接口进行日志的处理,那写一个方法在需要的类中调用就会让代码很冗余,那么使用springboot的AOP就可以很好的解决这个问题,那么我们就来看看怎么完成自定义的注解类,并实现自己想要的功能
首先,创建一个自己需要的注解类,可以在注解类中设置需要的参数,当然注解中的参数可以是有自己的默认值或者通过注解传参的方式进行传输。
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import java.lang.annotation.*;
@Target({ElementType.METHOD})//
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
@Documented//说明该注解将被包含在javadoc中
//最高优先级
@Order(Ordered.HIGHEST_PRECEDENCE)
public @interface AuthorityControl {
/**
* 所在的警察局
* @return
*/
String policeStationName() default "1"; //设置默认为1
}
完成好注解类后创建一个正常类,来进行数据处理(类中有JoinPoint和注解类authorityControl的使用)
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import java.lang.reflect.Modifier;
/**
* ClassName AuthorityControlRealize
* Description
* Create by h
* Date 2021/10/23 11:18
*
* @author h
*/
@Aspect
@Component
public class AuthorityControlRealize {
@Before("@annotation(authorityControl)")
public void ceshi(final JoinPoint joinPoint,AuthorityControl authorityControl){
System.out.println("目标方法名为:" + joinPoint.getSignature().getName());
System.out.println("目标方法所属类的简单类名:" + joinPoint.getSignature().getDeclaringType().getSimpleName());
System.out.println("目标方法所属类的类名:" + joinPoint.getSignature().getDeclaringTypeName());
System.out.println("目标方法声明类型:" + Modifier.toString(joinPoint.getSignature().getModifiers()));
//获取传入目标方法的参数
Object[] args = joinPoint.getArgs();
for (int i = 0; i < args.length; i++) {
System.out.println("第" + (i+1) + "个参数为:" + args[i]);
}
System.out.println("被代理的对象:" + joinPoint.getTarget());
System.out.println("代理对象自己:" + joinPoint.getThis());
// TODO: 2021/10/23 编写 权限控制逻辑
try {
System.out.println("可以通过注解来进行赋值操作,现在是选择默认的选项"+authorityControl.policeStationName());
System.out.println("----------------------------------------------");
} catch (Exception e) {
e.printStackTrace();
}
}
}
对注解的测试
@ApiOperation(value="测试")
@AuthorityControl
@PostMapping("/ceshi")
public ApiResponse<String> ceshi(@RequestBody GetUserInfoByAccountRequest getUserInfoByAccountRequest){
return ApiResponse.instanceSuccessApiResponse("ok");
}
测试结果
目标方法名为:ceshi
目标方法所属类的简单类名:UserInfoController
目标方法所属类的类名:com.*.*.*.controller.api.UserInfoController
目标方法声明类型:public
第1个参数为:GetUserInfoByAccountRequest(platformAccount=我是传来的参数)
被代理的对象:com.*.*.*.controller.api.UserInfoController@5b4ce00
代理对象自己:com.*.*.*.controller.api.UserInfoController@5b4ce00
可以通过注解来进行赋值操作,现在是选择默认的选项1
----------------------------------------------