本文向您展示了如何解释JavaSpringAOP。内容简洁易懂,一定会让你眼前一亮。希望通过这篇文章的详细介绍,你能有所收获。
一、对AOP的初印象
首先给出一个相对专业的名词(来自百度):
在软件行业中,AOP是Aspect Oriented Programming的缩写,意思是:面向方面编程,通过预编译和运行时动态代理实现程序功能统一维护的技术。AOP是OOP的延续,是软件开发的热点,是Spring框架的重要内容,也是函数式编程的衍生范式。AOP可以用来隔离业务逻辑的各个部分,从而减少业务逻辑各部分之间的耦合,提高程序的可重用性,提高开发效率。
然后让我们举一个简单易懂的例子:
要理解方面编程,首先需要了解什么是方面。用刀把西瓜分成两片,切好的就是切面;翻炒,锅和灶一起工作完成翻炒,锅和灶是切面。在web的分层设计中,web层、网关层、服务层和数据层之间也有一段。在编程中,对象、方法和模块之间有一些部分。
一般我们在做活动的时候,通常会检查每个接口的有效性(是开始还是结束等)。)以及界面是否需要用户登录。
按照正常逻辑,我们可以做到这一点。
有一个问题,就是代码复制需要的次数和接口一样多。对于一个“懒人”来说,这是无法忍受的。好,提出一个公共方法,每个接口都会调用这个接口。这里有点切了。
还有一个问题。虽然我不用每次都复制代码,但是每个接口都要调用这个方法。于是就有了切面的概念,我把方法注入到接口调用的某个地方(切点)。
这样,接口只需要关注具体的业务,不需要关注接口不关注的其他逻辑或处理。
在红框处,是面向切线的编程。
00-1010,看完上面的例子,我觉得大家心中都有一个AOP的大致原型,但是上面提到的section等术语有些歧义。接下来我们来讲解一下AOP中的相关概念,理解AOP中的概念,才能真正掌握AOP的本质。
这里有一个更专业的概念定义:
方面:方面声明类似于Java中的类声明,方面将包含一些切入点和相应的建议。
Joinpoint:指程序中明确定义的点,一般包括方法调用、类成员的访问、异常处理块的执行等。它也可以自己嵌套其他连接点。
切入点:它表示一组连接点,或者通过逻辑关系组合,或者通过一般搭配、正则表达式等集中。它定义了相应的建议将在哪里发生。
建议(增强):建议定义了切入点中定义的程序点要执行的特定操作。它使用之前、之后和周围来区分是之前、之后还是代替每个关节点的执行代码。
目标:编织成建议的目标对象。
编织:将Aspect与其他对象连接并创建Adviced对象的过程。
然后举一个简单易懂的例子:
看完以上的理论知识,相信很多朋友还是觉得AOP的概念还是比较模糊的,对AOP中的各种概念的理解也不是很透彻。其实这很正常,因为AOP里面的概念太多了,我费了很大的劲才整理出来。
让我用一个简单的例子来比较AOP中方面、连接点、切入点和建议之间的关系。
blockquote>
让我们来假设一下, 从前有一个叫爪哇的小县城, 在一个月黑风高的晚上, 这个县城中发生了命案. 作案的凶手十分狡猾, 现场没有留下什么有价值的线索. 不过万幸的是, 刚从隔壁回来的老王恰好在这时候无意中发现了凶手行凶的过程, 但是由于天色已晚, 加上凶手蒙着面, 老王并没有看清凶手的面目, 只知道凶手是个男性, 身高约七尺五寸. 爪哇县的县令根据老王的描述, 对守门的士兵下命令说: 凡是发现有身高七尺五寸的男性, 都要抓过来审问. 士兵当然不敢违背县令的命令, 只好把进出城的所有符合条件的人都抓了起来.
来让我们看一下上面的一个小故事和 AOP 到底有什么对应关系.
首先我们知道, 在 Spring AOP 中 Joint point 指代的是所有方法的执行点, 而 point cut 是一个描述信息, 它修饰的是 Joint point, 通过 point cut, 我们就可以确定哪些 Joint point 可以被织入 Advice. 对应到我们在上面举的例子, 我们可以做一个简单的类比, Joint point 就相当于 爪哇的小县城里的百姓,pointcut 就相当于 老王所做的指控, 即凶手是个男性, 身高约七尺五寸, 而 Advice 则是施加在符合老王所描述的嫌疑人的动作: 抓过来审问.
为什么可以这样类比呢?
-
Joint point
: 爪哇的小县城里的百姓: 因为根据定义, Joint point 是所有可能被织入 Advice 的候选的点, 在 Spring AOP中, 则可以认为所有方法执行点都是 Joint point. 而在我们上面的例子中, 命案发生在小县城中, 按理说在此县城中的所有人都有可能是嫌疑人. -
Pointcut
:男性, 身高约七尺五寸: 我们知道, 所有的方法(joint point) 都可以织入 Advice, 但是我们并不希望在所有方法上都织入 Advice, 而 Pointcut 的作用就是提供一组规则来匹配joinpoint, 给满足规则的 joinpoint 添加 Advice. 同理, 对于县令来说, 他再昏庸, 也知道不能把县城中的所有百姓都抓起来审问, 而是根据凶手是个男性, 身高约七尺五寸, 把符合条件的人抓起来. 在这里 凶手是个男性, 身高约七尺五寸 就是一个修饰谓语, 它限定了凶手的范围, 满足此修饰规则的百姓都是嫌疑人, 都需要抓起来审问. -
Advice
:抓过来审问, Advice 是一个动作, 即一段 Java 代码, 这段 Java 代码是作用于 point cut 所限定的那些 Joint point 上的. 同理, 对比到我们的例子中, 抓过来审问 这个动作就是对作用于那些满足 男性, 身高约七尺五寸 的爪哇的小县城里的百姓. -
Aspect
::Aspect 是 point cut 与 Advice 的组合, 因此在这里我们就可以类比: “根据老王的线索, 凡是发现有身高七尺五寸的男性, 都要抓过来审问” 这一整个动作可以被认为是一个 Aspect.
最后是一个描述这些概念之间关系的图:
三、其他的一些内容
AOP中的Joinpoint可以有多种类型:构造方法调用,字段的设置和获取,方法的调用,方法的执行,异常的处理执行,类的初始化。也就是说在AOP的概念中我们可以在上面的这些Joinpoint上织入我们自定义的Advice,但是在Spring中却没有实现上面所有的joinpoint,确切的说,Spring只支持方法执行类型的Joinpoint。
Advice 的类型
-
before advice
, 在 join point 前被执行的 advice. 虽然 before advice 是在 join point 前被执行, 但是它并不能够阻止 join point 的执行, 除非发生了异常(即我们在 before advice 代码中, 不能人为地决定是否继续执行 join point 中的代码) -
after return advice
, 在一个 join point 正常返回后执行的 advice -
after throwing advice
, 当一个 join point 抛出异常后执行的 advice -
after(final) advice
, 无论一个 join point 是正常退出还是发生了异常, 都会被执行的 advice. -
around advice
, 在 join point 前和 joint point 退出后都执行的 advice. 这个是最常用的 advice. -
introduction
,introduction可以为原有的对象增加新的属性和方法。
在Spring中,通过动态代理和动态字节码技术实现了AOP。
上述内容就是怎样解读Java Spring AOP,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/133160.html