资讯专栏INFORMATION COLUMN

Advice?Pointcut?Aspect?JoinPoint?Advisor?

Mr_houzi / 3320人阅读

摘要:概念傻傻分不清是一种面向切面的编程思想,最小单位是切面是基于的编程思想,最小单位是类。联盟为的实现提出了多种方案,主要有基于拦截的直接修改字节码的。可忽略先来说说中,的几个主要概念切面切入点连接点建议增强开始晕了深吸一口气,慢慢往下看。

AOP概念?傻傻分不清?

AOP是一种面向切面的编程思想,最小单位是切面;Java是基于OOP的编程思想,最小单位是类。
虽然思想不同,但是AOP却能够给Java提供强大的加持,Spring AOP的应用就是最好的例子。
AOP思想是如此优秀,所以在一开始,就有人尝试建立组织来统一规范,这个组织就是AOP联盟。AOP联盟AOP的实现提出了多种方案,主要有:基于拦截的(Interceptor)、直接修改字节码的。(可忽略)
先来说说Spring中,AOP的几个主要概念:

切面、切入点、连接点、建议(增强)

开始晕了... 深吸一口气,慢慢往下看。
一般我们做事情,时间、地点、人物、做什么缺一不可,那么我们看看这些是如何对应的。
Spring AOP的设计是遵循AOP联盟的。AOP联盟中有两个主要概念:Advice、JoinPoint

Advice:增强,这个比较好理解,就是想要增加的功能,比如:上下包裹一个事务、日志打印等,我们把它对应为 "What"
JoinPoint:行话叫:程序"运行点"。什么意思呢?就是当代码运行到需要执行Advice时的那个地方的信息,注意是运行时状态,且结尾是"的信息"(是一个名词),我们把它对应为"Who"

Spring引入了这两个概念,并对Advice作了增强实现:

@Before、@After、@Around等等:行话分别是前置增强、后置增强、环绕增强,
主要负责控制"Advice"是在方法前还是方法后等哪个范围执行,我们把它对应为 "When+Advice=> When + What"

但是单单这两个还是不够的,Spring另外提供了概念:

Pointcut:行话叫切入点,实际上是`Spring`抽象出来的,用来`查找哪些`需要进行增强的接口,我们把它对应为"Where"

这些概念连起来,意思就是我要在哪里(Pointcut)什么时候(@Before)对谁(JoinPoint)做什么(Advice)
看起来好像理解了,但是有感觉还是有点混乱,好多概念,好乱,还是好乱...
这时候,Spring出手了,他也觉得有点乱,怎么办呢?
Advisor出现了,看看它的构造:

没错!SpringAdvicePointcut两个封装起来了,就叫Advisor。一个Advisor就能够确定什么时间地做什么,构造它需要:Advice + Pointcut
看看在XMl中一个Advisor的定义:


了解了这些还不够,剩下一个概念Aspect。实际上,Aspect是一个的概念,它代表了一系列的Advisor,也就是说,一个Aspect其实等于:

他他他要在哪里(Pointcut)什么时候(@Before)对谁(JoinPoint)做什么(Advice)
她她她要在哪里(Pointcut)什么时候(@Before)对谁(JoinPoint)做什么(Advice)
它它它要在哪里(Pointcut)什么时候(@Before)对谁(JoinPoint)做什么(Advice)

看看一个Aspect的定义


完毕!

隐隐约约还有什么东西漏下了?没错!就是Pointcut,前面说过,这个是运行时的对象,是对Who的抽象,代码:


Pointcut对象,在程序执行到要增强的地方时,被封装好传入进来,要不要使用取决于自己(除非是Around),他代表了当时的上下文信息,就是一个在现场者。

整片文章总结下来就是:

我要定义一个切面(Aspect),但是切面是虚的,只是定义用来代表一到多个Advisor,那我要先定义一个Advisor,Advisor是表示 要做什么+在哪里做,那就定义Advice->做什么,定义Pointcut->在哪里做,也就是说:
Aspect 
    => n * Advisor 
    => n * ( Advice + Pointcut) == n * (@Before/@After/@Around + Pointcut) 
完毕!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73737.html

相关文章

  • 从动态代理到SpringAop以及AspectJ风格

    摘要:具体的动态代理运行原理这里暂不展开,网上有很多相关的内容,比如这篇翻译过来就是面向方面切面编程。所以切面可以理解为和的集合。 1.静态代理 在提及动态代理前先说明一下静态代理模式,静态代理模式是一种很常见的通用设计模式,实现也很简单,uml类图如下: showImg(https://segmentfault.com/img/bVba3gn?w=737&h=312); 如上图所示,代理类...

    msup 评论0 收藏0
  • Spring AOP 源码分析系列文章导读

    摘要:在写完容器源码分析系列文章中的最后一篇后,没敢懈怠,趁热打铁,花了天时间阅读了方面的源码。从今天开始,我将对部分的源码分析系列文章进行更新。全称是,即面向切面的编程,是一种开发理念。在中,切面只是一个概念,并没有一个具体的接口或类与此对应。 1. 简介 前一段时间,我学习了 Spring IOC 容器方面的源码,并写了数篇文章对此进行讲解。在写完 Spring IOC 容器源码分析系列...

    张春雷 评论0 收藏0
  • 从源码入手,一文带你读懂Spring AOP面向切面编程

    摘要:,,面向切面编程。,切点,切面匹配连接点的点,一般与切点表达式相关,就是切面如何切点。例子中,注解就是切点表达式,匹配对应的连接点,通知,指在切面的某个特定的连接点上执行的动作。,织入,将作用在的过程。因为源码都是英文写的。 之前《零基础带你看Spring源码——IOC控制反转》详细讲了Spring容器的初始化和加载的原理,后面《你真的完全了解Java动态代理吗?看这篇就够了》介绍了下...

    wawor4827 评论0 收藏0
  • spring AOP(二) 相关类或接口

    摘要:注意前一节我们的代理是对对象进行了代理,而的可以基于方法进行代理,因为类的属性和方法都有相应的类来描述或者对应属性由的表示,方法由来表示这里说几个的接口或类切入点用来说明是对哪些类的哪些方法进行横切就是被代理的对象的一个集合说明对哪些类进行 注意: 前一节我们的代理是对对象进行了代理,而spring 的AOP 可以基于方法进行代理,因为类的属性和方法都有相应的类来描述或者对应 属性由j...

    baishancloud 评论0 收藏0
  • 彻底征服 Spring AOP 之 理论篇

    摘要:基本知识其实接触了这么久的我感觉给人难以理解的一个关键点是它的概念比较多而且坑爹的是这些概念经过了中文翻译后变得面目全非相同的一个术语在不同的翻译下含义总有着各种莫名其妙的差别鉴于此我在本章的开头着重为为大家介绍一个的各项术语的基本含义为了 基本知识 其实, 接触了这么久的 AOP, 我感觉, AOP 给人难以理解的一个关键点是它的概念比较多, 而且坑爹的是, 这些概念经过了中文翻译后...

    Kylin_Mountain 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<