AOP实现Redis缓存
AOP
AOP:面向切面编程
作用:降低系统中代码的耦合性,并且在不改变原有代码的条件下对原有的方法进行功能的扩展。
(公式:AOP=切入点表达式+通知方法)
通知类型
1.前置通知(before) 目标方法执行之前执行
2.后置通知() 目标方法执行之后执行
3.异常通知() 目标方法执行过程中抛出异常时执行
4.最终通知(after) 无论什么时候都要执行的通知
特点:上述的四大通知类型 不能干预目标方法是否执行,一般用来做程序运行状态的记录监控
5.环绕通知(around) 在目标方法执行前后都要执行的通知方法,该方法可以控制目标方法是否运行joinPoint.proceed();功能作用强大。
切入点表达式
理解:就是一个程序是否进入通知的一个判断(IF)
作用:当程序运行过程中,满足了切入点表达式时才会去执行的通知方法,实现业务的扩展
种类(写法):
粗粒度(匹配原则:按类匹配)
1.bean(bean的名称/bean的id)只能拦截具体的某个bean对象 只能匹配一个对象 lg:bean(“itemServiceImpl”)
2.within(包名.类名) 可以匹配多个对象 lg:within("com.jt.service.")
3.execution(返回值类型 包名.类名.方法名(参数列表)) 最为强大的用法 lg:execution( com.jt.service….(…)) 返回值类型任意 com.jt.service包下的类的所有的方法都会被拦截
4.@annotation(包名.注解名称) 按照注解匹配
AOP入门案例
package com.jt.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.util.Arrays;
@Aspect //我是一个AOP切面类
@Component //将类交给spring容器管理
public class CacheAOP {//公式 = 切入点表达式 + 通知方法/*** 关于切入点表达式的使用说明* 粗粒度:* 1.bean(bean的Id) 一个类* 2.within(包名.类名) 多个类* 细粒度*///@Pointcut("bean(itemCatServiceImpl)")//@Pointcut("within(com.jt.service..*)") //匹配多级目录@Pointcut("execution(* com.jt.service..*.*(..))") //方法参数级别public void pointCut(){//定义切入点表达式 只为了占位}//区别: pointCut() 表示切入点表达式的引用 适用于多个通知 共用切入点的情况// @Before("bean(itemCatServiceImpl)") 适用于单个通知.不需要复用的// 定义前置通知,与切入点表达式进行绑定. 注意绑定的是方法/*** 需求:获取目标对象的相关信息.* 1.获取目标方法的路径 包名.类名.方法名* 2.获取目标方法的类型 class* 3.获取传递的参数* 4.记录当前的执行时间*/@Before("pointCut()")//@Before("bean(itemCatServiceImpl)")public void before(JoinPoint joinPoint){String className = joinPoint.getSignature().getDeclaringTypeName();String methodName = joinPoint.getSignature().
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
