AOP:把程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强
Spring中的AOP:
AOP相关术语:1、JoinPoint:连接点
可以被增强的方法都可以称为连接点
2、PointCut:切入点
对某个方法进行增强,那么该方法就是切入点
3、Advice:通知 / 增强
对某个方法进行事务的增强,那么事务的开启、提交和回滚就是通知
4、Introduction:引介
5、Weaving:织入
将通知应用到连接点,使其变成切入点的这个过程
6、Target:目标类
被增强的方法所在的类就是目标类
7、Proxy:代理类
8、Aspect:切面
多个切入点和通知的组合
AOP依赖导入:
<dependency><groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
AOP常用标签:
<aop:config>用于声明开始aop的配置
<aop:aspect>
用于配置切面
id:切面的唯一标识
ref:引用配置好的切面类bean的id
<aop:pointcut>
用于配置切入点表达式
expression:定义切入点表达式
id:这个定义好的表达式的唯一标识
<aop:before>
配置前置通知
method:通知方法即增强的方法
pointcut:定义切入点表达式
pointcut-ref:引用定义好的切入点表达式
<aop:arter-returning>
后置通知
<aop:after>
最终通知
<aop:after-throwing>
异常通知
<aop:around>
环绕通知
定义切入点表达式:execution
表达式语法:execution([修饰符] 返回值类型 包名.类名.方法名(参数))通常情况下,我们都是对业务层的方法进行增强,所以切入点表达式都是切到业务层实现类。
execution(* cn.itcast.service.impl.*.*(..))
环绕通知:
当环绕通知执行时,spring框架会为我们注入该接口的实现类。(ProceedingJoinPoint接口)* 它有一个方法proceed(),就相当于invoke,执行目标方法
public Object around(ProceedingJoinPoint pjp){
try {
System.out.println("前置通知");
Object obj = pjp.proceed();
System.out.println("后置通知");
return obj;
} catch (Throwable e) {
System.out.println("异常通知");
throw new RuntimeException(e);
}finally{
System.out.println("最终通知");
}
}