1.自定义一个注解
@Target({ElementType.TYPE,ElementType.METHOD}) //注解能标在类上,也能标在方法上
@Retention(RetentionPolicy.RUNTIME) // 运行时有效
@Documented
@Inherited // 可继承,可以有子注解
public @interface CacheData {
}
2.自定义一个切面
@Component
@Aspect //表示这是一个切面
public class CacheAspect {
//@Around("execution(public *[*代表返回值类型] *[切入点所在包](..[参数个数]) )") //连接点表达式
// "@annotation(com.zzq.gmall.common.cache.CacheData)" 表明切入所有加入了此注解的
@Around("@annotation(com.zzq.gmall.common.cache.CacheData)")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
// 环绕通知返回值必须是Object,因为她可以拦截不同返回值的方法
// joinPoint 有标注了此注解的方法的所有信息
// 可以对目标方法做前置处理
Object proceed = joinPoint.proceed(); // 放行目标方法
// 可以对目标方法做后置处理
return proceed;
}
}