Spring Aop是一种面向切面的设计思想,它可以说是OOP(面向对象)的一种补充和完善,
OOP引入封装,继承和多态性来建立一种对象层次结构,用以模拟公共行为的一个集合。
但是当我们需要为分散的对象引入公共行为的时候,OOP则显得无力,
也就是说OOP允许定义上到下的关系,但是并不适合定义从左到右的关系。例如日志功能。日志代码往往散落在所有对象层次中,而它所散布到的对象的核心功能毫无关系。对于其他的代码,如安全性,异常处理和透明的持续性也是如此。这种散落在各处无关的代码被称为横切代码,在OOP的设计中,他导致了大量代码的重复,而不利于各个模块的重用,也会显得代码很冗余。
而AOP技术恰恰相反,他利用一种叫做“横切“的技术,剖开封装的对象内部。并将那些影响了多个类的公共行为封装到一个可重用模块中,并将其命名为”Aspect",即方面,简单地说,就是将那些与业务无关的,却为业务模块所共同调用的逻辑或者责任封装起来,以便于减少系统的重复代码,减低模块间的耦合度,并利于未来的可操作性和可维护性
AOP相关术语
连接点 (Joinpoint):连接点是指所有可能织入通知的方法理论上大部分都是连接点
程序执行的某个特定位置,如某个方法调用前,调用后,方法抛出异常后
这些代码中的特定的点称之为连接点,简单说就是在那里加入增强的逻辑
切面(Aspect): 切面由切点和增强组成,他既包括了横切逻辑的定义,也包括了连接点的
定义,一般是一个具体类对象
切入点(Pointcut):每个程序的连接点有多个,如何定位到某个感兴趣的连接点,
就需切入点来定位,Rubio,连接点==数据库的记录,切点--查询条件
织入(Weaving):将通知应用到目标对象来创建新的代理对象的过程
通知(Advice): 内部封装扩展业务的具体方法对象,一个切面可以有多个通知
实现原理
AOP可以在启动时为目标类型创建子类或兄弟类对象,这样的对象我们通常会称之为动态代理对象。
创建代理对象的两种方式:
1.JDK代理
jdk静态代理:
实现比较简单,一般是代理对象直接包装了被代理对象
jdk动态代理:
1.能继承静态代理的全部有点,并且能实现代码的复用
2.动态代理可以处理一类业务,只要满足条件,都可以通过代理对象继续宁处理
3.动态代理的灵活性不强
4.JDK的动态代理要求被代理者必须实现接口,否则不能生成代理对象
Cglib动态代理
1.不管有无接口都可以创建代理对象
2.cglib创建的的代理对象是目标类的子类
注意:要在pom文件中引入cglib依赖
AOP的通知类型
前置通知(Before):在目标方法或者说连接点被调用前执行的通知
后置通知(After):指在某个连接点完成执行后的通知
返回通知(After-returning):指在某个连接点成功执行之后执行的通知
异常通知(After-throwing):指在方法抛出异常后执行的通知
环绕通知(Around):指包围一个连接点通知,在通知的方法调用之前和之后执行的方法