首页 > 编程知识 正文

spring用到的设计模式,spring aop配置详解

时间:2023-05-05 09:26:32 阅读:32263 作者:1823

本文引用自博客: https://blog.csdn.net/Luan Louis/article/details/51095702。

目录:

1. Java程序在JVM上运行的特点

2. Java程序的执行流程【了解AOP、连接点、入口点的概念】

3 .引入代理模式的Java程序执行流程(AOP实现机制) ) ) ) ) ) ) ) ) ) )。

4. Spring AOP的工作原理

1 .在Java程序在JVM上运行的特征类Foo中编写main (方法后,执行java Foo,如下所示:

在公共类foo { publicstaticvoidmain (字符串[ ] args )/yourcodesbeginshere}中,JVM在此运行过程中为你做了什么?

用调皮的钢笔运行java Foo时,JVM会以上述main () )方法为入口,创建开始执行你的代码的主线程main。 每个线程在内存中维护自己的堆栈,并记录整个程序的运行过程。 堆栈中的每个元素称为堆栈帧(Stack Frame ),堆栈帧表示方法调用,并记录方法调用的信息。 实际上,在代码中调用方法时,内存对应于堆栈帧的堆栈和外栈。

在某个特定时间点,主线程中的堆栈如下图所示。

从线程栈的角度看,JVM处理Java程序的基本单位是方法调用其实,JVM执行的最基本单位的指令,即原子操作是汇编语言性质的机器字节码。 从更宏观的角度来说明方法调用时Java程序的基本执行单位。

2. Java程序的执行流程【理解AOP、连接点、入口点的概念】按照执行流程顺序排列上述线程堆栈中的方法调用,如下图所示。

可以根据时间序列将方法调用排成一列。 以及每个方法调用则可以看成Java执行流中的一个节点此节点是AOP术语,称为Join Point,即连接点。 一个Java程序的执行过程是几个连接点相连依次执行的过程。

通常,面向对象的程序将代码沿时间序列纵向展开,但它们是通用的。即都是已方法调用作为基本执行单位展开的。 将方法调用当做一个连接点,那么由连接点串起来的程序执行流就是整个程序的执行过程。

AOP(Aspect Oriented Programming)是从另一个角度考虑整个程序的,AOP以各自的方法调用,即连接点为编程入口,对方法调用进行编程。 从执行的逻辑上来看,相当于将之前在纵向上沿着时间轴执行的程序横向地切入。 相当于将之前的程序横向切断成几个面,Aspect .各面称为切断面。

所以,根据我的理解,AOP本质上是针对方法调用的编程思路

因为AOP对切面进行编程,所以应该选择哪个切面(连接点关节点)作为编程对象?

因为切面本质上是每一个方法调用,选择切面的过程实际上就是选择方法的过程。那么,被选择的切面(Aspect)在AOP术语里被称为切入点(Point Cut). 切入点实际上也是从所有的连接点(Join point)挑选自己感兴趣的连接点的过程。

注意:在Spring AOP框架中,方法匹配表达式表示入口点(点计数),在配置文件中为) value.*add.*/value

既然AOP是针对方法调用(连接点)的编程, 现在又选取了你感兴趣的自己感兴趣的链接点---切入点(Point Cut)了,那么,AOP能对它做什么类型的编程呢?AOP能做什么呢?

3358www.Sina.com/在知道这个之前,AOP是方法调用的编程,所以3358www.Sina.com/? 要弄清楚这个问题,我们必须了解设计模式中的代理模式。 首先,让我们看看引入代理模式的Java程序的执行流程。

3 .引入代理模式的Java程序执行流(AOP实现的方式)在我们的Java代码中,为实例对象以代理模式创建了代理对象,并访问这些实例对象

的Java程序执行流会变得稍微复杂起来。我们来看下加入了proxy对象后,Java程序执行流的示意图:

由上图可以看出,只要想调用某一个实例对象的方法时,都会经过这个实例对象相对应的代理对象, 即执行的控制权先交给代理对象。

代理模式属于Java代码中经常用到的、也是比较重要的设计模式。代理模式可以为某些对象除了实现本身的功能外,提供一些额外的功能,大致作用如下图所示:

       加入了代理模式的Java程序执行流,使得所有的方法调用都经过了代理对象。对于Spring AOP框架而言,它负责控制着真个容器内部的代理对象。当我们调用了某一个实例对象的任何一个非final的public方法时,整个Spring框架都会知晓。

  

既然Spring代理层可以察觉到你所做的每一次对实例对象的方法调用,那么,Spring就有机会在这个代理的过程中插入Spring的自己的业务代码。

 

4.     Spring AOP的工作原理

前面已经介绍了AOP编程首先要选择它感兴趣的连接点----即切入点(Point cut),那么,AOP能对切入点做什么样的编程呢? 我们先将代理模式下的某个连接点细化,你会看到如下这个示意图所表示的过程:

为了降低我们对Spring的AOP的理解难度,我在这里将代理角色的职能进行了简化,方便大家理解。(注意:真实的Spring AOP的proxy角色扮演的只能比这复杂的多,这里只是简化,方便大家理解,请不要先入为主)代理模式的代理角色最起码要考虑三个阶段:

在调用真正对象的方法之前,应该需要做什么?在调用真正对象的方法过程中,如果抛出了异常,需要做什么?在调用真正对象的方法后,返回了结果了,需要做什么?

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的基本工作机制已经介绍完毕了

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。