##1.AOP的概念

AOP是指面向切面编程,使用它能够让程序在运行期间,且不改变代码的前提下,对已有方法进行增强。 它的作用有如下:

  • 减少重复代码
  • 提高开发效率
  • 维护方便

2.AOP相关术语

  • JointPoint(连接点):指那些被拦截到的方法,比如说在动态代理中业务层的那些方法。Spring只支持对方法进行增强。
  • PointCut(切入点):就是指我们要对哪些JointPoint进行拦截的定义,也就是那些实实在在被增强的方法

是切入点的方法一定是连接点,但连接点不一定是切入点。

  • Advice(通知):拦截到JointPoint之后要做的事情就是通知,也就是增强切入点方法的那些代码。通知分为以下几种类型:

    • 前置通知:在被增强方法前执行的代码
    • 后置通知:在被增强方法后执行的代码
    • 异常通知:在catch里面的代码
    • 最终通知:在finally里面的代码
    • 环绕通知:在前面的例子中,整个invoke方法就是环绕通知,它里面有明确的切入点方法调用
  • Introduction(引介)

  • Target:代理的目标对象,被代理对象,前面例子中的AccountService就是被代理对象

  • Weaving(织入):把增强应用到目标对象,来创建新的代理对象的过程。前面例子中用Proxy创建对象的过程。

  • Proxy(代理):代理对象,使用Proxy创建的新的对象,包含原有对象的所有功能,并且是增强后的功能。

  • Aspect(切面):是切入点(哪些方法被增强过)和通知(提供了公共代码的类)的结合

3.切入点表达式

切入点表达式的目的是选择出我们要增强哪些函数,也就是选择切入点,在下面一节的案例中会用到。

  • 首先要明确切入点表达式的格式:execution(表达式)
  • 模板是这样的:
访问修饰符  返回值  包名.包名.包名....类名.方法名(参数列表)
  • 标准写法:
public void com.eastnotes.service.AccountServiceImpl.saveAccount()
  • 省略掉访问修饰符:
void com.eastnotes.service.AccountServiceImpl.saveAccount()
  • 返回值用通配符*表示任意值:
* com.eastnotes.service.AccountServiceImpl.saveAccount()
  • 包名可以使用通配符表示任意包,但是有几级包,就需要写几个*.
* *.*.*.AccountServiceImpl.saveAccount()
  • 可以使用..表示当前包及其子包
* *..AccountServiceImpl.saveAccount()
  • 类名和方法名都可以使用*来实现统配
* *..*.*()
  • 全部用通配符来写:
* *..*.*(..)

对于参数来说,我们可以直接写参数类型:

  • 基本数据类型写名称:如int
  • 引用数据类型写包名.类名:如java.lang.String

也可以使用通配符来表示:

  • (*) : 表示任意类型,前提是必须要有参数
  • (..):表示任意类型,可以没有参数

在实际开发中,我们更常用的切入点表达式如下,指定具体的包,中的任意类及任意方法:

* com.eastnotes.service.*.*(..)

补充:我们在pom.xml中导入的aspectjweaver就是用来解析切入点表达式的