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