Java注解开发

这篇具有很好参考价值的文章主要介绍了Java注解开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

注解开发

注解提供了更声明式和方便的方式,而编码方式允许更精细的控制和定制。

在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、在方法上添加对应的注解,就可以达到缓存的目的

@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三个注解文章来源地址https://www.toymoban.com/news/detail-620614.html

@Caching(
    cacheable={@Cacheable(cacheNames ="comment",key = "#id")},
    put = {@CachePut(cacheNames = "comment",key.= "#result.author")}
)
public Comment getcoiment(int id){
    return commentRepository.findByld(id).get();
}

到了这里,关于Java注解开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第五天)MyBatis的注解开发

    ​ 昨天我们深入学习了 MyBatis多表之间的关联映射,了解掌握了一对一关联映射,一对多关联映射,嵌套查询方式以及嵌套结果方式,掌握了缓存机制的一级缓存,二级缓存等概念,也使用了代码进行复现理解 。但是都是基于XML配置文件的方式来实现的,现在我们要学习一下

    2024年02月11日
    浏览(59)
  • 开发语言漫谈-Java

            由于C++过于复杂,Java诞生了。与C++相比,Java更易于学习和使用,它去掉C++中的指针和解决了内存管理问题。Java提供了垃圾自动回收机制,自动管理不再使用的内存。Python又进一步简化,使得语法更简洁,更易于阅读和编写。当然随着简化,性能就越来越低。    

    2024年04月10日
    浏览(46)
  • 海康威视相机SDK二次开发(JAVA语言)

    前言 有个项目需要使用java程序读取海康威视的相机图片。相机通过以太网连接服务器,部署在服务器上的java程序将相机拍摄的画面保存在指定路径下。 海康威视提供了sdk开发包,可以在官网中下载,windows和linux系统都有。但是开发包中给出的示例代码,无法满足实际需要,

    2024年04月29日
    浏览(46)
  • BsinCopilot:Java版端到端大语言模型开发框架

    BsinCopilot是基于BsinPaaS开源框架构建的大语言模型应用SaaS服务,借鉴langchain的框架思想,引入  langchian4j组件,微前端微服务的架构设计,可快速助您构建和体验端到端的AI应用。 概念 说明 Bsin 毕昇缩写,毕昇,中国北宋发明家,活字印刷术的发明者。毕昇出身平民,长期在

    2024年03月13日
    浏览(57)
  • Android 安卓开发语言kotlin与Java该如何选择

            如今在Android开发中,应用层开发语言主要是Java和Kotlin,Kotlin是后来加入的,主导的语言还是Java。kotlin的加入仿佛让会kotlin语言的开发者更屌一些,其实不然。         有人说kotlin的引入是解决开发者复杂的逻辑,并且对空指针控制的比较友好,但是我们在开

    2024年02月11日
    浏览(61)
  • Java转Go:java开发者转学go语言,请给我一些建议和学习推荐

    在做开发时遇到最无理的需求就是部门没了😂 遇到最无理的需求就是部门没了😂,差点人也在这个公司没了,但好在是跟着大部队换了一个部门,就是要转go,也可能要用js和solidity开发 一开始知道部门没了,第一时间一定是会担心,甚至后面知道有的同事要被毕业,有的同

    2024年02月13日
    浏览(50)
  • Java|注解之定义注解

    Java语言使用 @interface 语法来定义注解( Annotation ),它的格式如下:  注解的参数类似无参数方法,可以用 default 设定一个默认值(强烈推荐)。最常用的参数应当命名为 value 。 元注解 有一些注解可以修饰其他注解,这些注解就称为元注解 (meta annotation)。Java标准库已经

    2024年02月05日
    浏览(45)
  • 【Java基础】注解——自定义注解

    Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。 比如我们常见的@Override和@Deprecated都是注解,注解可以加在类、方法、成员变量等上面,类似于给他们“ 打标签 \\\"。 public @interface 注解名{} 看起来和定义接口很相似只是多了一个@符号 接口: public interface 接口名

    2024年02月03日
    浏览(44)
  • 【Java】学习一门开发语言,从TA的Hello World开始

    欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《Java》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。 温馨提示:博主能力有限,理解水平有限

    2024年01月23日
    浏览(53)
  • Java中的注解,自定义注解

    框架 = 注解 + 反射 + 设计模式 注解( Annotation )是从JDK5.0开始引入,以“@注解名”在代码中存在。 Annotation 可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。还可以添加一些参数值,这些信息被保存在 Annotation 的 “name=valu

    2023年04月16日
    浏览(103)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包