使用过Spring AOP的注解方式实现,也入过不少坑,现在做一下记录,希望有同样需求的朋友可以少走弯路

使用之前还是先过一下官方文档吧,至少可以少走弯路,不用担心英文读不懂,其实只看代码例子就能理解很多问题!

1. SpringBoot如何获得Aspect支持?

看这里:Spring Boot 开启AOP的方法

2. 我按照上面的方法开启了AOP支持,为什么始终是不走切入点方法呢?

首先仔细检查一下,Aspect类是不是少了@Component注解(这一点很重要!),只有一个@Aspect注解是不行的。如果还是不行,请继续往下看。

3. 拦截指定注解的规则怎么写?如拦截所有带了RequestMapping的方法

首先声明一个写入点来匹配所有要拦截的方法名
假如拦截所有方法

@Pointcut("execution(public * *(..))")
private void aspectMethod(){}

然后配置通知方法

@Before(value = "aspectMethod() && @annotation(org.springframework.web.bind.annotation.RequestMapping)")
public String doSomething() {
}

4. 拦截指定参数名的规则该怎么写?如拦截所有方法参数中有int page的方法

参数拦截可以用args或@args,但是匹配的时候跟顺序和数量有关!

  • 如果只有page一个参数

    @Before(value = "aspectMethod()  &&  args(page)")
    public String doSomething(int page) {
    }
  • 如果page为第一个参数
    @Before(value = "aspectMethod()  &&  args(page, ..)")
    public String doSomething(int page) {
    }
  • 如果page为第二个参数
    @Before(value = "aspectMethod()  &&  args(*, page, ..)")
    public String doSomething(int page) {
    }

    说明:

    1. 参数的配置可以用占位符*和..。
      *的意思是任意类型任意名称的一个参数
      ..的意思是任意类型,任意多个参数,并且只能放到args的后面。
    2. 通知方法的参数需要跟args中的固定参数page一致!
    3. 如果要获取拦截方法的所有参数,可以用JoinPoint或ProceedingJoinPoint,两者的区别:
      JoinPoint是父类,提供获取拦截方法的信息的功能,如所有参数:jp.getArgs()
      ProceedingJoinPoint是子类,只能用在@Around中,除了提供JoinPoint的所有功能外,还能提供方法的运行pjp.proceed()和pjp.proceed(args)功能。

那下面问题来了?我想匹配page参数,但是page参数的位置不定怎么办?
spring aop并不存在一个或多个的匹配,所以如果可能,尽量将配置作为第一个参数,这样写起来方便,如果真的需要匹配不确定的位置,那就多写几个匹配规则吧!

  • 第一个参数: args(page, ..)
  • 第二个参数: args(*, page, ..)
  • 第三个参数: args(*, *, page, ..)
  • 以此类推

如果这样还没有满足所有需求,那么只能问问自己,编码的时候知道不知道什么叫约定大于配置了。

5. 如果即有拦截参数,又需要注入JoinPoint或ProceedingJoinPoint怎么办?

将JoinPoint或ProceedingJoinPoint作为第一个参数,剩下的自定义的参数放到后面,如:

@Before(value = "aspectMethod()  &&  args(page)")
public String doSomething(JoinPoint jp, int page) {
}

6. 有没有配置拦截规则示例?

有的,请查看原文:aop pointcuts examples。

这里注意,*用在返回值和方法参数上并不是一个或多个,而是指任意一个,如用在返回值上,表示任意类型的返回值;用在方法的参数上,指任意类型的一个参数。官方也给出了解释,在这里可能会有很多坑,大家可以注意一下!

文/Devid(简书作者)
原文链接:http://www.jianshu.com/p/def4c497571c
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

转:Spring AOP 注解方式实现的一些“坑”的更多相关文章

  1. spring aop注解方式与xml方式配置

    注解方式 applicationContext.xml 加入下面配置 <!--Spring Aop 启用自动代理注解 --> <aop:aspectj-autoproxy proxy ...

  2. Spring Aop 注解方式参数传递

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  3. (转)使用Spring的注解方式实现AOP的细节

    http://blog.csdn.net/yerenyuan_pku/article/details/52879669 前面我们已经入门使用Spring的注解方式实现AOP了,现在我们再来学习使用Sp ...

  4. (转)使用Spring的注解方式实现AOP入门

    http://blog.csdn.net/yerenyuan_pku/article/details/52865330 首先在Eclipse中新建一个普通的Java Project,名称为spring ...

  5. Spring系列之aAOP AOP是什么?+xml方式实现aop+注解方式实现aop

    Spring系列之aop aop是什么?+xml方式实现aop+注解方式实现aop 什么是AOP? AOP为Aspect Oriented Programming 的缩写,意识为面向切面的编程,是通过 ...

  6. 来一手 AOP 注解方式进行日志记录

    系统日志对于定位/排查问题的重要性不言而喻,相信许多开发和运维都深有体会. 通过日志追踪代码运行状况,模拟系统执行情况,并迅速定位代码/部署环境问题. 系统日志同样也是数据统计/建模的重要依据,通过分 ...

  7. Spring AOP配置方式

    AOP 面向切面编程,允许在 java 应用中的方法调用的前后做一些处理. 本文通过实例介绍两种主要的Spring AOP 配置方式:xml 方式配置,注解方式配置 XML 方式配置 1. 项目包类结 ...

  8. Spring AOP注解为什么失效?90%Java程序员不知道

    使用Spring Aop注解的时候,如@Transactional, @Cacheable等注解一般需要在类方法第一个入口的地方加,不然不会生效. 如下面几种场景 1.Controller直接调用Se ...

  9. Spring AOP注解形式简单实现

    实现步骤: 1:导入类扫描的注解解析器 命名空间:xmlns:context="http://www.springframework.org/schema/context" xsi ...

随机推荐

  1. Altium Designer -- 精心总结

    如需转载请注明出处:http://blog.csdn.NET/qq_29350001/article/details/52199356 以前是使用DXP2004来画图的,后来转行.想来已经有一年半的时 ...

  2. 安装和配置Sentry(收录)

    安装和配置Sentry 本文主要记录安装和配置Sentry的过程,关于Sentry的介绍,请参考 Apache Sentry架构介绍 . 1. 环境说明 系统环境: 操作系统:CentOs 6.6 H ...

  3. 2016.01.04接触spring一年开始读spring源码

    http://www.cnblogs.com/xing901022/p/4178963.html#_label0 遇到第一个问题The processing instruction target ma ...

  4. How to enable download EXE files from the Sharepoint website

          As we all know,many applications have forbidden to upload and download exe files.Because the e ...

  5. python正则-字符串处理,主要用于处理请求参数格式为application/x-www-form-urlencoded的表单数据

    #当提交的表单数据格式为application/x-www-form-urlencoded,直接从浏览器复制出来的格式是str_lin(chrome,也是最常见的)或者str_in2(火狐)这两种格式 ...

  6. 关于python的闭包与装饰器的实验

    首先看闭包,在嵌套函数内添加返回值,可以通过外部函数读取内部函数信息 #encoding=utf-8 #闭包应用 #先定义闭包函数,并使用 def outer(func): def inner(): ...

  7. 04-Mysql----初识sql语句

    本节课先对mysql的基本语法初体验. 操作文件夹(库) 增 create database db1 charset utf8; 查 # 查看当前创建的数据库 show create database ...

  8. ZooKeeper的伪分布式集群搭建

    ZooKeeper集群的一些基本概念 zookeeper集群搭建: zk集群,主从节点,心跳机制(选举模式) 配置数据文件 myid 1/2/3 对应 server.1/2/3 通过 zkCli.sh ...

  9. Gym101981I Magic Potion(最大流)

    Problem I. Magic Potion There are n heroes and m monsters living in an island. The monsters became v ...

  10. css字体图标的制作和使用。

    css字体图标的制作和使用. 在项目开发的过程中,我们会经常用到一些图标.但是我们在使用这些图标时,往往会遇到失真的情况,而且图片数量很多的话,页面加载就越慢.所以,我们可以使用字体图标的方式来显示图 ...