并不是所有的AOP框架都是相同的,它们在连接点模型上可能有强弱 之分。有些允许在字段修饰符级别应用通知,而另一些只支持与方法 调用相关的连接点。它们织入切面的方式和时机也有所不同。但是无 论如何,创建切点来定义切面所织入的连接点是AOP框架的基本功 能。
因为这是一本介绍Spring的图书,所以我们会关注Spring AOP 。虽然 如此,Spring和AspectJ项目之间有大量的协作,而且Spring对AOP的
支持在很多方面借鉴了AspectJ项目。
前三种都是Spring AOP实现的变体,Spring AOP构建在动态代理基础 之上,因此,Spring对AOP的支持局限于方法拦截。
Spring经典的AOP看起来就显得非常笨重和过于复杂,直接使用 ProxyFactory Bean会让人感觉厌烦。但是现在Spring提供了更简洁和干净 的面向切面编程方式。
引入了简单的声明式AOP和基于注解的AOP之 后, 借助Spring的aop命名空间,我们可以将纯POJO转换为切面。
实际 上,这些POJO只是提供了满足切点条件时所要调用的方法。遗憾的是,这种技术需要XML配置,但这的确是声明式地将对象转换为切面的简便方式。
Spring借鉴了AspectJ的切面,以提供注解驱动的AOP 。
本质上,它依 然是Spring基于代理的AOP ,但是编程模型几乎与编写成熟的AspectJ 注解切面完全一致。
这种AOP风格的好处在于能够不使用XML来完成 功能。
如果你的AOP需求超过了简单的方法调用 (如构造器或属性拦截) , 那么你需要考虑使用AspectJ来实现切面。在这种情况下,上文所示的第四种类型能够帮助你将值注入到AspectJ驱动的切面中。
通过在代理类中包裹切面,Spring在运行期把切面织入到Spring管理 的bean中。
下述图表明了什么?
1.代理类封装了目标类。 2.拦截被通知方法的调用。 3.把调用转发给真正的目标bean。 4.当代理拦截到方法调用时, 在调用目标bean方法之前,会执行切面逻辑。
图4 .3 Spring的切面由包裹了目标对象的代理类实现。
代理类处理方法的调用,执行额外的切面逻辑,并调用目标方法直到应用需要被代理的bean时,Spring才创建代理对象。
在ApplicationContext从BeanFactory中加载所有bean的时候,Spring才会创建被代理的对 象。
因为Spring运行时才创建代理对象,所以我们不需要特殊的编译 器来织入Spring AOP的切面。
使用各种AOP方案可以支持多种连接点模 型。
因为Spring基于动态代理,所以Spring只支持方法连接点。这与 一些其他的AOP框架是不同的,例如AspectJ和JBoss ,除了方法切点,它们还提供了字段和构造器接入点。