Spring 第四章 面向切面的Spring
概念
AOP概念
-
通知
需要通过AOP添加的功能称为通知。 -
连接点
AOP可以应用到任意方法上,所以项目中所有的方法都可以作为连接点使用。 -
切点
通知可以应用到所有连接点,也可以通过匹配规则应用到部分连接点。经过筛选的连接点结果集称为切点。 -
切面
切面是通知和切点的结合。通知和切点共同定义了切面的全部内容——它是什么,在何时,在何处完成其功能。*通知包含了需要用于多个应用对象的横切行为,连接点是程序执行过程中能够应用通知的所有点,切点定义了通知被应用的具体位置(切点定义了那些连接点会得到通知)。*
AOP的两种实现方式
- 注解形式
优点:配置少
缺点:需要源代码,不能对jar中的类进行修改。 - XML配置形式
优点:不需要源代码,可以对jar中的类进行修改。
缺点:配置多
AOP的两种实现形式
- 引入
引入允许我们向现有的类添加新方法或属性 - 织入
织入是把切面应用到目标对象并创建新的代理对象的过程,织入点如下: -
- 编译器:切面在目标类编译时被织入。
-
- 类加载器:切面在目标类加载到JVM时被织入。
-
- 运行期:切面在应用运行的某个时刻被织入。
Spring对AOP的支持
- 基于代理的经典Spring AOP;(过时)
- 纯POJO切面
- @AspectJ注解驱动的切面;
- 注入式AspctJ切面;
关键知识点
- Spring通知是Java编写的
- Spring在运行时通知对象
- Spring只支持方法级别的连接点
织入式AOP
织入是把切面应用到目标对象并创建新的代理对象的过程。
通知的类型
- 前置通知:在目标方法执行前调用通知功能;
- 后置通知:在目标方法执行后调用通知功能;
- 返回通知:在目标方法成功执行后调用通知功能;
- 异常通知:在目标方法发生异常后调用通知功能;
- 环绕通知:在目标方法调用之前和调用之后执行通知功能;
注解 | 通知 |
---|---|
@After | 通知方法会在目标方法返回或者抛出异常后调用 |
@AfterReutrning | 通知方法会在目标方法返回后调用 |
@AfterThrowing | 通知方法会在目标方法抛出异常后调用 |
@Around | 环绕通知 通知方法会将目标方法封装起来 |
@Before | 通知方法会在目标方法调用之前执行 |
切点
切点类型
在Spring AOP中,要使用AspectJ的切点表达式语言来定义切点。
Spring借助的(支持的)AspectJ的切点表达式语言来定义Spring切面
AspectJ指示器 | 描述 |
---|---|
arg() | 限制连接点匹配参数为指定类型的执行方法 |
@args() | 限制连接点匹配参数由指定注解标注的执行方法 |
execution() | 用于匹配是连接点的执行方法 |
this() | 限制连接点匹配AOP代理的bean引用为指定类型的类 |
target | 限制连接点匹配目标对象为指定类型的类 |
@target() | 限制连接点匹配特定的执行对象,这些对象对应的类要具有指定类型的注解 |
within() | 限制连接点匹配指定的类型 |
@within() | 限制连接点匹配指定注解所标注的类型(当使用spring aop时,方法定义在由指定的注解所标注的类里) |
@annotation | 限定匹配带有指定注解的连接点 |
bean() | 允许我们在切点表达式中使用bean的ID来标识bean |
切点表达式
切点逻辑关系
多个表达式之间使用 and(&&) 、or(||)、not(!)操作符编写关系复杂的表达式
代码实例
引入式AOP
表达式
@DeclareParents( value=“cn.com.chujie.spring.springaop.performance+” , defaultImpl = cn.com.chujie.spring.springaop.DefaultEncoreable.class )
public static Encoreable encoreable;
- value 属性用于制定切点匹配规则,+号表示子类而不是本身。
- defaultImpl 属性用于指定引入功能的实现类
- @DeclareParents注解所标注的静态属性指明要引入的接口。