湖南
AOP
操作术语
- 连接点
类里面哪些方法可以被增强,这些方法称为连接点 - 切入点
实际被真正增强的方法,称为切入点 - 通知(增强)
(1)实际增强的逻辑部分称为通知(增强)
(2)通知有多种类型
前置通知
后置通知
环绕通知
异常通知
最终通知 - 切面
把通知应用到切入点的过程(是动作)
AOP操作(准备)
- Spring框架一般都是基于AspectJ来实现AOP操作
什么是AspectJ?
AspectJ不是Spring组成部分,它是独立的AOP框架,一般把AspectJ和Spring框架一起使用,进行AOP操作 - 基于AsprctJ实现AOP操作
(1)基于XML配置文件
(2)基于注解方式实现(使用) - 在项目工程里面引入AOP相关依赖
- 切入点表达式
(1)切入点表达式作用,知道对哪个类里面的哪个方法进行增强
(2)语法结构:
execution([权限修饰符][返回类型][类全路径][方法名称][参数列表])
举例1:对com.jt.dao.BookDao类里面的add进行增强
execution(*com.jt.dao.BookDao.add(..))
举例2:对com.jt.dao.BookDao类里面的所有进行增强
execution(com.jt.dao.BookDao.(..))
举例3:对com.jt.dao包里面的所有类,类里面所有方法进行增强
execution(com.jt.dao..*(..))
AOP操作(AspectJ注解)
- 创建类,在类里面定义方法
- 创建增强类(编写增强逻辑)
(1)在增强类里面,创建方法,让不同方法代表不同通知类型
- 进行通知的配置
(1)在spring的配置文件中,开启注解扫描
(2)使用注解创建User和UserProxy对象
(3)在增强类上面添加注解@Aspect
(4)在spring配置文件中开启生成代理对象
- 配置不同类型的通知
(1)在增强类的里面,在作为通知方法上面添加通知类型注解,使用切入点表达式配置
- 测试
输出结果
- 几种不同的类型通知
package com.jt.demo4.aopanno;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
//增强的类
@Component
@Aspect//生成代理对象
public class UserProxy {
//前置通知
//@Before注解表示作为前置通知
@Before("execution(* com.jt.demo4.aopanno.User.add(..))")
public void before(){
System.out.println("before....");
}
@AfterReturning("execution(* com.jt.demo4.aopanno.User.add(..))")
public void afterReturning(){
System.out.println("afterReturning....");
}
@After("execution(* com.jt.demo4.aopanno.User.add(..))")
public void after(){
System.out.println("after....");
}
@AfterThrowing("execution(* com.jt.demo4.aopanno.User.add(..))")
public void afterThrowing(){
System.out.println("afterThrowing....");
}
//环绕通知(会在方法之前和方法之后都执行)
@Around("execution(* com.jt.demo4.aopanno.User.add(..))")
public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("环绕之前....");
//被增强的方法执行
proceedingJoinPoint.proceed();
System.out.println("环绕之后....");
}
}
输出结果
- 相同的切入点抽取
- 有多个增强类对同一个方法进行增强,可以设置增强类的优先级
(1)在增强类的上面添加注解@Order(int值),数字类型值越小优先级越高