Java学习笔记(二十三)

news2025/1/15 12:25:42

1 @CacheEvict

@CacheEvict是Spring框架中用于清空缓存的注解。以下是对@CacheEvict注解的详细介绍:

1.1 作用

@CacheEvict注解的主要作用是删除缓存中的数据。在方法执行后或执行前(根据配置),它可以清空指定的缓存项或整个缓存区域。这对于删除旧的数据或无效的数据非常有用,可以确保缓存中的数据始终是最新的。

1.2 常用属性

@CacheEvict注解包含多个属性,用于配置缓存删除的行为:

  1. value/cacheNames:指定要清空的缓存的名称。可以是一个字符串或一个字符串数组,表示该方法将清空哪个缓存区域中的数据。如果指定了多个缓存名称,那么这些缓存区域中的数据都将被清空。
  2. key:指定要清空的缓存项的键。通过该属性,可以精确控制要删除的缓存数据。可以使用SpEL表达式来动态生成键的值。
  3. allEntries:一个布尔值,用于指定是否清空缓存中的所有数据。如果设置为true,那么将删除指定缓存区域中的所有数据;如果设置为false(默认值),则只删除与指定键相匹配的缓存项。
  4. beforeInvocation:一个布尔值,用于指定是否在方法执行前清空缓存。如果设置为true,那么缓存的清空操作将在方法执行之前进行;如果设置为false(默认值),则缓存的清空操作将在方法执行之后进行。需要注意的是,如果在方法执行前清空缓存,并且方法执行失败(抛出异常),那么缓存将不会被重新填充。

1.3 使用示例

以下是一个使用@CacheEvict注解的示例:

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    // 使用@Cacheable注解缓存用户数据
    @Cacheable(value = "users", key = "#id")
    public User getUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }

    // 使用@CacheEvict注解删除用户数据对应的缓存
    @CacheEvict(value = "users", key = "#user.id")
    public void saveUser(User user) {
        userRepository.save(user);
    }
}

在上面的示例中,UserService类中的getUserById方法使用了@Cacheable注解来缓存用户数据。而saveUser方法则使用了@CacheEvict注解来删除与保存的用户数据相对应的缓存项。这样,在每次保存用户数据后,都可以确保缓存中的数据是最新的。

1.4 注意事项

  1. 在使用@CacheEvict注解时,必须指定要清空的缓存名称(value/cacheNames属性)和缓存项的键(key属性)。
  2. 如果指定了allEntries属性为true,那么将删除指定缓存区域中的所有数据,因此需要谨慎使用。
  3. 如果在方法执行前清空缓存(beforeInvocation属性为true),并且方法执行失败,那么缓存将不会被重新填充。这可能会导致在某些情况下出现数据不一致的问题。因此,在使用beforeInvocation属性时,需要充分考虑方法的执行情况和可能的异常处理。

总之,@CacheEvict注解是Spring框架中用于清空缓存的重要工具。通过合理配置其属性,可以实现对缓存数据的精确控制和管理。

2 @Caching

@Caching注解是Spring Cache提供的一个功能强大的组合注解,它允许开发者在一个方法或类上同时指定多个缓存操作相关的注解。以下是关于@Caching注解的详细介绍:

2.1 @Caching注解的主要功能

@Caching注解通过组合多个Spring Cache注解(如@Cacheable、@CachePut、@CacheEvict等),能够定义复杂的缓存规则。这使得开发者可以在一个方法上灵活地配置多种缓存行为,而无需编写重复的缓存处理代码。

2.2 @Caching注解的属性

@Caching注解拥有三个主要属性,每个属性都可以接收一个或多个相应的注解作为值:

  1. cacheable:用于指定一个或多个@Cacheable注解的组合。@Cacheable注解用于查询缓存,如果缓存中存在相应的数据,则直接返回缓存数据而不执行方法。如果没有缓存数据,则执行方法并将结果添加到缓存中。
  2. put:用于指定一个或多个@CachePut注解的组合。@CachePut注解无论方法是否被执行,都会将方法的返回值放入指定的缓存中。这通常用于更新缓存数据。
  3. evict:用于指定一个或多个@CacheEvict注解的组合。@CacheEvict注解用于删除缓存中的数据,通常用于删除操作或数据更新后的缓存同步。

2.3 @Caching注解的使用示例

以下是一个使用@Caching注解的示例,展示了如何在一个方法上同时指定查询缓存、更新缓存和删除缓存的操作:

@Caching(
    cacheable = @Cacheable(key = "'userCache:'+ #uid"),
    put = @CachePut(key = "'userCache:'+ #uid"),
    evict = { 
        @CacheEvict(key = "'userCache:'+ #uid"), 
        @CacheEvict(key = "'addressCache:'+ #uid"), 
        @CacheEvict(key = "'messageCache:'+ #uid") 
    }
)
public User updateRef(String uid) {
    // 业务逻辑
    return null;
}

在这个示例中,updateRef方法被配置了多个缓存操作:

  • 使用@Cacheable注解查询userCache缓存,如果缓存中存在以uid为键的数据,则直接返回该数据。
  • 使用@CachePut注解更新userCache缓存,将方法的返回值放入缓存中。
  • 使用多个@CacheEvict注解删除userCacheaddressCachemessageCache缓存中以uid为键的数据。

2.4 @Caching注解的注意事项

  1. SpEL表达式:在@Caching注解的属性中,可以使用Spring Expression Language(SpEL)表达式来动态生成缓存的键(key)。这提供了很大的灵活性,允许开发者根据方法的参数或返回值来定制缓存的键。
  2. 缓存配置:在使用@Caching注解之前,需要确保已经配置了Spring Cache的相关依赖和缓存管理器(CacheManager)。这通常通过在Spring Boot应用程序的主类或配置类上使用@EnableCaching注解来启用缓存支持,并通过application.properties或application.yml文件进行自定义配置。
  3. 缓存同步:在使用@Cacheable和@CachePut注解时,需要注意缓存的同步问题。如果多个线程同时访问同一个缓存键,可能会导致数据不一致的问题。因此,在使用这些注解时,需要确保缓存的同步机制得到妥善处理。

综上所述,@Caching注解是Spring Cache提供的一个非常有用的工具,它允许开发者在一个方法或类上同时指定多个缓存操作相关的注解。通过合理使用@Caching注解,可以大大提高应用程序的性能和可维护性。

3 @After 、@Before 、@ Around

@After@Before@Around 是Spring AOP(面向切面编程)中的注解,它们用于定义切面的通知(Advice),这些通知在目标方法执行的不同阶段执行额外的逻辑。以下是这些注解的详细介绍及示例:

3.1 @Before 注解

  • 作用:前置通知,在目标方法执行之前执行。它通常用于执行一些前置条件检查、日志记录等。
  • 示例
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class MyBeforeAdvice {

    @Before("execution(* com.example.service.*.*(..))")
    public void beforeAdvice() {
        System.out.println("Before method execution");
        // 在这里可以执行前置逻辑,如日志记录、权限检查等
    }
}

在这个例子中,beforeAdvice 方法会在 com.example.service 包下所有类的所有方法执行之前执行。

3.2 @After 注解

  • 作用:后置通知,在目标方法执行之后执行,无论目标方法是否抛出异常。它通常用于执行一些清理工作、日志记录等。
  • 示例
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class MyAfterAdvice {

    @After("execution(* com.example.service.*.*(..))")
    public void afterAdvice(JoinPoint joinPoint) {
        System.out.println("After method execution: " + joinPoint.getSignature());
        // 在这里可以执行后置逻辑,如日志记录、资源释放等
    }
}

在这个例子中,afterAdvice 方法会在 com.example.service 包下所有类的所有方法执行之后执行。

3.3 @Around 注解

  • 作用:环绕通知,可以包裹目标方法的执行,拥有最大的控制权。它可以在目标方法执行前后执行自定义逻辑,甚至可以决定是否继续执行目标方法或改变其返回值。
  • 示例
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class MyAroundAdvice {

    @Around("execution(* com.example.service.*.*(..))")
    public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("Before method execution");
        try {
            Object result = pjp.proceed(); // 执行目标方法
            System.out.println("After method execution");
            return result; // 返回目标方法的执行结果
        } catch (Throwable throwable) {
            // 处理异常
            System.out.println("Exception occurred: " + throwable.getMessage());
            throw throwable; // 重新抛出异常
        }
    }
}

在这个例子中,aroundAdvice 方法会在 com.example.service 包下所有类的所有方法执行前后执行自定义逻辑。它首先打印“Before method execution”,然后执行目标方法,并打印“After method execution”。如果目标方法抛出异常,它还会捕获并处理该异常。

3.4 总结

  • @Before 注解用于在目标方法执行之前执行前置逻辑。
  • @After 注解用于在目标方法执行之后执行后置逻辑,无论目标方法是否抛出异常。
  • @Around 注解用于在目标方法执行前后执行自定义逻辑,并可以控制是否继续执行目标方法或改变其返回值。

这些注解在Spring AOP中非常有用,可以帮助开发者在不修改目标方法代码的情况下实现各种复杂的功能和逻辑。

4 docker network

Docker提供了一组命令来管理和配置Linux网络,这些命令可以创建、列出、删除和检查网络,帮助用户在Docker容器之间建立通信。以下是一些常用的Docker网络命令及其详细介绍:

4.1 创建网络

  • 命令docker network create [OPTIONS] NETWORK_NAME

  • 功能:创建一个新的Docker网络。

  • 选项

    • --driver:指定网络驱动程序(如bridge、host、overlay等)。
    • --subnet:指定子网。
    • --gateway:指定网关。
    • --ip-range:指定可用IP地址范围。
    • --ipv6:启用IPv6。
    • --label:为网络添加标签。
  • 示例docker network create --driver bridge --subnet 192.168.1.0/24 my_network

4.2 列出网络

  • 命令docker network ls
  • 功能:列出所有可用的Docker网络。
  • 输出:包括NETWORK ID、NAME、DRIVER和SCOPE等信息。

4.3 查看网络详情

  • 命令docker network inspect [OPTIONS] NETWORK_NAME
  • 功能:查看指定Docker网络的详细信息。
  • 输出:包括网络名称、ID、创建时间、作用域、驱动程序、IPAM配置(子网、网关等)、容器连接信息等。

4.4 连接容器到网络

  • 命令docker network connect [OPTIONS] NETWORK_NAME CONTAINER_NAME

  • 功能:将已创建的容器连接到指定的Docker网络中。

  • 选项:无特定选项,但可以使用--alias为容器在网络中设置别名。

  • 示例docker network connect my_network my_container

4.5 断开容器与网络的连接

  • 命令docker network disconnect [OPTIONS] NETWORK_NAME CONTAINER_NAME

  • 功能:断开指定容器与指定Docker网络的连接。

  • 选项:无特定选项。

  • 示例docker network disconnect my_network my_container

4.6 删除网络

  • 命令docker network rm [OPTIONS] NETWORK_NAME

  • 功能:删除指定的Docker网络。

  • 选项:无特定选项,但可以同时删除多个网络,如docker network rm network1 network2

  • 示例docker network rm my_network

4.7 其他注意事项

  • 网络类型:Docker支持多种网络类型,包括bridge(桥接网络,默认类型)、host(主机网络)、overlay(覆盖网络,用于多主机集群)等。
  • 网络隔离:通过创建不同的网络,可以实现容器之间的隔离,提高安全性。
  • 容器间通信:容器可以通过自定义网络在不同主机上安全地相互通信。

综上所述,Docker网络命令提供了强大的网络管理功能,允许用户创建、配置和管理Docker容器之间的网络连接。通过使用这些命令,用户可以实现容器之间的隔离、通信和网络配置,满足各种复杂的网络需求。

5 ElasticsearchTemplate 和 RestHighLevelClient

ElasticsearchTemplate 和 RestHighLevelClient 都是用于与 Elasticsearch 进行交互的客户端工具,但它们在实现方式、使用场景和功能特点上有所不同。以下是对两者的详细介绍以及它们之间的区别:

5.1 ElasticsearchTemplate

  1. 概述
    ElasticsearchTemplate 是 Spring Data Elasticsearch 提供的一个高级抽象,它封装了底层的 Elasticsearch 客户端操作,使得开发者可以更方便地与 Elasticsearch 进行交互。

  2. 特点

    • 简化操作:通过提供一系列的方法,如索引、查询、删除等,简化了与 Elasticsearch 的交互过程。
    • 丰富的操作方法:支持各种 CRUD 操作,以及复杂的查询和聚合操作。
    • 自定义查询:允许开发者通过 Java 代码构建自定义的查询条件,满足更复杂的业务需求。
  3. 使用场景

    • 适用于使用 Spring 框架的开发者,特别是那些希望利用 Spring Data Elasticsearch 提供的便利性和丰富功能的开发者。

5.2 RestHighLevelClient

  1. 概述
    RestHighLevelClient 是 Elasticsearch 官方提供的一个高级 REST 客户端,它基于 HTTP 协议与 Elasticsearch 进行交互。与低级的 REST 客户端相比,RestHighLevelClient 提供了更高的抽象层次和更丰富的功能。

  2. 特点

    • 官方支持:由 Elasticsearch 官方提供,与 Elasticsearch 的兼容性更好。
    • 丰富的 API:提供了包括索引管理、数据管理、查询等在内的丰富 API。
    • 高性能:通过优化 HTTP 请求和响应的处理,提高了与 Elasticsearch 交互的性能。
  3. 功能

    • 索引管理:支持创建、删除、判断索引是否存在等操作。
    • 数据管理:支持写入、批量写入、更新等操作。
    • 查询功能:支持基本查询、复合查询、聚合查询等,可以结合原生 Elasticsearch 查询语法实现更复杂的查询需求。
  4. 使用场景

    • 适用于需要在 Java 应用程序中集成 Elasticsearch 的开发者,特别是那些希望使用 Elasticsearch 官方提供的高级 REST 客户端的开发者。

5.3 两者区别

  1. 实现方式

    • ElasticsearchTemplate 是基于 Spring Data Elasticsearch 的,它封装了底层的 Elasticsearch 客户端操作,提供了更高层次的抽象。
    • RestHighLevelClient 是 Elasticsearch 官方提供的 REST 客户端,它基于 HTTP 协议与 Elasticsearch 进行交互,提供了更丰富的 API 和更高的性能。
  2. 使用场景

    • ElasticsearchTemplate 更适用于使用 Spring 框架的开发者,特别是那些希望利用 Spring Data Elasticsearch 的便利性和丰富功能的开发者。
    • RestHighLevelClient 则更适用于需要在 Java 应用程序中集成 Elasticsearch 的开发者,特别是那些希望使用 Elasticsearch 官方提供的高级 REST 客户端的开发者。
  3. 功能特点

    • ElasticsearchTemplate 提供了丰富的操作方法,但相对来说,它的抽象层次更高,可能对于某些复杂的查询需求需要开发者进行更多的自定义封装。
    • RestHighLevelClient 则提供了更丰富的 API 和更高的性能,对于复杂的查询需求,它可以更好地结合原生 Elasticsearch 查询语法来实现。

综上所述,ElasticsearchTemplate 和 RestHighLevelClient 都是用于与 Elasticsearch 进行交互的重要工具,但它们在实现方式、使用场景和功能特点上有所不同。开发者在选择时,应根据自己的技术栈、业务需求以及对 Elasticsearch 的熟悉程度来做出决策。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2276999.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

移动云自研云原生数据库入围国采!

近日,中央国家机关2024年度事务型数据库软件框架协议联合征集采购项目产品名单正式公布,移动云自主研发的云原生数据库产品顺利入围。这一成就不仅彰显了移动云在数据库领域深耕多年造就的领先技术优势,更标志着国家权威评审机构对移动云在数…

vLLM私有化部署大语言模型LLM

目录 一、vLLM介绍 二、安装vLLM 1、安装环境 2、安装步骤 三、运行vLLM 1、运行方式 2、切换模型下载源 3、运行本地已下载模型 四、通过http访问vLLM 一、vLLM介绍 vLLM(官方网址:https://www.vllm.ai)是一种用于大规模语言模型&#x…

Dify社区版部署,更换docker.io避免出现安装失败

这几天在部署Dify的社区版,用docker compose进行部署,看Dify里面的部署文档也是相当简单,只需要几个命令就可以执行完成了,但当开始执行的时候就发现会有各种问题。 Docker Compose最好是升级到最新的版本,我们以前用…

IntelliJ IDEA Type Hierarchy Scope Pattern 学习指南

IntelliJ IDEA Type Hierarchy Scope Pattern 学习指南 什么是 Type Hierarchy? Type Hierarchy 是 IntelliJ IDEA 提供的一个工具,允许开发者查看某个类的继承关系及其实现的接口结构。它是理解类关系的重要工具,尤其在处理复杂的继承体系…

Redis数据结构服务器

Redis数据结构服务器 什么是Redis数据结构服务器 的概念和特点 是一个开源(BSD许可),内存中的数据结构存储服务器,可用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串(strings&#xff09…

【Linux】进程结束和进程等待

进程的结束 退出码的认识 在我们学习C/C的时候我们通常在进行写main函数时,main函数主体写完后通常会进行写一条语句 " return 0 " ,这里的这条语句到底是什么意思呢?? 我们知道当在主函数中调用其他函数或者在其他函…

Spring Boot教程之五十五:Spring Boot Kafka 消费者示例

Spring Boot Kafka 消费者示例 Spring Boot 是 Java 编程语言中最流行和使用最多的框架之一。它是一个基于微服务的框架,使用 Spring Boot 制作生产就绪的应用程序只需很少的时间。Spring Boot 可以轻松创建独立的、生产级的基于 Spring 的应用程序,您可…

1月14日作业

将图形类的获取周长和获取面积函数设置成虚函数&#xff0c;完成多态 #include <iostream> #include <cmath> #define PI 3.14159 using namespace std;// 父类&#xff1a;图形类 class Shape { protected:double perimeter;double area; public:Shape():perimet…

基于Springboot + vue实现的文档管理系统

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…

Spring Boot 2 学习指南与资料分享

Spring Boot 2 学习资料 Spring Boot 2 学习资料 Spring Boot 2 学习资料 在当今竞争激烈的 Java 后端开发领域&#xff0c;Spring Boot 2 凭借其卓越的特性&#xff0c;为开发者们开辟了一条高效、便捷的开发之路。如果你渴望深入学习 Spring Boot 2&#xff0c;以下这份精心…

高级软件工程-复习

高级软件工程复习 坐标国科大&#xff0c;下面是老师说的考试重点。 Ruby编程语言的一些特征需要了解要能读得懂Ruby程序Git的基本命令操作知道Rails的MVC工作机理需要清楚&#xff0c;Model, Controller, View各司什么职责明白BDD的User Story需要会写&#xff0c;SMART要求能…

easyui datagrid表头和网格错位问题

问题&#xff1a;表头与数据网格错位 解决&#xff1a; 在onLoadSuccess事件中调用fitColumns方法 $(this).datagrid(‘fitColumns’);

React方向:react中5种Dom的操作方式

1、通过原生JS获取Dom去操作 通过document.querySelector(#title)原生js的方式去拿到dom节点&#xff0c;然后去进行操作。 import {Component} from "react";class App extends Component {//定义获取Dom的函数handleGetDom(){let title document.querySelector(#t…

【深度学习】多目标融合算法(二):底部共享多任务模型(Shared-Bottom Multi-task Model)

目录 一、引言 1.1 往期回顾 1.2 本期概要 二、Shared-Bottom Multi-task Model&#xff08;SBMM&#xff09; 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 三、总结 一、引言 在朴素的深度学习ctr预估模型中&#xff08;如DNN&#xff09;&#xff0c;通常以一个行…

天机学堂3-ES+Caffeine

文章目录 day05-问答系统表 用户端分页查询问题目标效果代码实现 3.6.管理端分页查询问题ES相关 管理端互动问题分页实现三级分类3.6.5.2.多级缓存3.6.5.3.Caffeine 4.评论相关接口目标效果新增回答或评论 day05-问答系统 效果&#xff1a; 表 互动提问的问题表&#xff1a…

【Docker】Docker部署多种容器

关于docker&#xff0c;Windows上使用Powershell/CMD执行指令&#xff0c;Linux系统直接使用终端执行指令。 docker安装MySQL 拉取MySQL 也可以跳过拉取步骤&#xff0c;直接run&#xff0c;这样本地容器不存在的话&#xff0c;会自动拉取最新/指定的版本。 # 默认拉取最新…

【Flink】Flink内存管理

Flink内存整体结构图&#xff1a; JobManager内存管理 JVM 进程总内存(Total Process Memory)Flink总内存(Total Flink Memory)&#xff1a;JVM进程总内存减去JVM Metaspace(元空间)和JVM Overhead(运行时开销)上图解释&#xff1a; JVM进程总内存为2G;JVM运行时开销(JVM Overh…

如何规模化实现完全自动驾驶?Mobileye提出解题“新”思路

在CES 2025上&#xff0c;Mobileye展示了端到端自动驾驶系统Mobileye Drive™&#xff0c;通过高度集成的传感器、算法和计算平台&#xff0c;可以实现自动驾驶功能的全覆盖。 Mobileye创始人兼首席执行官Amnon Shashua教授 期间&#xff0c;Mobileye创始人兼首席执行官Amnon …

Qt 5.14.2 学习记录 —— 십일 QLCDNumber、QProgressBar、QCalendarWidget

文章目录 1、QLCDNumber2、ProgressBar3、QCalendarWidget 1、QLCDNumber 写一个倒计时程序。拖一个LCD Number到界面&#xff1a; 定时器用Qt的QTimer类&#xff0c;这个类的对象会产生一个timeout信号&#xff0c;通过start方法来开启定时器&#xff0c;并且参数中设定触发ti…

简要认识JAVAWeb技术三剑客:HTMLCSSJavaScript

目录 一、web标准二、什么是HTML三、什么是CSS四、什么是JavaScript 黑马JAVAWeb飞书在线讲义地址&#xff1a; https://heuqqdmbyk.feishu.cn/wiki/LYVswfK4eigRIhkW0pvcqgH9nWd 一、web标准 Web标准也称网页标准&#xff0c;由一系列的标准组成&#xff0c;大部分由W3C&…