A O P
Aspect Oriented Programming(面向切面编程、面向方面编程)
Spring AOP
在 pom.xml 文件中导入 AOP 的依赖,编写AOP程序.
Spring的AOP底层是基于动态代理技术来实现的,也就是说在程序运行的时候,会自动的基于动态代理技术为目标对象生成一个对应的代理对象。在代理对象当中就会对目标对象当中的原始方法进行功能的增强。
在前端发起请求时,spring注入的也是这个代理对象
连接点:JoinPoint,可以被AOP控制的方法
通知:Advice,指哪些重复的逻辑,也就是共性功能
切入点:PointCut,匹配连接点的条件,通知仅会在切入点方法执行时被应用。
切入点表达式
execution
annotation
编写自定义注解后
再在要作为连接点的方法上添加自定义注解
抽取
解决切入点表达式重复的问题。
需要在AOP切面类中定义一个pt方法,在上面加上PointCut注解,在该注解中定义公共的切入点表达式,在其他地方如果要使用这个切入点表达式,就可以通过方法名的方式引入切入点表达式。
@Slf4j
@Component
@Aspect
public class MyAspect1 {//切入点方法(公共的切入点表达式)@Pointcut("execution(* com.itheima.service.*.*(..))")private void pt(){}//前置通知(引用切入点)@Before("pt()")public void before(JoinPoint joinPoint){log.info("before ...");}//环绕通知@Around("pt()")public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {log.info("around before ...");//调用目标对象的原始方法执行Object result = proceedingJoinPoint.proceed();//原始方法在执行时:发生异常//后续代码不在执行log.info("around after ...");return result;}//后置通知@After("pt()")public void after(JoinPoint joinPoint){log.info("after ...");}//返回后通知(程序在正常执行的情况下,会执行的后置通知)@AfterReturning("pt()")public void afterReturning(JoinPoint joinPoint){log.info("afterReturning ...");}//异常通知(程序在出现异常的情况下,执行的后置通知)@AfterThrowing("pt()")public void afterThrowing(JoinPoint joinPoint){log.info("afterThrowing ...");}
}
引入其他类中的切入点表达式的时候,一注意写全所带的包,类,二是注意切入点表达式的方法要用public修饰,如上图
个人理解 ,上面这么写的原因有,注解的本质就是接口的关系
切面:Aspect,描述通知与切入点的对应关系(通知+切入点)
而切面所在的类,称之为切面类(被@Aspect注解标识的类)。