一、简介
AOP(Aspect-Oriented Programming,即面向切面程序设计),提供了另外一种有关程序结构的思维方式,是OOP(面向对象程序设计)的补充。
OOP的模块化单元是类,AOP的模块化单元是切面。切面可以模块化横切多个类或者对象的关注点,比如事务管理,这些关注点在AOP的词汇里,我们称之为横切关注点(crosscutting concerns).
Spring的AOP框架是Spring最重要的组件之一,虽然Spring的Ioc不依赖于AOP(这意味着你如果不需要AOP你可以不用它),但是AOP是Ioc的补充,它们一起可以提供强大的中间件解决方案。
Spring框架使用AOP可以:
(1)提供声明式的企业服务,作为EJB声明式企业服务的替代方案。其中最重要的一个服务就是声明式事务管理。
(2)作为OOP的重要补充,允许用户实现自定义的切面。
1、AOP相关概念
首先来认识AOP中的一些核心概念和术语,这些术语并不是特定于Spring框架的。AOP的这些术语不是很直观,比较不好理解。
(1)Aspect(切面):对横切多个类的关注点的模块化,事务管理是个很好的例子。在Spring AOP中,切面是通过常规的类(基于schema的方式)或者带有@Aspect注解的常规类(@AspectJ方式)来实现的。
(2)Join point(连接点):程序执行中的一个点,比如一个方法的执行或者一个异常的处理。在Spring AOP中,一个Join point总是代表一个方法的执行。
(3)Advice(通知或者建议):一个切面在一个连接点执行的动作。许多AOP框架,包括Spring的,都是把建议模拟成拦截器,在Join point周围维护了一个拦截器链。
(4)Pointcut(切入点):A Predicate that matches join points,匹配连接点的谓词。Advice关联一个pointcut表达式,并且在匹配这个表达式的连接点执行。Spring默认使用AspectJ的切入点表达式。
(5)Introduction(引进):在一个类型上声明额外的方法或者属性,Spring AOP允许你在任何目标对象上引进新的接口(以及一个相应的实现)。比如你可以使用introduction来让一个bean实现一个IsModified接口来简化缓存。(introduction在AspectJ社区被称为一个类型间声明inter-type declaration)。
(6)Target object(也叫advised object):目标对象,也就被建议对象,是被切面添加advice的对象。因为Spring AOP是使用运行时代理实现的,所以这个对象总是被代理的对象。
(7)AOP Proxy(AOP代理):AOP框架生成的一个对象,用来实现切面的约定(建议方法的执行等等)。在Spring中,一个AOP Proxy总是一个JDK动态代理或者一个CGLIB代理。
(8)Weaving(织入):把切面与其他应用类型或者对象链接起来生成一个新的advised object。织入可以在编译时(比如使用AspectJ编译器),加载时,运行时完成。Spring AOP和其他纯java的AOP框架一样,是在运行时完成织入的。
Types of advice:before,after returning,after throwing,after,around。