spring的aop确实好用,能够在不影响业务功能的情况下,实现一些低耦合的功能。

而aop又有两种常用的实现方式,一种是用aspectj表达式去匹配,实现全局的配置,表达式还可以使用与或非符号去连接,从而达到一个aop应用于多个切面多个切点。

但是这样的用法不够灵活,不够插件化,最好的方式就是开箱即用,随用随加。基于这样的需求,aop基于注解的实现方式,才是最灵活的。

基本步骤
构建自定义注解
构建注解aop的编织类(aspectj)
在配置文件中声明编织类(应用于controller的注解一定要在springmvc的配置文件声明,其他类型的编织类可在spring的配置文件里声明)
在对应的controller上应用注解,让aop抓取到该切点

tips:
1自定义注解的范围是可选的,一般用于方法级别
2在环绕通知上,返回json类型,可加上@ResponseBody,返回json,符合RestFul

具体的代码暂时没必要贴,官方文档写的很清晰。

英文一般的可以看翻译文档

https://www.gitbook.com/book/linesh/spring-mvc-documentation-linesh-translation/details

tips:

1此处配置的时候,如果是使用了spring+springMVC的模式下,需要注意spring和springMVC父子容器的问题,如果我们的@Token是标注于Controller(被@Controller或者@RestController注解标记)层的话,由于controller层是由springMVC容器来管理的,若此时我们的TokenAspect是由Spring来管理的话,由于在方法调用的时候,spring无法获取子容器的管理对象,aop就不起作用,自然@Token注解也就失效了。 所以这儿我们的aop也需要配置再springMVC的配置文件中,由SpringMVC来管理。


代码备份:

自定义注解

 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;

 /**
  * Target指定注解的目标为方法级
  * Retention指定注解可以在运行时被获取(利用反射)
  * Created by huxingyue on 2017/8/22.
  */
 @Target(ElementType.METHOD)
 @Retention(RetentionPolicy.RUNTIME)
 public @interface TokenAnnotation {
 }

aop

 import com.sftc.tools.api.APIUtil;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.*;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;

 import javax.servlet.http.HttpServletRequest;
 import java.util.Arrays;

 import static com.sftc.tools.common.ControllerHelper.responseEntityBuilder;
 import static com.sftc.tools.common.RequestHeaderUtils.getUserBySystemAccessToken;

 /**
  * 通过AOP来验证token
  * Created by huxingyue on 2017/8/21.
  */
 @Component
 @Aspect
 @Order(10) //构建执行顺序
 public class TokenAOPHelper {
     @Before("@annotation(com.sftc.tools.common.TokenAnnotation)")
     public void beforeCheck() throws Throwable {

         System.out.println("-   -前置");
     }

     @Around(value = "@annotation(com.sftc.tools.common.TokenAnnotation)")
     @ResponseBody
     public Object aroundCheck(ProceedingJoinPoint pjp) throws Throwable {
         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
         String system_access_token = request.getHeader("system_access_token");
         if (system_access_token == null) return APIUtil.paramErrorResponse("system_access_token missing");
         //判断system_access_token是否有效
         boolean flag = (getUserBySystemAccessToken(system_access_token) == null);
         if (flag) {
             return responseEntityBuilder(APIUtil.unauthorizedResponse("Unauthorized"));
         } else {//如果有效 则继续执行
             System.out.println("方法参数列表:");
             toString1(pjp.getArgs());
             return pjp.proceed();
         }
     }

     private void toString1(Object[] args) {
         for (Object o : args) {
             System.out.println(o.toString());
         }
     }
 }

<!-- 启动Aspectj注解模式驱动AOP --> <aop:aspectj-autoproxy proxy-target-class="true"/>

关于aop的两种方式-基于注解和基于aspectj的更多相关文章

  1. springmvc配置AOP的两种方式

    spingmvc配置AOP有两种方式,一种是利用注解的方式配置,另一种是XML配置实现. 应用注解的方式配置: 先在maven中引入AOP用到的依赖 <dependency> <gr ...

  2. 使用aspectJ实现Spring AOP的两种方式

    方式一:基于aspectJ的XML配置 方式二:基于aspectJ的注解方式 基于aspectJ的XML配置 1)       引入相关jar包 2)       创建Spring核心配置文件,必须导 ...

  3. 在Spring整合aspectj实现aop的两种方式

    -----------------------------基于XML配置方案目标对象接口1 public interface IUserService { public void add(); pub ...

  4. k8s 创建资源的两种方式 - 每天5分钟玩转 Docker 容器技术(124)

    命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1. 用 kubectl 命令直接创建,比如: kubectl run nginx-deployment --image=nginx ...

  5. k8s 创建资源的两种方式【转】

    命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1. 用 kubectl 命令直接创建,比如: kubectl run nginx-deployment --image=nginx ...

  6. k8s创建资源的两种方式(5)

    一.创建方式分类: 命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1.用 kubectl 命令直接创建,比如: kubectl run httpd-app --image=reg ...

  7. kubernetes创建资源的两种方式

    一.创建方式分类: 命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1.用 kubectl 命令行的方式直接创建,比如: kubectl run httpd-app --image ...

  8. 第5篇K8S创建资源的两种方式

      一.创建方式分类: 命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1.用 kubectl 命令直接创建,比如: kubectl run httpd-app --image=r ...

  9. k8s创建资源的两种方式及DaemonSet应用(5)

    一.创建方式分类 Kubernetes 支持两种方式创建资源: (1)用 kubectl 命令直接创建,比如: kubectl run httpd-app --image=reg.yunwei.com ...

随机推荐

  1. spring+springmvc+mybaties整合实例

    spring+springmvc+mybaties即SSM框架整合在ecpliseee中开发:很么多西都是只有只有自己上手做,才会懂.昨晚熬了很久,才弄出来.也希望对新手有帮助!下面整理一下思路:关键 ...

  2. mongodb3 ubuntu离线安装(非apt-get)及用户管理

    目前mongodb已经出到3.x,相对于2.x改动较大,本着学新不学旧的原则来捣鼓nosql数据库.最初想着apt-get安装但是软件源上都是2.x的,遂下载好后传到服务器安装. 1.下载 不得不说国 ...

  3. python函数(2):函数进阶

    昨天说了函数的一些最基本的定义,今天我们继续研究函数.今天主要研究的是函数的命名空间.作用域.函数名的本质.闭包等等 预习: 1.写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的 ...

  4. Objective-C 使用核心动画CAAnimation实现动画

    先来看看效果吧 整个核心动画就不多做介绍了,随便一搜就能有很多很详细的解释,主要使用以下四种 CABasicAnimation //经典动画 CAKeyframeAnimation //关键帧动画 C ...

  5. 【JAVASCRIPT】React学习-如何构建一个组件

    摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 组件化思想 组件就是 UI + UI 交互逻辑,组件有三个常规map , 分别为state 状态 . props 数据 ...

  6. Spring阅读方法

    转自:http://www.cnblogs.com/xing901022/p/4178963.html 最近没什么实质性的工作,正好有点时间,就想学学别人的代码.也看过一点源码,算是有了点阅读的经验, ...

  7. 基于FPGA的VGA显示静态图片

    终于熬到暑假了,记过三四周的突击带考试,终于为我的大二画上了一个完整的句号,接下来终于可以静心去做自己想做的事情了,前一阵子报了一个线上培训班,学学Sobel边缘检测,之前一直在学习图像处理,但是因为 ...

  8. 两百条微信小程序跳坑指南(不定时更新)

    微信小程序联盟出品 跳坑textarea<二百二十三>不显示文本及textarea相关问题集合跳坑<二百一十三> background-image无法获取本地资源图片....跳 ...

  9. ServletAPI的获取

    Action中获取ServletAPI,三种方式 (1)通过ActionContext获取(只是获取并操作了域空间,并不是真正的ServletAPI对象) 在struts2框架中,通过Action的执 ...

  10. 用gensim学习word2vec

    在word2vec原理篇中,我们对word2vec的两种模型CBOW和Skip-Gram,以及两种解法Hierarchical Softmax和Negative Sampling做了总结.这里我们就从 ...