spring的AOP面向切面编程使用大全

我到现在还记得两年前面试的时候死记硬背的spring知识的几句话。
spring之所以强大不是代码上的强大,而是思维上的创新,spring的AOP与IOC是两大重点。
今天正好在项目里看到了关于切面编程的部分,然后我也顺便回顾了一下spring的aop,并且查阅一些资料加以整理,也就是这篇文章。
首先说一下简单的aop理解:面向切面编程,其实我觉得如果想象力够丰富应该很容易理解这个,将整个程序(由一个个接口,方法组成的)想成一个线性水管,我们所谓的aop切面就相当于一个修理工,应该做到的是想在水管哪出安一个过滤器就可以在其中切断原本的连接将过滤器加入其中。(这是我个人的理解,我记得当时看视频的时候讲师也是这么理解aop的,不过时间太久了记不太清了,自己的话说的,如果有不足欢迎指出),如果对于AOP的概念还是不太懂,我之前看了一篇文章感觉说的很详细,这里推荐给大家:AOP介绍

继续落入实处,开始说说这个aop在spring中到底要怎么样使用。

先说一下在spring中aop的核心概念:

  1. 横切关注点
    对哪些方法进行拦截,拦截后怎么处理,这些关注点都称之为横切关注点。(通俗点说在哪切)
  2. 切面(aspect)
    类是对物体特征的抽象,切面就是对横切关注点的抽象。(通俗点说切哪。这个和关注点是不同的,打个比方,你家要装个空调,空调装在主卧床对面的墙上。可以说你家是关注点,主卧床对面的墙是切面)
  3. 连接点(joinpoint)
    被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
  4. 切入点(pointcut)
    对连接点进行拦截的定义
  5. 通知(advice)
    所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类(怎么切)
  6. 目标对象
    代理的目标对象

spring中的使用

首先第一步肯定是引包,因为我是spring boot,所以依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

这里要说明一下,一般我们在日志处理中用到aop,所以引用aop大多数也引用log的那个依赖,不过这个不是必须关系,真正的aop依赖就这一个。
第二部就是在项目中使用了。

  • 首先定义一个切面类,加上@Component @Aspect这两个注解
  • 定义切点
    先说一下切点表达式:
@Pointcut("execution(public * io.renren.common.annotation.*.*(..))")
public void pointCut(){}

上面demo中,
public代表是公共方法,可以不写则是所有的方法,但是不能用表示。
第一个
表示返回类型不限。
第二个表示所有类。
第三个
表示所有方法。
..两个点表示方法里的参数不限。
然后用@Pointcut切点注解在一个空方法上面,一会儿在Advice通知中,直接调用这个空方法就行了,也可以把切点表达式写在Advice通知中的,单独定义出来主要是为了好管理。
注意切点表达式不非要是上述格式的,还有几种,这里一一介绍:

  1. execution(方法修饰符 返回类型 方法全限定名(参数)) 主要用来匹配整个方法签名和返回值的
  2. within(类路径)
    用来限定类,同样可以使用匹配符,下面用来表示com.xhx.springboot包及其子包下的所有类方法
    "within(com.xhx.springboot..*)"
  3. thistarget
    this与target在用法上有些重合,理解上有对比性。
    this表示当前切入点表达式所指代的方法的对象的实例,即代理对象是否满足this类型
    target表示当前切入点表达式所指代的方法的目标对象的实例 即是否是为target类做的代理
    如果当前对象生成的代理对象符合this指定的类型,则进行切面,target是匹配业务对象为指定类型的类,则进行切面。
  4. args(paramType)
    args无论其类路径或者是方法名是什么,表达式的作用是匹配指定参数类型和指定参数数量的方法,类型用全路径
    args(java.lang.String,..,java.lang.Integer)
  5. @within(annotationType)
    匹配带有指定注解的类,within为配置指定类型的类实例。下面匹配含有 @Component注解的类
    "@within(org.springframework.stereotype.Component)"
  6. @annotation(annotationType)
    匹配带有指定注解的方法
  7. @args(annotationType)
    @args表示使用指定注解标注的类作为某个方法的参数时该方法将会被匹配
  • Advice声明通知
    我们在想放入切点的地方放入切点了,但是想要如何切呢?比如刚刚说的安装过滤器,要过滤什么类型的肯定是要设置好的。
    spring 的AOP中通知类型有五种,其实感觉无论从名字还是从用途都比较简单。这里简单的介绍一下:
  1. @Before: 标识一个前置增强方法,相当于BeforeAdvice的功能

  2. @After: final增强,不管是抛出异常或者正常退出都会执行。

  3. @AfterReturning: 后置增强,似于AfterReturningAdvice, 方法正常退出时执行

  4. @AfterThrowing: 异常抛出增强,相当于ThrowsAdvice

  5. @Around: 环绕增强,相当于MethodInterceptor

然后我们怎么切的话要根据业务场景,应该还蛮好判断的。这么多通知类型优先级,执行顺序也是不同的,所以这里有两张简图:


正常执行

异常执行

其实自己看就能知道,两者的区别只在于最后是走@AfterReturning还是走@AfterThrowing。

大概内容就这么多,然后参考了下面的一个帖子# spring 注解 之 AOP基于@Aspect的AOP配置

然后本篇总结也到此为止,如果有什么忽略的知识点欢迎指出,因为我也没有专门的备案教程,都是想到哪里写哪里了。中间引用了两篇文章,都是我觉得写的不错的。我一直很感谢把自己经验分享出来的人,共同构成了面向百度学习的环境。
全文手打不易,如果稍微帮到你了,请点个喜欢点个关注支持一下~~~~~也祝大家工作顺顺利利

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355

推荐阅读更多精彩内容