请选择 进入手机版 | 继续访问电脑版

马悦凌健康养生网-马悦凌粉丝乐园-马悦凌博客专注-爱久养身园专注各种中医养生知识

搜索
热门搜索: 健康 瑜伽 养生
 找回密码
 立即注册
热图推荐
  • 悦享最“加”健康生活 - 对话加拿大驻沪总
  • 从XL增肥到XXXL,再减回XL是怎样的体验
  • 育儿贴士:知道宝宝一天睡多久,几个月能看
  • 心理| 4杯饮料选一杯!测你的真实性格是什
  • 一等人在保健,二等人玩锻炼,三等人进医院
  • 原来这样做小米粥,可以降低血糖生成指数!
  • 福建师范大学增肥攻略。
  • 有害健康的五种水
  • 女人健身,就是不会老
  • 健身不坚持,都没卵用!
查看: 1042|回复: 0

欲成仙txt 现代修真史txt 深度好文:《Spring设计思想》AOP设计基本原理 华原朋美种子 甲子湖吧

[复制链接]

33

主题

40

帖子

110

积分

等待验证会员

积分
110
发表于 2106-2-7 14:28 | 显示全部楼层 |阅读模式
点击上方关注,快速进阶高级架构师
作者:亦山
0、前言

Spring 供给了AOP(Aspect Oriented Programming) 的支持, 那末,什么是AOP呢?本文将经过一个别的一个角度来诠释AOP的概念,帮助你更好地了解和利用Spring AOP。
读完本文,你将领会到:
1. Java法式运转在JVM中的特征
2. Java法式的履行流【领会AOP、毗连点(Join Point)、切入点(point cut) 的概念 】
3. 引入了代理形式的Java法式履行流(AOP实现的机制)
4. Spring AOP的工作道理
1. Java法式运转在JVM中的特征

当我们在某个类Foo中写好了一个main()方式,然后履行java Foo,你的Java法式之旅就开启了,以下:


那末在这个履行的进程中,JVM都为你干了什么呢?
当你履行java Foo 的时辰,JVM会建立一个主线程main,这个主线程以上述的main()方式作为进口,起头履行你的代码。每一个线程在内存中城市保护一个属于自己的栈(Stack),记录着全部法式履行的进程。栈里的每一个元素称为栈帧(Stack Frame),栈帧暗示着某个方式挪用,会记录方式挪用的信息;现实上我们在代码中挪用一个方式的时辰,在内存中就对应着一个栈帧的入栈和出栈。
在某个特定的时候点,一个Main线程内的栈会显现以下图所示的情况:


从线程栈的角度来看,我们可以看到,JVM处置Java法式的根基单元是方式挪用。现实上,JVM履行的最根基单元的指令(即原子操纵)是汇编说话性质的机械字节码。这里之所以讲方式挪用时Java法式的根基履行单元,是从更宏观的角度看待的。
若何获得到虚拟机线程栈中的内容(即方式挪用进程)?
试想一下,若何可以获得到JVM线程栈中的方式挪用的内容? 我相信一切的Java programmer都晓得这个答案。Java Programmer几近天天都能看到它------当我们的代码抛出异常而未捕捉大概运转时出现了Error毛病时,我们会遭到一个很是厌恶的Log信息,以下:


固然,除了代码抛出异常外,我们还是可以其他方式发觉JVM线程栈内的内容。可以经过Thread.dumpStack()方式建立一个假的Exception实例,然后将这个Exception实例记录确当火线程栈的内容输出到标准毛病流中。例如我在某处代码里履行了Thread.dumpStack()方式,输出了以下的成果:


2. Java法式履行流 【领会AOP、毗连点(Join Point)、切入点(point cut) 的概念 】

假如从虚拟机线程栈的角度斟酌Java法式履行的话,那末,你会发现,真个法式运转的进程就是方式挪用的进程。我们依照方式履行的顺序,将方式挪用排成一串,这样就组成了Java法式流。
我们将上述的线程栈里的方式挪用依照履行流排列,会有以下类似的图:


基于时候序列,我们可以将方式挪用排成一条线。而每个方式挪用则可以看成Java履行流中的一个节点。这个节点在AOP的术语中,被称为Join Point,即毗连点。 一个Java法式的运转的进程,就是多少个毗连点毗连起来依次履行的进程。
在我们一般的面向工具的思维中, 我们斟酌的是若何依照时候序列经过方式挪用来实现我们的营业逻辑。那末,什么是AOP(即面向切面的编程)呢?
凡是面向工具的法式,代码都是依照时候序列纵向展开的,而他们都有一个共性:即都是已方式挪用作为根基履行单元展开的。 将方式挪用当做一个毗连点,那末由毗连点串起来的法式履行流就是全部法式的履行进程。
AOP(Aspect Oriented Programming)则是从别的一个角度来斟酌全部法式的,AOP将每一个方式挪用,即毗连点作为编程的进口,针对方式挪用停止编程。从履行的逻辑上来看,相当于在之前纵向的依照时候轴履行的法式横向切入。相当于将之前的法式横向切割成多少的面,即Aspect.每个面被称为切面。
所以,按照我的了解,AOP本质上是针对方式挪用的编程思绪。


既然AOP是针对切面停止的编程的,那末,你需要挑选哪些切面(即 毗连点Joint Point)作为你的编程工具呢?
由于切面本质上是每一个方式挪用,挑选切面的进程现实上就是挑选方式的进程。那末,被挑选的切面(Aspect)在AOP术语里被称为切入点(Point Cut). 切入点现实上也是从一切的毗连点(Join point)挑选自己感爱好的毗连点的进程。


Spring AOP框架中经过 方式婚配表达式来暗示切入点(Point Cut),至于具体的表达式语法是什么 不是本文的重点,请读者自行参考Spring响应的说明文档。
既然AOP是针对方式挪用(毗连点)的编程, 现在又拔取了你感爱好的自己感爱好的链接点---切入点(Point Cut)了,那末,AOP能对它做什么范例的编程呢?AOP能做什么呢?
领会这个之前,我们先要晓得一个很是重要的题目: 既然AOP是对方式挪用停止的编程,那末,AOP若何捕捉方式挪用的呢? 弄清楚这个题目,你不能不领会设想形式中的代理形式了。下面我们先来领会一下引入了代理形式的Java法式履行流是什么样子的。
3. 引入了代理形式的Java法式履行流(AOP实现的机制)

我们假定在我们的Java代码里,都为实例工具经过代理形式建立了代理工具,拜候这些实例工具必必要经过代理,那末,加入了proxy工具的Java法式履行流会变得稍微复杂起来。
我们来看下加入了proxy工具后,Java法式履行流的表示图:


由上图可以看出,只要想挪用某一个实例工具的方式时,城市经过这个实例工具相对应的代理工具, 即履行的控制权先交给代理工具。
关于代理形式
代理形式属于Java代码中经常用到的、也是比力重要的设想形式。代理形式可以为某些工具除了实现自己的功用外,供给一些额外的功用,大致感化以下图所示:


加入了代理形式的Java法式履行流,使得一切的方式挪用都经过了代理工具。对于Spring AOP框架而言,它负责控制着真个容器内部的代理工具。当我们挪用了某一个实例工具的任何一个非final的public方式时,全部Spring框架城市知晓。
此时的SpringAOP框架在某种水平上饰演着一个天主的脚色:它晓得你在这个框架内所做的任何操纵,你对每一个实例工具的非final的public方式挪用都可以被框架发觉到!


既然Spring代理层可以发觉到你所做的每一次对实例工具的方式挪用,那末,Spring就有机遇在这个代理的进程中插入Spring的自己的营业代码。
4. Spring AOP的工作道理

前面已经先容了AOP编程首先要挑选它感爱好的毗连点----即切入点(Point cut),那末,AOP能对切入点做什么样的编程呢? 我们先将代理形式下的某个毗连点细化,你会看到以下这个表示图所暗示的进程:


为了下降我们对Spring的AOP的了解难度,我在这里将代理脚色的职能停止了简化,方便大师了解。(留意:实在的Spring AOP的proxy脚色饰演的只能比这复杂的多,这里只是简化,方便大师了解,请不要先入为主)代理形式的代理脚色最最少要斟酌三个阶段:
1. 在挪用真正工具的方式之前,应当需要做什么?
2. 在挪用真正工具的方式进程中,假如抛出了异常,需要做什么?
3.在挪用真正工具的方式后,返回了成果了,需要做什么?
AOP对这个方式挪用的编程,就是针对这三个阶段插入自己的营业代码。
现在我们假定当前RealSubject这个脚色的类是 org.luanlouis.springlearning.aop.FooService ,当前这个毗连点对应的方式签名是:public void foo()。那末上述的代理工具的三个阶段将会有以下的处置逻辑:
1. 在挪用真正工具的方式之前
proxy会告诉Spring AOP: "我将要挪用类org.luanlouis.springlearning.aop.FooService 的public void foo() ,在挪用之前,你有什么处置倡议吗?";
Spring AOP这时按照proxy供给的类名和方式签名,然后拿这些信息尝试婚配能否在其感爱好的切入点内,假如在感爱好的切入点内,Spring AOP会返回 MethodBeforeAdvice处置倡议,告诉proxy应当履行的操纵;
2. 在挪用真正工具的方式进程中,假如抛出了异常,需要做什么?
proxy告诉Spring AOP: “我挪用类org.luanlouis.springlearning.aop.FooService 的public void foo()进程中壮隽艘斐,你有什么处置倡议?”
Spring AOP按照proxy供给的范例憾ソ式签名,肯定了在其感爱好的切入点内,则返反响应的处置倡议ThrowsAdvice,告诉proxy这个期间应当采纳的操纵。
3.在挪用真正工具的方式后,返回了成果了,需要做什么?
proxy告诉Spring AOP:"我挪用类org.luanlouis.springlearning.aop.FooService 的public void foo()竣事了,并返回了成果你现在有什么处置倡议?";
Spring AOP 按照proxy供给的范例名和方式签名,肯定了在其感爱好的切入点内,则返回AfterReturingAdivce处置倡议,proxy获得这个处置倡议,然后履行倡议;


上述的表示图中已经明白表白了Spring AOP应当做什么样的工作:按照proxy供给的特定类的特定方式履行的特按期间阶段给出响应的处置倡议。要完成该工作,Spring AOP应当实现:
1.肯定自己对什么类的什么方式感爱好? -----即肯定 AOP的切入点(Point Cut),这个可以经过切入点(Point Cut)表达式来完成;
2. 对应的的类的方式的履行特按期间给出什么处置倡议?------这个需要Spring AOP供给响应的倡议 ,即我们常说的Advice。

到此为止,AOP的根基工作机制已经先容终了。接待列位童鞋关注交换
https://blog.csdn.net/luanlouis/article/details/51095702

感谢您的阅读
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

    联系我们
  • 咨询电话:0000 - 12345678 9999888877
  • 邮箱:123456789@qq . com
  • 地址:北京市海定区通州路群芳园二园1号楼9号
    移动客户端:
    关注我们:
  • 微信公众号:
  • 123cwyy
  • 扫描二维码加关注

快速回复 返回顶部 返回列表