AOP

1.4 AOP实现商品分类缓存

1.4.1 为什么使用AOP

问题1: 将缓存的代码直接写到业务中,只对某个业务有效,如果其他业务也需要缓存,则需要重复编辑…
问题2: 如果将缓存代码直接写死在业务层,如果后期代码需要更新时,代码的耦合性高. 不便于扩展…
解决方案: 使用AOP方式实现…

1.4.2 AOP作用

名称: 面向切面编程.
核心作用: 在不改变原有代码的条件下 对方法进行额外的功能扩展.
AOP构造要素 = 切入点表达式 + 通知方法.

1.4.3 常见切入点表达式

名称解释: 被Spring容器管理的对象称之为bean.

1). bean(“bean的Id”) 一般类名首字母小写 按照某个类匹配
2). within(“包名.类名”) 按照指定的类目录(多个类) 上述2个操作粒度较粗 按类匹配
3). execution(返回值类型 包名.类名.方法名(参数列表…)) 控制方法参数级别 粒度较细
4). annotation(“包名.注解名”) 按照特定的注解进行拦截. 主流语法

1.4.4 通知方法

  1. before 目标方法执行前执行

  2. afterReturnoing 目标方法执行之后执行

  3. afterThrowing 目标方法抛出异常时执行

  4. after 程序最后执行
    上述四大通知类型 一般用来记录程序的执行的状态, 为监控系统提供数据的支持的 . 只能监控不能处理.

  5. around 目标方法执行前后都要执行
    环绕通知是5大通知中功能最为强大的. 可以控制目标方法是否执行.(控制业务是否操作).

1.4.5 AOP入门案例

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("我是前置通知!!!");
    }
}
posted @ 2021-01-26 18:49  Liang-shi  阅读(43)  评论(0编辑  收藏  举报