SpringBoot七
注解开发
注解提供了更声明式和方便的方式,而编码方式允许更精细的控制和定制。
在Java中,当Redis充当缓存时,使用注解的方式更为常见和方便。Spring Framework提供了一种基于注解的缓存机制,称为Spring Cache。通过在方法上添加注解,开发人员可以指定缓存的行为,例如缓存的名称、缓存的过期时间等。使用注解的方式,开发人员可以在代码中更直观地定义缓存逻辑,而无需手动编写缓存代码。
Spring Cache提供了多个注解,最常用的是@Cacheable、@CachePut和@CacheEvict 。
@Cacheable 用于标记方法应该被缓存
@CachePut 用于将方法的结果存储到缓存中
@CacheEvict 用于从缓存中删除数据
1、添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2、添加配置 application.properties spring.redis.host=localhost spring.redis.port=6379 spring.cache.type=redis 3、定义配置类 @EnableCaching @SpringBootConfiguration public class MyRedisConfig { @Bean public RedisCacheManager redisCacheManager(RedisConnectionFactory factory) { GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(100)) .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(st ringRedisSerializer)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer( genericJackson2JsonRedisSerializer)); return RedisCacheManager.builder(factory) .cacheDefaults(config).build(); } } 4、在方法上添加对应的注解,就可以达到缓存的目的 注解Cacheable @Cacheable注解主要针对方法配置,能够根据方法的请求参数和运行结果进行缓存,比如如果缓存中 存在该值,则使用缓存数据, 如果不在缓存中,则执行业务逻辑处理,并将执行结果存入缓存 value/cacheNames:指定缓存空间的名称,比配属性。可二选一使用。 key:指定缓存中数据的key,默认使用方法参数值,也可使用SpEL表达式 keyGenerator:指定缓存数据的key的生成器,与key属性二选一使用 cacheManager:指定缓存的管理器 cacheResolver:指定缓存的解析器,与cacheManager属性二选一使用 condition:指定在符合某种条件下,进行数据缓存,不符合条件则不执行存储 unless:指定在符合某种条件下不进行数据缓存 sync:指定是否使用异步缓存,默认为false。 如果方法的返回值为空时不执行缓存,则可以引入condition和unless设置缓存规则 @Cacheable(value = "users",key = "#id",condition = "#result!=null") ,这里出现问题,解决方案使用 @Cacheable(value = "users",key = "#id",unless="#result == null") condition对入参进行判断,符合条件的放入缓存,不符合的不缓存,condition能使用的只有 #root和参数,不能使用返回结果 unless是对出参进行判断,符合条件的不缓存,不符合的放入缓存,而unless是可以使用#result的 注解EnableCaching @EnableCaching主要用于开启基于注解的缓存支持,用在应用主类或者配置类上 @Service public class UserServImpl implements IUserServ{ @Cacheable(value = "users",key = "#id") 设置所使用的key值为users::传入的参数id值 public User load(Long id) { System.out.println("执行业务逻辑"); User user=new User(); user.setId(99L); user.setUsername("zhangsan"); user.setPassword("123456"); return user; } }
注解Cacheable
@Cacheable注解主要针对方法配置,能够根据方法的请求参数和运行结果进行缓存,比如如果缓存中存在该值,则使用缓存数据, 如果不在缓存中,则执行业务逻辑处理,并将执行结果存入缓存value/cacheNames:指定缓存空间的名称,比配属性。可二选一使用。
key:指定缓存中数据的key,默认使用方法参数值,也可使用SpEL表达式
keyGenerator:指定缓存数据的key的生成器,与key属性二选一使用
cacheManager:指定缓存的管理器
cacheResolver:指定缓存的解析器,与cacheManager属性二选一使用
condition:指定在符合某种条件下,进行数据缓存,不符合条件则不执行存储
unless:指定在符合某种条件下不进行数据缓存
sync:指定是否使用异步缓存,默认为false。
@CacheAable(value="dep",key="#department.id") //缓存所使用的key值由value和key共同组 成,值为dept::再加上参数department对象中的id参数值 public Department listDepartment(Department department){ System.out.println("加载信息:"+department); departmentDao.loadDepartment(department); return department; }
如果方法的返回值为空时不执行缓存,则可以引入condition和unless设置缓存规则 @Cacheable(value= "users",key = "#id",condition = "#result!=null") ,这里出现问题,解决方案使用
@Cacheable(value = "users",key = "#id",unless="#result == null")
condition对入参进行判断,符合条件的放入缓存,不符合的不缓存,condition能使用的只有#root和参数,不能使用返回结果
unless是对出参进行判断,符合条件的不缓存,不符合的放入缓存,而unless是可以使用#result的
注解EnableCaching
@EnableCaching主要用于开启基于注解的缓存支持,用在应用主类或者配置类上
@EnableCaching @SpringBootConfiguration public class MyRedisConfig {
注解CacheConfig
@CacheConfig注解是加在类上,用于抽取缓存的公共配置。
在类头上加了@CacheConfig注解等同于每个方法上的缓存注解都加了cacheName或者value指定的组件,并且这个组件来自@CacheConfig,也就是用于统筹管理类中所有使用@Cacheable、@CachePut…和@CacheEvict 注解标注方法中的公共属性,这些公共属性包括有cacheNames、keyGenerator 、cacheManager和cacheResolver
@CacheConfig(cacheNames = "users") 等价于在每个缓存注解上添加了value="users" @Service public class UserServImpl implements IUserServ{ @Cacheable(value="bbb",key = "#id",unless="#result == null") 在类上有定义,同时 在方法上也有定义,则局部优先 public User load(Long id) {
注解CachePut
@CachePut该注解用于设置缓存。表示在调用方法的同时又更新缓存,它是默认先调用目标方法,然后将目标方法的运行结果存入缓存,不过需要注意的是如果要保持缓存同步更新,这个注解使用的key需要和缓存的key保持一致。
和@cacheable不同的是:
@Cacheable在运行在目标方法之前,而它是目标方法之后,因为它需要先拿到目标方法运行的结果
@Cacheable不可以使用#result,因为使用@Cacheable标注的方法不一定会被调用,可能获取不到result。
属性和@cacheable基本一致,就少了一个是否异步(sync)的属性
注解CacheEvict
@CacheEvict 该注解用于清理缓存。先进行方法调用,然后将缓存进行清除。例如
@CacheEvict(value=”users”,key=”#user.getName()”),其中的 Key 是用来指定缓存的 key 的allEntries属性: 表示是否清除指定缓存中的所有键值对,既是否清除所有缓存,设置为true时会清除缓存中的所有键值对,默认为false,即根据key清除缓存。所以它与key属性二选一使用beforeInvocation属性: 表示是否是在@CacheEvict注解的方法调用之前清除指定缓存,默认为false,即在方法调用之后清除缓存,设置为true时则会在方法调用之前清除缓存。在方法调用之前还是之后清除缓存的区别在于方法调用时是否会出现异常,若不出现异常,这两种设置没有区别,若出现异常,设置为在方法调用之后清除缓存将不起作用,因为方法调用失败了。
注解Caching
@Caching该注解可以对缓存清理、设置 操作打包。用于针对复杂规则的数据缓存管理,可以作用于类或方法,在@Caching注解内部包含有Cacheable、put和evict三个属性,分别对应于@Cacheable、
@CachePut和@CacheEvict三个注解
@Caching( cacheable={@Cacheable(cacheNames ="comment",key = "#id")}, put = {@CachePut(cacheNames = "comment",key.= "#result.author")} ) public Comment getcoiment(int id){ return commentRepository.findByld(id).get(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)