Spring AOP建立于Ioc之上,作为OOP的有益补充
利用横向机制解决了无法通过纵向继承体系进行抽象的重复性
一、AOP术语
1.连接点Joinpoint
一个类或一段程序代码拥有一些具有边界性质的特定点,称为拦截到的点,方法前方法后等,Spring仅支持方法的连接点,连接点包含两个信息,执行点(切点)与相对位置的方位(增强中定义)
2.切点Pointcut
如果一个类中有两个方法,那么这两个方法都是连接点,即连接点是客观存在的,切点即为特定的连接点,例如连接点相当于数据库中的记录,切点为查询条件,两者不是一一对应的,一个切点可以匹配多个连接点
3.增强Advice
织入到目标连接点的一段程序代码,还包含和连接点的相关信息,即执行点的方位
4.目标对象Target
5.引介Introduction
一种特殊的增强,它为类添加一些属性和方法,这样,即使一个业务类原本没有实现某个接口,通过AOP的引介功能,也可以动态的为该业务添加接口的实现逻辑,让业务类成为这个接口的实现类
6.织入Weaving
是将增强添加到目标类的具体连接点上的过程,有三种织入方式
(1)编译器织入
(2)类装载器织入
(3)动态代理织入,在运行期为目标类添加增强生成子类的方式
Spring采用动态代理,AspectJ采用编译期和类装载期织入
7.代理Proxy
8.切面
切点与增强(引介)组成
二、Spring对AOP的支持
Spring中的AOP代理由Ioc负责创建与管理,并通过JDK或CGLib动态代理技术将横切代码动态织入到相应的位置
(1)JDK动态代理:其只能为接口创建代理实例
(2)CGLib动态代理:采用底层的字节码技术,可以为一个类创建子类,在子类中采用方法拦截的技术拦截所有父类方法的调用并顺势织入横切逻辑
流程;
Spring AOP通过切点指定在哪些类的那些方法上织入横切逻辑,通过增强描述逻辑和方法的具体织入点(方法前、方法后)。此外,Spring通过切面将切点与增强组装起来。有了切面的信息,Spring就可以利用JDK或CGLib动态代理技术为目标Bean创建织入切面的代理对象了。
CGLib的性能要比JDK好,但是所需的时间也高
Spring:提供了自动创建代理机制,
三、AOP无法增强的原因
(1)JDK代理必须保证目标方法在接口中有定义
(2)CGLib代理必须保证目标方法可以被子类访问,即目标方法不能为final
四、@AspectJ
用户可以使用@AspectJ注解非常容易地定义一个切面,不需要事先任何接口