1、介绍

AOP(面向切面编程)对OOP(面向对象编程)是一种补充,它提供了另一种程序结构的思路。OOP的模块单元是class,而AOP的模块单元是aspect。Spring中一个关键的组件是AOP框架,然而,Spring IoC容器并不依赖于AOP,也就是说如果你不想用AOP的话可以不用。

在Spring框架中AOP用来做什么呢?

  • 提供声明式的企业服务,特别是代替EJB的声明式服务。最重要的的服务是声明式事务管理。
  • 允许用户实现自定义的aspect

1.1、AOP概念

  • Aspect(方面):横切多个class的一个关注点的模块化。事务管理是一个很好的例子。在Spring AOP中,aspect可以用普通类或者带有@Aspect注解的普通类来实现。
  • Join point(连接点):程序执行期间的一个点,比如方法的执行或者异常的处理。在Spring AOP中,一个连接点总是代表一个方法执行。
  • Advice(通知):一个aspect在一个特定的连接点所采取的动作。通知的类型包括"around"、"before"、"after"。许多AOP框架,包括Spring也是,它们把一个通知作为一个拦截器,维护一个拦截器链环绕在连接点上。
  • Pointcut(切入点):匹配连接点的一个谓词。Advice关联一个切点表达式。Spring默认用AspectJ切点表达式。
  • Target object(目标对象):被一个或多个aspect通知的对象。在Spring AOP中是用运行时代理来实现的,因此这个对象总是一个代理对象。
  • AOP proxy(AOP代理):为了实现aspect而被AOP框架所创建的一个对象。在Spring框架中,一个AOP proxy可能是一个JDK动态代理或者一个CGLIB代理。

1.2、通知的类型

  • Before advice(前置通知):在一个连接点之前执行的通知,但是没有能力阻止后面的执行(除非它抛异常)
  • After returning advice(返回通知):在一个连接点正常执行完以后执行的通知:例如,在一个不抛异常的方法返回时执行
  • After throwing advice(异常通知):如果方法因为抛出异常而退出了才会执行的通知
  • After (finally) advice(后置通知):无论连接点正常退出还是异常退出都会执行
  • Around advice(环绕通知):环绕一个连接点比如方法调用的通知。这是最强的一种通知。环绕通知可以在方法调用之前或之后执行自定义的行为。它也负责选择是否处理连接点方法执行,通过返回一个它自己的返回或者抛出异常。环绕通知是用得最普遍的一种通知。

1.3、Spring AOP的能力和目标

Spring AOP用纯Java实现。目前只支持方法执行的连接点,字段拦截没有实现。

1.4、AOP Proxies

Spring AOP defaults to using standard JDK dynamic proxies for AOP proxies. This enables any interface (or set of interfaces) to be proxied.

Spring AOP can also use CGLIB proxies. This is necessary to proxy classes rather than interfaces.

CGLIB is used by default if a business object does not implement an interface. As it is good practice to program to interfaces rather than classes; business classes normally will implement one or more business interfaces.

默认JDK动态代理,如果对象没有实现接口则用CGLIB

2、@AspectJ支持

@AspectJ是用注解来标注常规的Java类的一种声明aspect的风格。

2.1、启用@AspectJ支持

你需要开启Spring对于基于@AspectJ aspects的Spring AOP配置的支持,和autoproxying beans的支持。autoproxying的意思是如果Spring检测到一个bean被一个或多个aspect通知,它将自动为这个bean生产代理以拦截方法调用并确保通知被执行。

可以用XML或者Java配置的方式来开启对@AspectJ的支持。你需要确保在你的工程的classpath下有aspectweaver.jar。

2.2、声明一个aspect

2.3、声明一个pointcut

A pointcut declaration has two parts: a signature comprising a name and any parameters, and a pointcut expression that determines exactly which method executions we are interested in. In the @AspectJ annotation-style of AOP, a pointcut signature is provided by a regular method definition, and the pointcut expression is indicated using the @Pointcut annotation (the method serving as the pointcut signature must have a void return type).

声明一个pointcut有两部分:一个签名和一个切点表达式。签名由一个name和任意参数组成,切点表达式决定对哪些方法执行感兴趣。在注解风格的AOP中,一个pointcut签名就是一个常规方法定义,而pointcut表达式用@Pointcut注解来标识(作为pointcut签名的方法的返回值必须是void)

Spring AOP还支持下面这样的切点表达式:

切点表达式可以组合使用

The format of an execution expression is:

2.4、声明advice

3、基于XML格式的AOP支持

the keywords 'and', 'or' and 'not' can be used in place of '&&', '||' and '!' respectively

4、选择哪种AOP声明方式

4.1、Spring AOP or full AspectJ?

4.2、@AspectJ or XML for Spring AOP?

如果你选择用Spring AOP,那么你可以选择用@AspectJ或者XML风格。推荐用@AspectJ。

5、代理机制

Spring AOP用JDK动态代理或者CGLIB来创建目标对象的代理。(首选JDK动态代理)

如果被代理的目标对象至少实现了一个接口,那么JDK动态代理将会被使用。而且,目标对象实现的所有接口都将被代理。

如果目标对象没有实现任何接口,那么一个CGLIB代理将会被创建。

如果你想强制使用CGLIB代理也是可以的,但是你需要考虑一个问题,那就是final方法不能被通知,因为它们不能被覆盖。

如果你想强制使用CGLIB代理可以这样做,二者选其一即可:

5.1、理解AOP代理

Spring AOP is proxy-based.(Spring AOP是基于代理的)

理解这个语义是极其重要的。

参考

《Spring Framework Reference Documentation》 4.3.14.RELEASE

Spring文档下载地址

http://repo.springsource.org/libs-release-local/org/springframework/spring/

Spring AOP介绍的更多相关文章

  1. Spring AOP介绍与使用

    Spring AOP介绍与使用 AOP:Aspect Oriented Programming 面向切面编程 OOP:Object Oriented Programming 面向对象编程 ​ 面向切面 ...

  2. Spring AOP介绍及源码分析

    转自:http://www.uml.org.cn/j2ee/201301102.asp 软件开发经历了从汇编语言到高级语言和从过程化编程到面向对象编程:前者是为了提高开发效率,而后者则使用了归纳法,把 ...

  3. Spring AOP 介绍与基于接口的实现

    热烈推荐:超多IT资源,尽在798资源网 声明:转载文章,为防止丢失所以做此备份. 本文来自公众号:程序之心 原文地址:https://mp.weixin.qq.com/s/vo94gVyTss0LY ...

  4. spring aop介绍和示例

    参考:<Spring in Action> 一.AOP介绍 AOP是Aspect Oriented Programming的缩写,意思是面向切面编程. 应用中有一些功能使用非常普遍,比如事 ...

  5. Spring AOP 和 动态代理技术

    AOP 是什么东西 首先来说 AOP 并不是 Spring 框架的核心技术之一,AOP 全称 Aspect Orient Programming,即面向切面的编程.其要解决的问题就是在不改变源代码的情 ...

  6. Spring Boot实践——Spring AOP实现之动态代理

    Spring AOP 介绍 AOP的介绍可以查看 Spring Boot实践——AOP实现 与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改 ...

  7. Spring AOP概念及作用

    一:SpringAOP概念 面向切面编程(Aspect Oriented Programming)提高了另一种角度来思考程序的结构,通过预编译方式和运行期间的动态代理实现程序功能的统一维护的一种技术. ...

  8. spring aop做什么介绍

    1.AOP(Aspect Orient Programming),称为面向切面编程,它作为面向对象(OOP)的一种补充,用于处理系统中分布于各个模板的横切关注点,比如事务管理.日志.缓存等.AOP实现 ...

  9. Spring AOP详细介绍

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

随机推荐

  1. 《深入理解Java虚拟机》——Java内存区域与内存溢出异常

    程序计数器(Program Counter Register):一块较小的内存空间,可看作是当前线程所执行的字节码的行号指示器.字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令 ...

  2. 【模板小程序】求第n个质数

    #include <iostream> #include <vector> using namespace std; int nth_prime(int n) { vector ...

  3. shell编程之运算符(3)

    declare声明变量类型 declare[+/-][选项]变量名 选项: - : 给变量设定类型属性 + : 取消变量的类型属性 -a : 将变量声明为数组型 -i : 将变量声明为整数型(inte ...

  4. Git 如何 clone 非 master 分支的代码

    问题描述 我们每次使用命令 git clone git@gitlab.xxx.com:xxxxx.git 默认 clone 的是这个仓库的 master 分支.如果最新的代码不在 master 分支上 ...

  5. angularjs ng-csv 异步下载

    相信之前我们 前端下载csv的时候 都是通过后台代码 生成文件,然后发送给前台 文件路径来进行下载,下面介绍一下angular1 ng-csv下载 csv数据(这种不通过后台代码来实现的前台下载) 参 ...

  6. wampserve部署

    全名 WampServer 来自法国的软件 http://www.wampserver.com/en/ 一.下载方法: 1.一级导航点击download(发现只不过是本页的跳转,硕大的 wampser ...

  7. 微信开发系列——微信订阅号前端开发利器:WeUI

    前言:年前的两个星期,学习了下微信公众号的开发.后端基本能够基于盛派的第三方sdk能搞定大部分事宜.剩下的就是前端了,关于手机端的浏览器的兼容性,一直是博主的一块心病,因为博主一直专注于bootstr ...

  8. C/C++语言简介之语法结构

    一.顺序结构    顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行.    例如:a = 3,b = 5,现交换a,b的值,这个问题就好像交换 ...

  9. EmguCV创建/保存图片

    Image图片类 public Image(Bitmap bmp);//采用 Bitmap 图像创建. public Image(string fileName);//指定路径创建图像. public ...

  10. UVALive - 3027 Corporative Network (并查集)

    这题比较简单,注意路径压缩即可. AC代码 //#define LOCAL #include <stdio.h> #include <algorithm> using name ...