SpringBoot-注解与AOP的使用

自定义注解

import java.lang.annotation.*;

/**
 * ElementType.TYPE:表示该注解可以作用在类上
 * ElementType.METHOD:表示该注解可以作用在方法上
 * ElementType.PARAMETER:表示该注解可以作用在属性上
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface HasRole {
    String[] value();//自定义属性,注意加括号。
    String flag() default "or";//default设置默认值
    String msg() default "权限不足";
}

AOP

@Aspect//表面该类是一个切面
@EnableAspectJAutoProxy//开启切面管理
@Slf4j//日志打印
@Component//将该切面交给IOC管理
public class RoleAspect {

	//环绕通知,功能强大
	//ProceedingJoinPoint joinPoint自动拿到切入点的数据封装在该对象中
    @Around("execution(* com.entor.controller.*.*(..))")//设置切入点
    public Object round(ProceedingJoinPoint joinPoint) throws Throwable {
        String name = joinPoint.getSignature().getName();//获取方法名
        Object[] args = joinPoint.getArgs();//获取参数
        log.info("当前系统时间:" + new Date() + "开始执行的方法" + name + ",方法参数:" + Arrays.toString(args));
        long start = System.currentTimeMillis();
        Object proceed = joinPoint.proceed();//执行目标对象的方法
        long end = System.currentTimeMillis();
        log.info("结束执行方法:" + name + ",方法执行时间:" + (end - start) + "毫秒");
        log.info("方法的返回值:"+proceed);
        return proceed;
    }
	
	//前置通知,切入点为标了注解@hasRole的地方。
	//annotation表明切入点为注解,hasRole为注解名称
	//JoinPoint joinPoint自动拿到切入点的数据封装在该对象中
	//HasRole hasRole为使用了的注解
    @Before("@annotation(hasRole)")
    public void checkRole(JoinPoint joinPoint, HasRole hasRole) {
        Signature signature = joinPoint.getSignature();
        log.info("方法名称:" + signature.getName());
        log.info("连接点对象:" + signature);
        Object[] args = joinPoint.getArgs();
        log.info("方法参数:" + Arrays.deepToString(args));
        log.info("目标对象:" + joinPoint.getTarget());
        String flag = hasRole.flag();
        log.info("flag:" + flag);
        String msg = hasRole.msg();
        log.info("flag:" + msg);
        String[] value = hasRole.value();
        log.info(Arrays.toString(value));

        String role = "admin";

        if (flag == null || flag.equals("or")) {
            if (!Arrays.asList(value).contains(role)) {
                throw new RuntimeException(msg);
            }
        } else {
            if (!check(new String[]{role}, value)) {
                throw new RuntimeException(msg);
            }
        }
    }

    public boolean check(String[] ownRoles, String[] requireRoles) {
        if (ownRoles.length < requireRoles.length) {
            return false;
        }
        HashSet<String> ownRolesSet = new HashSet<>(Arrays.asList(ownRoles));
        HashSet<String> requireRolesSet = new HashSet<>(Arrays.asList(requireRoles));
        List<String> list = ownRolesSet.stream().filter(ownRole -> requireRolesSet.contains(ownRole)).collect(Collectors.toList());
        return list.size() == requireRolesSet.size();
    }
}

使用注解和AOP注入通知

public interface UserMapper {

    /**
     * 新增用户
     */
    @Insert("insert into user(age,password,sex,username)values(#{age},#{password},#{sex},#{username})")
    @HasRole(value = {"admin","user"},flag = "or")
    int save(User user);
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值