问题1: 将缓存的代码直接写到业务中,只对某个业务有效,如果其他业务也需要缓存,则需要重复编辑…
问题2: 如果将缓存代码直接写死在业务层,如果后期代码需要更新时,代码的耦合性高. 不便于扩展…
解决方案: 使用AOP方式实现…
名称: 面向切面编程.
核心作用: 在不改变原有代码的条件下 对方法进行额外的功能扩展.
AOP构造要素 = 切入点表达式 + 通知方法.
名称解释: 被Spring容器管理的对象称之为bean.
1). bean(“bean的Id”) 一般类名首字母小写 按照某个类匹配
2). within(“包名.类名”) 按照指定的类目录(多个类) 上述2个操作粒度较粗 按类匹配
3). execution(返回值类型 包名.类名.方法名(参数列表…)) 控制方法参数级别 粒度较细
4). annotation(“包名.注解名”) 按照特定的注解进行拦截. 主流语法
before 目标方法执行前执行
afterReturnoing 目标方法执行之后执行
afterThrowing 目标方法抛出异常时执行
after 程序最后执行
上述四大通知类型 一般用来记录程序的执行的状态, 为监控系统提供数据的支持的 . 只能监控不能处理.
around 目标方法执行前后都要执行
环绕通知是5大通知中功能最为强大的. 可以控制目标方法是否执行.(控制业务是否操作).
j
@Component //交给Spring容器管理
@Aspect //标识AOP切面类
public class RedisAOP {
//1.定义切入点表达式
@Pointcut("bean(itemCatServiceImpl)")
public void pointCut(){
}
//joinPoint连接点???????
@Before("pointCut()")
public void before(JoinPoint joinPoint){
Class targetClass = joinPoint.getTarget().getClass();
Object[] args = joinPoint.getArgs();
String methodName = joinPoint.getSignature().getName();
String ClassName = joinPoint.getSignature().getDeclaringTypeName();
System.out.println("获取目标对象的类型:"+targetClass);
System.out.println("获取目标参数:"+ Arrays.toString(args));
System.out.println("获取目标方法名称:"+ methodName);
System.out.println("获取目标类的路径:"+ ClassName);
System.out.println("我是前置通知!!!");
}
}
原文:https://www.cnblogs.com/liang-shi/p/14331935.html