Aop的概念、术语
- 一、什么是Aop?
- 二、AOP相关术语?
- 1、Joinpoint( 连接点):所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点。
- 2、Pointcut( 切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义。
- 3、Advice( 通知/ 增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知。
- 4、Introduction( 引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方法或 Field。
- 5、Target( 目标对象):代理的目标对象。
- 6、Weaving( 织入):
- 7、Proxy(代理):一个类被 AOP 织入增强后,就产生一个结果代理类。
- 八、Aspect( 切面):是切入点和通知(引介)的结合。
- 三、学习 spring中的aop要明确的事
一、什么是Aop?
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强。
Aop的作用及好处:
作用:
在程序运行期间,不修改源码对已有方法进行增强。
优势:
减少重复代码
提高开发效率
维护方便
二、AOP相关术语?
1、Joinpoint( 连接点):所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点。
在业务层的接口中,所有的方法都是连接点,它是连接我们的业务。
2、Pointcut( 切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义。
在业务层接口的所有方法中,都是连接点,但只是被增强的才叫做切入点。很明显这里的test方法只是连接点,不是切入点,因为它没有被增强。
3、Advice( 通知/ 增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知。
通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。
动态代理中,invoke方法具有拦截的功能,能拦截被代理对象中执行的所有方法,那它拦截这些方法之后干什么事呢?它就是开启事务到释放资源,从这一点上,我们就进一步得知什么叫通知呢?它是指拦截之后要干的事情。那么拦截之后就是要提供事务的支持。那谁是通知呢?就是我们的TransactionManager,因为当我们拦截到它的之后,就要开始对它事务的支持。
通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。
4、Introduction( 引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方法或 Field。
5、Target( 目标对象):代理的目标对象。
这个就是被代理的对象
6、Weaving( 织入):
是指把增强应用到目标对象来创建新的代理对象的过程。
spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装载期织入。
我们原有的这个service无法实现事务的支持,于是我用了动态代理技术创建了一个新的对象,返回了一个代理对象,那在返回的一个代理对象的时候,我在从中给它加入了事务的支持,那整个这个加入事务支持的这个过程叫织入。
7、Proxy(代理):一个类被 AOP 织入增强后,就产生一个结果代理类。
八、Aspect( 切面):是切入点和通知(引介)的结合。
哪些方法被增强过,哪些方法就是切入点,通知指的就是那些提供了公共代码的类,那这些公共代码什么时候去执行呢,我们说,我们写代码的时候很容易,我们开启事务这些,什么时候能把这些事情说明白呢?那这个时候我们说,建立切入点方法,和通知方法在执行调用的对应关系就是切面。
三、学习 spring中的aop要明确的事
a 、开发阶段(我们做的)
编写核心业务代码(开发主线):大部分程序员来做,要求熟悉业务需求。
把公用代码抽取出来,制作成通知。(开发阶段最后再做)
在配置文件中,声明切入点与通知间的关系,即切面。
b 、运行阶段(Spring 框架完成的)
Spring 框架监控切入点方法的执行。一旦监控到切入点方法被运行,使用代理机制,动态创建目标对象的代理对象,根据通知类别,在代理对象的对应位置,将通知对应的功能织入,完成完整的代码逻辑运行。