美文网首页
Java Annotation+AspectJ是绝配啊

Java Annotation+AspectJ是绝配啊

作者: 阿呆少爷 | 来源:发表于2017-08-31 23:21 被阅读1583次

最近开始学着做Java服务器端开发,对注解一知半解的。今天刚好发现有一个业务场景可以通过自己实现注解简化代码,所以尝试着做起来。我发现Annotation+AspectJ是一个非常强大的组合,可以做很多事情。

下面这个checkRamPermission方法是用来做权限检查的。基本上各个入口方法都需要在最开始的地方加上这行代码。看起来很繁琐,也不够酷。所以琢磨用注解的方法来实现。

openApiUtil.checkRamPermission(request, request.getAction(), ResouceType.PRODUCT, String.valueOf(request.getProductId()), true);

checkRamPermission方法的参数分为好几种。分别如下所示。

  1. 请求者传入的参数,如request。
  2. 不同语境下的固定参数。如ResouceType.PRODUCT。
  3. 不同语境下从request各子类里面提取的属性。如request.getProductId()。

针对上面这些参数定义好注解。请求者传入的参数可以通过反射获取。注解里面只需包含语境相关的信息就行。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RAMAnnotation {

    public String resourceType();
    public String resourceId() default "";
}

接着定义好AspectJ的pointcut。

@Aspect
public class RAMPointCut {

    @Pointcut("@annotation(com.alibaba.cloudmobile.mhub.util.RAMAnnotation)")
    public void checkPemission() {}
}

接着就是实现拦截的方法。通过joinPoint获取到方法的信息,包括参数值,这样就可以获取到request对象。因为request子类众多,需要resourceId辅助,以获取具体子类方法,进一步得到resourceId。

@Before(value = "com.alibaba.cloudmobile.mhub.util.RAMPointCut.checkPemission()")
public void ramCheckPemission(JoinPoint joinPoint) {

    try {

        MethodSignature methodSig = (MethodSignature) joinPoint.getSignature();
        Annotation[] annotations = methodSig.getMethod().getDeclaredAnnotations();
        RAMAnnotation annotation = (RAMAnnotation) annotations[0];

        Object[] methodArgs = joinPoint.getArgs();

        BasePopRequest request = (BasePopRequest) methodArgs[0];
        String action = request.getAction();

        String resourceId = null;
        Method method = null;

        if (annotation.resourceId().equals("productId")) {

            method = request.getClass().getDeclaredMethod("getProductId");
        } else if (annotation.resourceId().equals("appId")) {

            method = request.getClass().getDeclaredMethod("getAppId");
        }

        if (method != null) {
            resourceId = String.valueOf(method.invoke(request));
        }

        openApiUtil.checkRamPermission(request, action, annotation.resourceType(), resourceId, true);

    } catch (Throwable e) {

        logger.error("RAMAnnotation" + e.getMessage());
        throw e;
    }
}

使用方式如下。resourceType和resourceId使用枚举类型会很合理一些。注解的属性只支持Java的内置类型,不支持用户自定义的类型。

@RAMAnnotation(resourceType = "product", resourceId = "productId")
public QueryProductInfoResponse queryProductInfo(QueryProductInfoRequest request) throws Throwable
{
}

参考资料。

  1. 十分钟全面理解Spring AOP
  2. 基于 Annotation 拦截的 Spring AOP 权限验证方法

相关文章

  • Java Annotation+AspectJ是绝配啊

    最近开始学着做Java服务器端开发,对注解一知半解的。今天刚好发现有一个业务场景可以通过自己实现注解简化代码,所以...

  • 绝配啊

    你是疯儿我是傻 你是脑残我是渣 夏吃火锅冬吃瓜 早上看书晚搓麻 一起手游经验刷 同输桌游狼人杀 你吃亏了我爆发 我...

  • 观视频有感

    冬日雪地里最美的戏魂! 个个摆拍妖娆的姿态,比肩相蹭的娇俏佳人,配个摇橹的把式,摇啊摇,撸啊撸,绝配绝配! 土家儿...

  • 天仙绝配

    想看完整作品请点击下面章节: 目录 天仙绝配(一) 天仙绝配(二) 天仙绝配(三) 天仙绝配(四) 天仙绝配(五)...

  • 我们是绝配

    时间又 又多一点 你爱我 多一点 我爱这个大王 她好可爱 和小朋友一样"发言结束" 不过比小娃娃更可爱"可能一时兴...

  • 紫米and 酸奶

    估计是绝配

  • Java 啊 Java 啊

    Java 游戏感觉 一天一天满满的挫败感未必是坏事可能是我想的太好自己做的跟不上来吧自己心里总是想着要有什么效果什...

  • 相亲R26:成年人,做应该做的事!

    女人的直觉很准,我觉得我们俩很合得来,虽从未找过算命先生八一卦,但从黄历看属相,我们俩也是最佳绝配。龙配鸡,绝配啊...

  • 2018-12-27

    蛋糕和鲜花是绝配!

  • 郭靖黄蓉是绝配

    这两个人的名字可以说是家喻户晓,一个傻啦吧唧,一个古怪精灵;绝不是人们口中的郎才女貌、天作之合;更不是阆苑仙葩、什...

网友评论

      本文标题:Java Annotation+AspectJ是绝配啊

      本文链接:https://www.haomeiwen.com/subject/lwzcjxtx.html