Spring AOP面向切面编程

来源:互联网 发布:bootstrap 模版 cms 编辑:程序博客网 时间:2024/06/06 19:59

1、知识背景:

软件系统可以看成是由一组关注点组成的,其中,直接的业务关注点,是直切关注点。而为真切关注点提供服务的就是横切关注点。


2.面向切面的基本原理:

横切关注点:就是那些夹杂在业务代码中服务性代码。(如事务、日志、安全、缓存等);

切面:就是横切关注点的模块化设计的表现形式,其实就是一个类;

切面=通知+切点;

通知:就是切面类当中的那些方法(动作性的东西)

五种通知类型:

1.Before:在方法调用之前调用通知;

2.After:在方法完成之后调用通知,无论方法执行成功与否;

3.After-returning:在方法执行成功之后调用通知;

4.After-throwing:在方法抛出异常后进行通知;

5.Around:环绕通知,在被 通知的方法调用之前和调用之后执行自定义行为。

连接点:表示在业务类当中有可能织入通知的地方;

切点:表示要进行织入的连接点;

织入:将服务代码与业务代码进行融合的过程称为织入。

3.Spring对AOP的支持

并不所有AOP框架都是一样的,他们在连接点模型上可能有强弱之分。有些允许对字段修改符级别应用通知。有些支持方法调用连接点:

Spring提供的4种各具特色的AOP支持

1.基于代理的经典AOP;

2.@AspectJ注解驱动的切面;

3.纯POJO切面;

4.注入式AspectJ切面。


Spring在运行期间通知对象,通过在代理类中织入包裹切面,Spring在运行期间将切面织入到Spring管理的Bean中。

代理类封装了目标类,并拦截被通知的方法调用,再将调用转发给真正的目标Bean。



    • 当拦截到方法调用时,在调用目标 Bean 方法之前,代理会执行切面逻辑。 
      当真正应用需要被代理的 Bean 时,Spring 才创建代理对象。如果使用 ApplicationContext,在 ApplicationContext 从 BeanFactory 中加载所有 Bean 时,Spring 创建代理对象,因为 Spring 在运行时候创建代理对象,所以我们不需要特殊的编译器来织入 Spring AOP 的切面。
  • Spring 支持方法创建连接点 
    • 因为 Spring 基于动态代理,所以 Spring 只支持方法连接点。
    • Spring 缺失对字段连接点的支持,无法让我们更加细粒度的通知,例如拦截对象字段的修改
    • Spring 缺失对构造器连接点支持,我发在 Bean 创建时候进行通知。