Spring Journey -- AOP basic concept

来源:互联网 发布:驾校预约考试软件 编辑:程序博客网 时间:2024/06/08 17:15

什么是面向切面编程?

软件系统中的某些功能(横切关注点,但这些功能又很重要,像日志,安全,事务)需要被用到应用程序的多个地方,但又不想在每个点都调用它们,它们不应该是应用对象应该主动参与的任务,即应用对象只会关注到自己的业务领域问题,其他的交由其他对象来处理。那么这种把横切关注点与业务相分离就是面向切面编程所要解决的问题。

切面(aspect)可以用来模块化横切关注点,成为特殊的类。在 AOP 术语中,切面的工作被称为通知即通知里包含了切面要做什么以及什么时候(在某个方法调用之前 、之后、之前和之后都需要、还是方法抛出异常时),那么根据时间不同,又可以分为像前置通知、后置通知、异常通知、环绕通知、返回通知。

连接点(Joint point)就是应用执行过程中能够插入切面的一个点。

切点(Pointcut)有助于切面所通知的连接点的范围,有点不太好理解 ,有 N个连接点,一个切面并不需要通知所有的连接点。切点定义了何处,会更具体,切点的定义会匹配通知所要织入的一个或多个连接点,通常用指定明确的类和方法名称来指定这些切点。

织入(Weaving)把切面应用到目标对象并创建新的代理对象的过程

总结的话:通知包含了需要用于多个应用对象的横切行为,连接点是程序执行过程中能够应用通知的所有点,切点定义了通知被应用的具体位置(在哪些连接点),切点定义了哪些连接点会得到通知。


Spring 对 AOP 的支持

并不是所有的 AOP 框架都是相同的,它们在连接点模型上会有强弱之分,有些允许在字段修饰符级别应用通知,有些只支持与方法调用相关的连接点。创建切点来定义切面所织入的连接点是 AOP 框架的基本功能。

Spring AOP 构建在动态代理之上,因此 Spring 对 Aop的支持局限于方法拦截。如果你的 AOP 需求超过了简单的方法调用(如构造器或属性拦截),考虑用 AspeectJ来实现切面 。

Spring 在运行时用通知对象,通过,在代理类中包裹切面 ,Spring在运行期把切面织入到 Spring 管理的 Bean 中。代理类封闭了目标类,并拦截被通知方法的调用,再把调用转发给真正的目标 Bean,当代理拦截到方法调用时,在调用目标 Bean 之前,会执行切面逻辑

Spring 无法创建更细粒度的通知(如拦截对象字段的修改),也不支持构造器连接点,也就意味着无法在创建 Bean 时应用通知。

0 0
原创粉丝点击