spring -- AOP
一.什么是AOP?
AOP(Aspect Oriented Programming)是面向切面编程,它是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,面向切面编程将程序抽象成各个切面。所谓切面,相当于应用对象间的横切点,我们可以将其单独抽象为单独的模块。
1.AOP的术语
- 连接点(join point):程序在执行流程中经过的一个个时间点,这个时间点可以是方法调用时,或者是执行方法中异常抛出时,也可以是属性被修改时等时机,在这些时间点上你的切面代码是可以(注意是可以但未必)被注入的
- 切点(point cut):连接点 只是切面代码**可以被织入(增强)**的地方,但我并不想对所有的 JoinPoint 进行织入,这就需要某些条件来筛选出那些需要被织入的 JoinPoint,Pointcut 就是通过一组规则(使用 AspectJ pointcut expression language 来描述) 来定位到匹配的 Joinpoint
- 通知(advice):Pointcut 通过其规则指定了哪些 JoinPoint 可以被织入,而 Advice 则指定了这些 Joinpoint 被织入(或者增强)的具体时机与逻辑,是切面代码真正被执行的地方,主要有五个织入时机,
- Before Advice: 在 JoinPoints 执行前织入
- After Advice: 在 JoinPoints 执行后织入(不管是否抛出异常都会织入)
- After returning advice: 在 JoinPoints 执行正常退出后织入(抛出异常则不会被织入)
- After throwing advice: 方法执行过程中抛出异常后织入
- Around Advice: 这是所有 Advice 中最强大的,它在 JoinPoints 前后都可织入切面代码,也可以选择是否执行原有正常的逻辑,如果不执行原有流程,它甚至可以用自己的返回值代替原有的返回值,甚至抛出异常。 在这些 advice 里我们就可以写入切面代码了 综上所述,切面(Aspect)我们可以认为就是 pointcut 和 advice,pointcut 指定了哪些 joinpoint 可以被织入,而 advice 则指定了在这些 joinpoint 上的代码织入时机与逻辑。
- 目标对象(target):即被代理的对象
- 引入(introduction):是指引入新的类和其方法,增强现有bean的功能
- 织入(wearing):它是一个通过动态代理技术,为原有服务对象生成代理对象,然后将与切点定义匹配的连接点拦截,并按各类通知织入约定流程的过程
- 切面(Aspect):是一个可定义切点,各类通知和引入的内容,Spring AOP 将通过它的信息来增强Bean的功能或者将对应的方法织入流程
2.Spring AOP的实现方式
- JDK动态代理:这是java提供的动态代理技术,可以在运行时创建接口的代理实例。Spring AOP 默认采用这种方式,在接口的代理实例织入代码。
- CGLib动态代理:采用底层的字节码技术,在运行时创建子类代理的实例。当目标对象不存在接口时,Spring AOP就会采用这种方式,在子类实例中织入代码。
二.AOP的应用场景
日志功能,事务处理等
三.Spring AOP 不能对哪些类进行增强
- Spring AOP只能对Ioc容器中的Bean进行增强,对于不收容器管理的的对象不能增强
- 由于CGLib采用动态创建子类的方式生成代理对象,所以不能对final修饰的类进行代理
四.为什么默认是JDK动态代理
在性能方面,CGLib创建的代理对象比JDK动态代理创建对象的代理要高很多。但是,CGLib在创建代理对象时所花费的时间比JDK动态代理多很多。所以对于单例对象采用CGLib动态代理比较合适,而多例对象使用JDK动态代理合适