AOP:Aspect Oriented Programming (面向切面编程,面向方面编程),其实就是面向特定方法编程
应用场景:
⚪ 案例部分功能运行较慢,定位执行耗时较长的业务方法。例如此时需要统计每一个业务方法的执行耗时。
实现:动态代理是面向切面编程最主流的实现。而SpringAOP是Spring框架的高级技术,旨在管理bean对象的过程中,主要通过底层的动态代理机制,对特定的方法进行编程。
快速入门
1.导入依赖
2.编写AOP程序:针对特定方法根据业务逻辑进行编程
@Component 将该类交给容器管理
@Aspect 标识当前类不是普通类,是AOP类
@Around("execution(* com.itheima.service..(…)) 表示 com.itheima.service包下 ,后面第一个* 表示类名 第二个*表示方法名。即针对com.itheima.service包下所有的接口或类中所有的方法进行编程。
AOP核心概念
连接点:JoinPoint,可以被AOP控制的方法(暗含方法执行是的相关信息)
通知:Advice,指那些重复的逻辑,即反复使用的共性功能(例如统计每个方法执行的时间)。
切入点:PointCut,匹配连接点的条件,通知仅会在切入点方法执行时被应用。(简单理解:就是可以对哪些方法进行AOP切面编程, 例如:@Around("execution(* com.itheima.service..(…)) ,即针对com.itheima.service包下所有的接口或类中所有的方法进行编程)
目标对象:Target,通知所有应用的对象
AOP进阶
通知类型
1.@Around 此注解的通知方法在目标方法前、后都被执行
2.@Before 此注解的通知方法在目标方法 前 都被执行
3.@After 此注解的通知方法在目标方法 后 都被执行,无论是否有异常都会执行
4.@AfterReturning 此注解的通知方法在目标方法 后 都被执行,有异常不会执行
5.@AfterThrowing 此注解的通知方法发生异常后被执行
@PointCut:该注解的作用是将公共的切点表达式抽取出来,需要用到时引用该切点表达式即可。
切入点表达式
@annotation切入点表达式,用于匹配标识有 特定注解 的方法
获取连接点相关信息
切入点表达式—@annotation
@annotation切入点表达式,用于匹配标识有特定注解的方法
例子:
@annotation(com.itheima.anno.Log)
@Before("@annotation(com.itheima.anno.Log)")
public void before(){Log.info("before");}
步骤
1.自定义注解
@Retention(RetentionPolicy.RUNTIME) //表示该注解运行时生效
@Target(ElementType.METHOD) // 表示该注解可以生效的位置,方法处
public @interface MyLog{}
2.在方法上加入注解
@MyLog
@Override
public List<Dept> list(){
List<Dept> deptList = deptList.list();
return deptList;
}
3.切入点表达式
@Before("@annotation(com.itheima.aop.MyLog)") //表示要匹配方法上加了MyLog注解的方法
public void before(){log.info("---");}