AOP是Aspect Oriented Programing的简称,称之为面向切面编程。面向切面编程需要把程序逻辑分解成不同的部分称为关注点。跨一个应用程序的多个点的功能被称为横切关注点。这些横切关注点的概念独立于应用程序的业务逻辑。
AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。
实现AOP的技术,主要分为两大类:
1.采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行
2.采用静态织入的方式,引入特定的语法创建“切面”,从而使得编译器可以在编译期间织入有关“切面”的代码。
动态代理有JDK代理技术:
核心业务是支付,当然还需要一些辅助的功能
代理类实现InvocationHandler,并实现其invoke方法:
调用时,利用Proxy中的静态方法newProxyInstance,向该方法传入类加载器,接口的信息,以及代理类:
还有cglib进行代理,实现MethodInterceptor接口,并实现其intercept方法:
调用Enhancer中的create方法,传入实现类的信息,以及代理类。
在使用cglib时,得添加依赖。
但是,传统的程序经常表现出一些不能自然地适合跨越多个程序模块地行为,因此,面向切面地AOP就诞生了。
AOP带来的好处:
降低模块耦合度
使系统容易扩展
延迟设计决定
更好的代码复用性
Advice-通知:定义了切面是什么,何时使用,其描述了切面要完成的工作,还解决何时执行这个工作的问题。
前置通知(Before): 在目标方法被调用之前调用通知功能;
后置通知(After): 在目标方法完成之后调用通知,此时不会关心方法的输出是什么;
返回通知(After-returning):在目标方法成功执行之后调用通知;
异常通知(After-throwing): 在目标方法抛出异常后通知调用;
环绕通知(Around):通知包裹了被通知的方法,在被通知的方法通知之前和调用之后执行自定义的行为。
连接点:是在应用执行的过程中能够插入切面的一个点,这个点可以是方法调用时,抛出异常时,甚至修改字段时。
切点:是缩小切面所通知的连接点的范围。切点的定义会匹配通知所要织入的一个或者多个连接点
切面:是通知和切点的结合。
织入是把切面应用到目标对象并创建新的代理对象的过程,切面在指定的连接点被织入到目标对象中。
编译期:切面在目标类编译时被织入。这种方式需要特殊的编译器。
类加载器:切面在目标类加载到VM时被织入。
运行期:切面在应用运行的某一时刻被织入。
目标对象:被一个或者多个切面所通知的对象。SpringAOP是通过运行时代理实现的,那么这个对象永远是个被代理对象。
下面是AOP的例子: