Spring中@Cacheable注解的使用详解

 更新时间:2023年11月08日 09:11:48   作者:你就像甜甜的益达  
这篇文章主要介绍了Spring中@Cacheable注解的使用详解,Spring框架提供了@Cacheable注解来轻松地将方法结果缓存起来,以便在后续调用中快速访问,本文将详细介绍@Cacheable注解的使用方法,并从源码级别解析其实现原理,需要的朋友可以参考下

@Cacheable注解

在现代的应用程序中,缓存是提高性能和可扩展性的重要组成部分。

Spring框架提供了@Cacheable注解来轻松地将方法结果缓存起来,以便在后续调用中快速访问。本文将详细介绍@Cacheable注解的使用方法,并从源码级别解析其实现原理。

@Cacheable注解的使用方法

@Cacheable注解可用于Spring管理的bean中的任何方法上。它可以被用来缓存方法返回的结果。当使用@Cacheable注解时,Spring会在调用方法前检查缓存中是否已经存在该方法的结果,如果存在,则直接返回缓存中的结果,而不会执行方法体中的代码。如果缓存中不存在该方法的结果,则会执行方法体中的代码,并将结果存储到缓存中,以便下次调用该方法时可以直接返回缓存中的结果。

下面是@Cacheable注解的使用示例:

@Cacheable(value="users", key="#userId")
public User getUserById(String userId) {
    // 查询数据库获取用户信息
}

上面的示例中,@Cacheable注解被用于getUserById方法上。其中value属性指定了缓存的名称为“users”,key属性指定了缓存的键为传入的userId参数。当调用getUserById方法时,Spring会先检查名为“users”的缓存中是否已经存在键为userId的结果,如果存在,则直接返回缓存中的结果,否则执行方法体中的代码,并将结果存储到缓存中。

@Cacheable注解还可以使用SpEL表达式来动态地计算缓存的键。例如:

@Cacheable(value="users", key="#user.id")
public User getUserById(User user) {
    // 查询数据库获取用户信息
}

上面的示例中,key属性使用了SpEL表达式“#user.id”,表示缓存的键为传入参数user对象的id属性值。

@Cacheable注解还支持多个键值对作为缓存的键。例如:

@Cacheable(value="users", key="#userId + '_' + #type")
public User getUserByIdAndType(String userId, String type) {
    // 查询数据库获取用户信息
}

上面的示例中,key属性使用了两个参数作为键值对,分别是userId和type。

@Cacheable注解还支持condition属性来指定是否进行缓存。例如:

@Cacheable(value="users", key="#userId", condition="#userId.length() < 10")
public User getUserById(String userId) {
    // 查询数据库获取用户信息
}

上面的示例中,condition属性使用了SpEL表达式“#userId.length() < 10”,表示只有当传入参数userId的长度小于10时才进行缓存。

@Cacheable注解还支持unless属性来指定不进行缓存的条件。例如:

@Cacheable(value="users", key="#userId", unless="#result == null")
public User getUserById(String userId) {
    // 查询数据库获取用户信息
}

上面的示例中,unless属性使用了SpEL表达式“#result == null”,表示只有当方法返回值不为null时才进行缓存。

@Cacheable注解源码分析

@Cacheable注解是Spring框架中org.springframework.cache.annotation包下的一个注解。它实际上是一个组合注解,包含了@CachePut、@CacheEvict和@Caching三个注解。

当使用@Cacheable注解时,Spring会在运行时动态地生成一个代理对象来拦截目标方法的调用。代理对象会首先检查缓存中是否已经存在该方法的结果,如果存在,则直接返回缓存中的结果,否则执行目标方法,并将结果存储到缓存中。

下面是@Cacheable注解的源码:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Caching(cacheable = @Cacheable)
public @interface Cacheable {
    Class<?>[] value() default {};
    String[] cacheNames() default {};
    String key() default "";
    String keyGenerator() default "";
    String cacheManager() default "";
    String cacheResolver() default "";
    String condition() default "";
    String unless() default "";
    boolean sync() default false;
}

从源码可以看出,@Cacheable注解包含了value、cacheNames、key、keyGenerator、cacheManager、cacheResolver、condition、unless和sync等属性。

value和cacheNames属性用于指定缓存名称。

key和keyGenerator属性用于指定缓存键。

cacheManager和cacheResolver属性用于指定缓存管理器和缓存解析器。

condition和unless属性用于指定是否进行缓存。

sync属性用于指定是否启用同步模式。

总结

本文详细介绍了@Cacheable注解的使用方法,并从源码级别解析了其实现原理。

使用@Cacheable注解可以轻松地将方法结果缓存起来,以提高应用程序的性能和可扩展性。

在实际应用开发中,我们可以根据具体需求灵活地配置@Cacheable注解的各种属性来达到最佳效果。

到此这篇关于Spring中@Cacheable注解的使用详解的文章就介绍到这了,更多相关@Cacheable注解的使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中5种输出换行方式小结

    Java中5种输出换行方式小结

    在Java中,输出换行符是一项非常基本的操作,它在控制台中输出文本时非常常见,本文主要介绍了Java中5种输出换行方式小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • SpringBoot之@Controller和@RequestMapping的实现原理解读

    SpringBoot之@Controller和@RequestMapping的实现原理解读

    这篇文章主要介绍了SpringBoot之@Controller和@RequestMapping的实现原理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Spring之关于PropertyDescriptor的扩展剖析

    Spring之关于PropertyDescriptor的扩展剖析

    这篇文章主要介绍了Spring之关于PropertyDescriptor的扩展剖析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Spring中的接口重试机制spring-retry之listeners参数解析

    Spring中的接口重试机制spring-retry之listeners参数解析

    这篇文章主要介绍了Spring中的接口重试机制spring-retry之listeners参数解析,注解@Retryable有一个参数listeners没有说明,那么本篇文章我们详细介绍一个这个参数的用,需要的朋友可以参考下
    2024-01-01
  • 手把手教你如何利用SpringBoot实现审核功能

    手把手教你如何利用SpringBoot实现审核功能

    审核功能经过几个小时的奋战终于完成了,现在我就与广大网友分享我的成果,这篇文章主要给大家介绍了关于如何利用SpringBoot实现审核功能的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Java实现幂等性校验的示例代码

    Java实现幂等性校验的示例代码

    我们在做web应用的时候通常会遇到前端提交按钮重复点击的场景,在某些新增操作上就需要做幂等性限制来保证数据的可靠性,所以本文主要介绍了如何使用java aop实现幂等性校验,需要的可以参考下
    2024-02-02
  • JAVA 多态操作----父类与子类转换问题实例分析

    JAVA 多态操作----父类与子类转换问题实例分析

    这篇文章主要介绍了JAVA 多态操作----父类与子类转换问题,结合实例形式分析了JAVA 多态操作中父类与子类转换问题相关原理、操作技巧与注意事项,需要的朋友可以参考下
    2020-05-05
  • JavaWeb实现mysql数据库数据的添加和删除

    JavaWeb实现mysql数据库数据的添加和删除

    这篇文章主要介绍了如何利用JavaWeb实现mysql数据库数据的添加和删除功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-03-03
  • Java枚举类型enum的详解及使用

    Java枚举类型enum的详解及使用

    这篇文章主要介绍了Java枚举类型enum的详解及使用的相关资料,需要的朋友可以参考下
    2017-05-05
  • 利用Java实现玩家打怪小游戏的完整过程

    利用Java实现玩家打怪小游戏的完整过程

    这篇文章主要介绍了如何使用Java创建一个简单的“打怪小游戏”,游戏中的角色分为法师、战士、BOSS和一个Team类,代码展示了如何通过面向对象编程来实现一个基本的战斗系统,需要的朋友可以参考下
    2024-12-12

最新评论