AOP

来源:互联网 发布:检测移动硬盘的软件 编辑:程序博客网 时间:2024/04/30 18:50
什么是AOP
-----------------------------------

AOP(Aspect Oriented Programming)是面向对象编程(OOP)的补充。OOP以类为核心,而AOP以切片(Aspect)为编程核心。AOP可以在纵向上给一批对象添加模块化的功能,如事务管理、日志管理等。

AOP中的一些术语
-----------------------------------

Aspect:切片,在纵向上给多个类添加模块化的功能。
Join Point:切入点,如一个方法的执行或一个异常的处理。
Advice:可以当成是放在切入点上的拦截器(Interceptor),这些拦截器可以放在方法前、中、后、异常抛出后。
Pointcut:匹配Join Pint的表达式或称之为算法。
Introduction:通过切片为一些类添加一些方法或属性,Spring中通过给目标对象注入接口及实现来完成Introduction的功能。
Target Object:被切片切到的对象。
AOP Proxy:为Target Object创建代理对象,以便执行相应的Advice,Spring中通过JDK Dynamic Proxy和CGLIB实现AOP Proxy。
Weaving:即将Aspect应用到目标对象,可以发生在编译阶段(Compile Time)、加载阶段(Load Time)、运行阶段(Runtime)。Spring AOP是在Runtime阶段进行Weaving。

Spring中的AOP
-----------------------------------

Spring2.0之前和之后版本的AOP最大区别就在Pointcut上,2.0之后的可以通过aspectj表达式来匹配Join point。而早期的只能通过底层的AOP API来完成,即使有ProxyFactoryBean这样的类,配置也不优雅。
Spring AOP只做到方法级别的AOP,即针对方法进行切片,它认为这已足够企业应用使用了。

Pointcut Expression--Pointcut 表达式
-----------------------------------

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
execution是用得最多的表达式,用来匹配方法。
有问号的是可选的。
*代表任意类型。
参数()代表无参数。
(*)代表参数个数为1,类型任意。
(..)代表任意个数的参数。
(*,String)代表两个参数,第一个类型任意,第二个为String类型。

execution(* com.xyz.service.*.*(..))
在service包下所有类的所有方法
execution(* com.xyz.service..*.*(..))
在service包及子包下的所有类的所有方法