spring下缓存注解和异步任务注解

本文详细介绍了Spring中用于缓存的@Cacheable、@CachePut、@CacheEvict注解的使用,以及如何配置和使用异步任务注解@Async。在缓存注解部分,讨论了各个注解的特性,如key、value、unless和condition属性。在异步任务部分,阐述了配置线程池和调用异步方法的步骤。同时,文章提醒读者注解在同一个类内的相互调用可能无法正常工作,因为Spring会生成代理类导致注解功能失效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、缓存注解


目前在研究redis缓存,之前人员定位组件项目中,引入redis服务,主要应用了其操作缓存的工具,主要通过redisTemplate和jedis两种方式来操作。而后来在搭建springboot框架(spring中也可实现)时,发现了注解的方式,可以直接通过注解方式,对操作数据库的方法内容进行缓存。
缓存注解主要有@Cacheable、@CachePut、@CacheEvict三种。
@Cacheable 在内部方法执行前操作缓存—–用于查询。若发现缓存中已经有该内容,就不在执行内部方法,直接返回缓存数据。
@CacheEvict 可以设置是否在方法执行前操作缓存,通过参数 beforeInvocation 设置true为方法前操作缓存,false则方法执行后操作缓存—-用于删除。
@CachePut 在内部方法执行后,再操作缓存—–用于增加、更新。注意方法必须有返回值,通过返回值来存缓存。
具体实现如下截图:

  • Cacheable
    这里写图片描述

    • CacheEvict
      这里写图片描述
      allEntries = true 清空所有缓存数据 默认为false
      beforeInvocation = true 内部方法执行前,操作缓存, 默认为false

    • CachePut
      这里写图片描述

在上述三种注解后面括号里可以有以下多种属性:
1) key(缓存键值),若省略则按照配置里面的keyGenerator方式生成key(可自定义).
这里写图片描述
上图代码是在缓存redis的配置文件类里面实现的,通过继承CachingConfigurerSupport类,覆盖该方法。默认是以类名.方法名.参数变量名作为缓存的key,上面稍作修改。
2)value(缓存名称) 不定义,已在类级别上全局声明 @CacheConfig(cacheNames = “AudioFile”)
3)unless 当条件不满足时,才会操作缓存,解决查出空值存入缓存,第二次就不会再去读数据库的问题。保证值为空时,从数据库查询。
4)condition 在执行内部方法前,判断参数是否符合条件,符合则先查询缓存,无则执行方法;不符合,则直接执行方法。

综上,在配置完所有注解之后,还需要开启缓存功能,通过@EnableCaching注解,springboot下直接放在启动类前面。

二、异步任务注解

通过注解实现线程池的配置,首先需要添加一个配置类实现AsynConfigurer接口,然后实现getAsyncExecutor方法。在使用的地方,方法上加@Async注解,即可实现方法的异步调用。
主要配置步骤如下:

  • application.properties文件中
    这里写图片描述

    • 异步任务配置类实现
      这里写图片描述

    • 异步方法的实现
      这里写图片描述

    • 方法的异步调用
      这里写图片描述

    三、注意事项

    以上注解都是spring封装的,在注入容器的类上注释,并在控制层调用,能够实现,若在同一个类中注解并调用,不可实现。
    原因:https://blog.youkuaiyun.com/clementad/article/details/47339519
    大体意思:
    Spring在扫描bean时,若方法中有带注解(@Transactional,@Async等)的,会为这些bean动态生成一个代理类。当带注解方法被调用时,实际已经调到代理类的对应方法上执行,但是若调用者本身也在该bean中,代理类对应方法里得执行代码会指向原来的bean方法,因而不会去执行注解所具备的功能。
    例子如下,对于开启事务的注解@Transactional
    这里写图片描述
    A类中两个方法,a方法调用b方法,实际是在代理类proxy$A中执行a方法,然后可以发现,其实质还是在执行标记1处的方法,并没有执行代理类b地方,没有开启事务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值