SpringBoot - AOP
概述
Spring 特色 ---- 切面,主要用来实现统一权限、操作日志等应用场景。
下面来实现一个简单的权限验证的场景。
组件
<!-- AOP,方法切面,自定义注解 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
配置
先来自定义一个注解,以后需要权限就配置注解。
@Documented
@Target(ElementType.METHOD) // 在方法层上生效
@Retention(RetentionPolicy.RUNTIME) // 运行时
public @interface Permission {
String value(); //注解参数
}
再实现一个切面,
@Aspect
@Order(1) // 控制多个Aspect的执行顺序,越小越先执行, 当然也可以不写这注解, 对于写和不写@order的两个切面, 有@order的优先于无@order的执行;
// 都有@order时, 越小越执先执行
@Component
@Slf4j
public class PermissionAOP {
// Permission 为上面的注解
// @Before表示切入方法前,常用的还有@After方法执行后,@Around 环绕方法,执行方法前后都切入。 这里判断权限,只用切入方法前。
@Before("@annotation(p)")
public void beforePermission(JoinPoint point, Permission p) {
log.info("beforePermission:" + p.value()); //获取注解的值
//检查权限
...
throw new RainException(ResultCode.E_NO_RIGHT); //抛出没有权限的异常
}
}
使用
还是以之间的测试方法,加个注解:
@Permission(value = ADD)
@GetMapping("/test")
public Result Hello() throws Exception {
log.warn("warn");
log.info("info");
log.debug("debug");
log.error("error");
// int x = 1 / 0;
// throw new RainException(-1);
User user = new User();
user.setName("xxx");
user.setPhone("xxxx");
user.setId(100l);
user.setLoginname("xxx");
user.setPwd("xxx");
user.setMail("xxxxx");
user.setPhoto("");
user.setIp("xxxxxxxx");
user.setVersion(1l);
user.setUpdatetime(new Date());
// userMapper.insert(user);
// userMapper.updateById(user);
// userService.saveOrUpdate(user);
user = userService.getById(101);
log.info(JsonUtils.obj2json(user));
RedisUtils.set("user", user, 1000);
user.setName("6666666");
userService.updateById(user);
// userService.save(user);
log.info("======> 1、" + JsonUtils.obj2json(user));
user = (User) RedisUtils.get("user");
log.info("======> 2、" + JsonUtils.obj2json(user));
user = userService.getById(101);
return Result.success(user);
// return Result.success("Hello World !");
}
运行
F5
进入权限切面,打印注解参数
正常。