SpringBoot - AOP

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
进入权限切面,打印注解参数
正常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值