Spring cache 自定义注解过程遇到的问题

一、背景
在做公司项目的过程中,发现有很多固定的查询业务场景,直接查询会给数据库带来很大压力,对网站的访问性能影响很大,因此要加入redis的缓存服务,可业务代码繁杂,各个服务层添加各自的缓存硬代码比较容易造成问题,因此想到了自定义的缓存注解的方式,统一加入缓存。
二、实现过程遇到的问题
1、Spring AOP
在配置Spring AOP的过程中,采用Spring的版本是4.2版本,直接使用Spring的注解Aspect和Component加入项目中之后切面没有生效,排查原因是因为在xml文件中加入

    <aop:aspectj-autoproxy proxy-target-class="true"/>

2、SpelExpressionParser的使用报异常
在配置缓存的key时,需要在key上面加上#号,eg:@RedisCache(names={demo},key=#city)这样才会被正常解析
三、学习的知识点
主要分为两大类:
一是采用动态代理,对被代理对象和特定处理进行修饰和封装,得到代理对象,从使得被代理对象中不需切入任何的代码,如图:
简单的代理:实现不入侵原始对象而切入各种通用的业务逻辑
二是采用静态织入,如AspectJ,使用其特定的语法创建切面,在编译期间将切面织入代码中。
AOP使用场景
权限控制、异常处理、缓存、事务管理、日志记录、数据校验等等

AOP基本概念
切面(Aspect): 程序运行过程中的某个的步骤或者阶段
连接点(Joinpoint): 程序运行过程中可执行特定处理(增强处理)的点, 如异常处理。而在SpringAOP中,方法调用是连接点。
Advice(通知、处理、增强处理): 在符合的连接点进行的特定处理 (增强处理)
切入点(Pointcut): 可切入进行增强处理的连接点。AOP核心之一就是如何用表达式来定义符合的切入点。在Spring中,默认使用AspectJ的切入点语法。
由于Spring AOP只支持以Spring Bean的方法调用来作为连接点, 所以在这里切入点的定义包括:
切入点表达式, 来限制该能作用的范围大小,即是,能匹配哪些bean的方法
命名切入点

    @Pointcut("execution(*   com.xxx.xxx.service.*.*     (..))    ")        /*切入点*/
    public void pointcut(){                                         /*命名切入点*/
    }
    /*常见的 切入点表达式语法 如下:*/
    execution(返回值类型    方法所属类.方法名    方法形参列表    抛出的异常声明)
    例如:
    上面第一个 * 指匹配所有返回值类型
    第二个 * 指service包下的所有类
    第三个 * 指各个类中的所有方法
    (..)中的 .. 指零个或者多个(任意数量)的参数

目标对象: 被进行增强处理的对象
AOP代理: 是一个重新封装了(增强处理 + 被代理对象的方法 )方法的代理对象。
织入(Weaving): 就如它名字表述的一样,增强处理切入目标对象以后,并获得代理对象(AOP代理)的这个过程,就是织入。按其作用的时间分类为,编译时织入与运行时织入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值