AOP术语:
连接点(JoinPoint):指的是被拦截的点,在spring中指的是方法类中的方法可以被增强,方法称之为连接点。
切入点:(PointCut):指的是我们要对那些连接点进行拦截的定义类中很多方法可以被增强,实际被增强的方法称之为切入点。
增强/通知(Advice):增强指的是拦截到PointCut点之后要做的事情称之为增强
要新增的功能称之为增强
通知分为5种:
前置通知:在方法之前执行
后置通知:在方法之后执行
最终通知:在后置通知之后执行
异常通知:在异常的情况下执行
环绕通知:在方法执行之前和之后都进行通知
切面(Aspect):是切入点和通知的结合
将增强应用到切入点的过程称之切面
Introduction(引介):引介是一种特殊的通知在不修改代码的前提下,Introduction可以在运行期为类动态的添加一些方法或FieldTraget(目标对象):代理的目标对象(要增强的类)Weaving(织入):是吧增强应用到目标的过程,把advice应用到target的过程
Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类。
**
在Spring中AOP的使用:
**
在SPring中是通过Aspectj实现的AOP功能
Aspectj不属于SPring,是一个单独的面向切面的框架
Spring是需要结合Aspectj整合完成AOP的功能
使用Aspectj来实现AOP有两种方式:
一种是通过配置的方式实现
一种是通过注解的方式实现
使用步骤:
1、引入依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
2、创建配置文件,引入AOP的约束条件
<?xml version="1.0" encoding="UTF-8"?>3、创建代增强类
public class Person {
public void add() {
//添加日志功能
System.out.println(“Person.add…”);
}
}
4、增强类
/**
- 增强类
*/
public class Log {
//前置通知
public void before(){
System.out.println(“前置通知”);
}
}
通过配置的形式实现
在配置文件中添加增强相关配置:
通过execution函数,可以定义切点的方法切入
1、切入点:实际增强的方法
2、常用的表达式
execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
(1)execution(* com.tulun.bean.Book.show(…)) 表类里面的某一个方法
(2)execution(* com.tulun.bean.Book.(…)) 表类某个包里类所有方法
(3)execution( .(…)) 表示所有
例:
-匹配所有类public方法 execution(public .(…))
-匹配指定包下所有类方法 execution(* com.tulun.bean.*(…)) (不包含子包)
- execution(* com.tulun.bean…(…)) (包含包、子包下所有类)
-匹配指定类所有方法 execution( com.tulun.bean.Book.(…))
-匹配实现特定接口所有类方法 execution( com.tulun.bean.Book+.(…))
-匹配所有com开头的方法 execution( com*(…))
增强类实现:
//前置通知
public void before(){
System.out.println(“前置通知”);
}
//环绕通知
public void around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("环绕通知前");
//指定真正执行的时机
joinPoint.proceed();
System.out.println("环绕通知后");
}