第四章:面向切面的Spring

4.1 什么是面向切面编程

在第二章,我么介绍了如何使用依赖注入管理和配置我们的应用对象。DI有助于应用对象之间的解耦,而AOP可以实现横切关注点与它们所影响的对象之间的解耦。

日志是切面编程常见的范例,还有声明式事务,安全,缓存等。。。

横切关注点可以被描述为影响应用多出的功能。例如,安全就是一个横切关注点,应用中的许多方法都会涉及到安全规则。

每一个模块都有特定的业务功能,但是同时也有一些通用功能,比如安全。。。

安全这个通用功能的类被称为切面(aspect)。

4.4.1 定义AOP术语

  1. 通知

    1. 定义:通知定义了切面是什么,何时使用。(应该就是告诉编译器是哪一个切面,什么时候有五种类型)
    2. 5种类型的通知
      1. 前置通知:在目标方法被调用之前调用通知
      2. 后置通知:在目标方法被调用之后,不关心方法的输出是什么
      3. 返回通知:目标方法完成成功,就是走到返回值
      4. 异常通知:在目标抛出异常后调用
      5. 环绕通知:包裹被通知的方法,前后都调用
  2. 连接点

    我们的应用有可能有数以万计的机会应用通知,这些时机被称为连接点。连接点是可以插入切面的一个点,可以是调用方法时,抛出异常时,甚至修改一个字段时。?
    切面代码可以利用这些点插入到应用的正常流程之中,并添加新行为。(就是所有可以插入切面,调用切面方法的地方)
  3. 切点

    一个切面并不需要通知应用的所有连接点,切点有助于缩小切面所统治的连接点的范围。定义了“何处”,通知定义了“什么”和“何时”。
  4. 切面

    切面=通知+切点
  5. 引入

    引入允许我们向现有的类添加新方法,或属性。?
  6. 织入

    织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期中有多个点可以进行织入:
    1. 编译期,切面在目标类编译的时候被织入AspectJ
    2. 类加载期,切面在目标类加载到JVM时被织入,需要特殊的类加载器,可以在目标类被引入应用前增强字节码。ASPECTJ5
    3. 运行期,切面在应用运行的某个时刻被织入。AOP容器会为目标对象创建一个代理对象,SpringAOP

4.1.2 Spring对AOP的支持

Spring提供了4种类型的Aop支持:

  1. 基于代理的经典Spring AOP:经典的Spring aop不再推荐,在引入了简单的声明式AOP和基于注解的AOP之后,经典的AOP就不再推荐了。
  2. 纯POJO切面:借助Spring的aop命名空间,我们可以将纯POJO转化为切面。这些POJO只是提供了满足切点条件时所要调用的方法。需要使用xml。
  3. @AspectJ注解驱动的切面: Spring借鉴了AspectJ的切面,以提供注解驱动的AOP。本质上它还是基于代理的AOP。可以不使用xml来完成。
  4. 注入式AspectJ切面(适用于Spring个版本):如果你的aop需求超过了简单的方法调用拦截(如构造器或属性拦截),那么需要使用AspectJ来实现切面

前三种都是Spring Aop实现的变体,SpringAop构建在动态代理基础之上。因此Spring对AOP的支持局限于方法拦截

Spring通知是Java编写的

Spring所创建的通知都是用标准的Java类编写的。

Aspect J与之相反。需要Aspect J特有的Java拓展语言来写。

Spring在运行时通知对象

通过在代理类中包裹切面,Spring在运行期间把切面织入到Spring管理的bean中。

代理类封装了目标类,并拦截被通知方法的调用,再把调用转发给真正的目标bean。当代理拦截到方法调用的时候,在调用目标bean方法之前,会执行切面逻辑。

直到应用需要被代理的bean时,Spring才创建代理对象。

Spring是运行时才创建代理对象,所以我们不需要特殊的编译器来织入

Spring只支持方法级别的连接点

通过使用各种AOP方案可以支持多种连接点模型。因为Spring基于动态代理,所以Spring只支持方法连接点(拦截方法级别)。这与其他的AOP框架是不同的,例如AspectJ和JBOSS(他们还支持字段和构造器接入点)。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值