什么是面向切面编程AOP?
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AOP作用
对程序进行增强:不修改源码的情况下,AOP可以进行权限的校验,日志记录,性能监控,事务控制
Spring底层的AOP原理:
动态代理(静态代理)
JDK动态代理: 面向接口的,只能对实现了接口的类产生代理
Cglib动态代理(类似于JavaSsit第三方代理技术):对没有实现接口的类产生代理对象(生成子类对象)
类实现了接口,Spring就用JDK动态代理,没有实现接口的,用Cglib动态代理,Spring底层可以自动切换
Spring的AOP的简介
▪AOP思想最早是有AOP联盟组织提出的,Spring使用这种思想最好的框架.
▪Spring的AOP有自己的实现方法(非常繁琐)
▪使用第三方的AspectJ是一个AOP的扩建,Spring引入AspectJ作为自身AOP的开发.
▪Spring的AOP开发方式
▪Spring传统的方式(弃用)
▪Spring基于AspentJ的AOP开发(使用广泛)
Spring的AOP开发的相关术语
1.通知(Advice)
就是你想要的功能,也就是上面说的 安全,事物,日志等。你给先定义好把,然后在想用的地方用一下。
2.连接点(JoinPoint)
spring允许你使用通知的地方,基本每个方法的前,后(两者都有也行),或抛出异常时都可以是连接点,spring只支持方法连接点.和方法有关的前后(抛出异常),都是连接点。
3.切入点(Pointcut)
上面说的连接点的基础上,来定义切入点,你的一个类里,有5个方法,那就有5个连接点了,但是你并不想在所有方法附近都使用通知(使用叫织入),你只想让其中的几个,在调用这几个方法之前,之后或者抛出异常时干点什么,那么就用切点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。
4.切面(Aspect)
切面是通知和切入点的结合。通知说明了干什么和什么时候干(什么时候通过方法名中的before,after,around等就能知道),而切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。
5.引入(introduction)
允许我们向现有的类添加新方法属性。就是把切面(也就是新方法属性:通知定义的)用到目标类中
6.目标(target)
引入中所提到的目标类,也就是要被通知的对象,也就是真正的业务逻辑,他可以在毫不知情的情况下,被咱们织入切面。而自己专注于业务本身的逻辑。
7.代理(proxy)
怎么实现整套aop机制的. 就是通过代理.织入增强功能后产生的代理对象
8.织入(weaving)
把切面应用到目标对象来创建新的代理对象的过程。有3种方式,spring采用的是运行时。
通知的类型
通知的意思就是个顺序: 在目标方法之前或后执行
▪ 前置通知before:在目标方法执行之前的操作
可以获取切入点的信息
▪ 后置通知after-returning:在目标方法执行之后的操作
▪ 带返回值的后置通知after-returning:在目标方法执行之后的操作,并获取目标方法的返回值
▪ 环绕通知around:在目标方法执行之前和之后进行操作
▪ 扩展带参数: 环绕通知around:在目标方法执行之前和之后进行操作
▪ 异常抛出通知after-throwing:在目标方法抛出异常时的操作(比如出现异常后进行回滚)。
▪ 最终通知after:无论是否有异常都会执行的,相当于try-catch-finally中的finally块