spring缓存机制-根据condition加入缓存(三)

2023-10-27

spring是一个轻量级开源框架,以IoC(Inverse of Control:控制反转)和AOP(Aspect Oriented Programming:面向切面编程)为内核,
兼具功能强大的的原生展现层spring mvc,原生持久层spring jdbc和原生业务层等技术,并且以海纳百川的胸怀整合了开源世界里众多
著名的第三方框架和类库,已经逐渐成为世界上使用最多的JavaEE企业级应用开源框架.
在使用spring缓存技术过程中,一般我们并不希望把查询到的全部数据放入缓存中,而只是希望把一些满足某种条件的数据放入缓存中,
针对这种那个情况,我们可以定义缓存的condition.下面通过一个实例简单介绍一下如何根据condition放入缓存.
1.通过maven构建项目,直接看pom.xml文件(略:参考相关博客)
2.创建service,dao和model,并将spring缓存加在service层,直接看代码UserService,UserServiceImpl,UserDao,UserDaoImpl和User.(略:参考相关博客)

  在UserServiceImpl代码中通过@Cacheable的condition值设置只有满足某种条件方法的返回值才放入缓存.

<span style="font-size:12px;">package com.ilucky.spring.cache.service.impl;

import java.util.Map;

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;

import com.ilucky.spring.cache.dao.UserDao;
import com.ilucky.spring.cache.model.User;
import com.ilucky.spring.cache.service.UserService;

/**
 * @author IluckySi
 * @date 20140613
 */
public class UserServiceImpl implements UserService {

	private UserDao userDao;
	
	/**
	 * JVM加载spring配置文件时, 通过set方法注入本类的依赖.
	 * @param userDao
	 */
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

	/**
	 * 对数据进行增删改时清空缓存, 查询时使用缓存, 其中value为缓存区,
	 * allEntries表示清空缓存中所有的数据, 使用#"user.id + '方法名'"做为key.
	 */
	@Override
    @CacheEvict(value = "data", key = "#id + 'add'")  
	public void add(User user) {
		System.out.println("UserService: method- add(User user)" );
		userDao.add(user);
	}

	@Override
	@CacheEvict(value = "data", key = "#id + 'delete'")  
	public void delete(String id) {
		System.out.println("UserService: method-delete(String id)" );
		userDao.delete(id);
	}

	@Override
	@CacheEvict(value = "data", key = "#user.id+ 'update'")  
	public void update(User user) {
		System.out.println("UserService: method-update(User user)" );
		userDao.update(user);
	}

	@Override
	@Cacheable(value = "data", condition = "#id.length() > 5")   
	public User find(String id) {
		System.out.println("UserService: method-find(String id)" );
		return userDao.find(id);
	}

	@Override
	@Cacheable(value = "data")  
	public Map<String, User> getAll() {
		System.out.println("UserService: method-getAll()" );
		return userDao.getAll();
	}
}
</span>

3.创建spring配置文件,配置spring自己的缓存管理器和bean之间的依赖关系,直接看代码spring-cahce.xml.(略:参考相关博客)

4.最后通过测试类测试spring缓存机制是否生效,直接看代码MainTest.

<span style="font-size:12px;">package com.ilucky.spring.cache;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.ilucky.spring.cache.model.User;
import com.ilucky.spring.cache.service.UserService;

/**
 * @author IluckySi
 * @date 20140613
 * 测试spring缓存机制是否生效.
 */
public class MainTest {

	public static void main(String[] args) {
		
		//加载ClassPath路径下的spring配置文件, 并获取service bean.
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-cache.xml");  
		UserService userService = context.getBean("userService", UserService.class); 
		System.out.println("service bean: " + userService);
		
		//添加两个用户.
		userService.add(new User("1", "Ilucky1", "pwd1"));
		userService.add(new User("2222222", "Ilucky2", "pwd2"));
		
		//验证#id.length <= 5是否被缓存.
		User user1 = userService.find("1");
		System.out.println(user1);
		User user11 = userService.find("1");
		System.out.println(user11);
		
		//验证#id.length > 5是否被缓存.
		User user2 = userService.find("2222222");
		System.out.println(user2);
		User user22= userService.find("2222222");
		System.out.println(user22);
	}
}
/**
spring缓存分为两种:方法和数据,如果方法被清除了,需要重新从数据库获取数据放入缓存,另外只有方法加入了缓存才可以获取缓存中的数据.
输出结果:
service bean: com.ilucky.spring.cache.service.impl.UserServiceImpl@15e2075
UserService: method- add(User user)
UserDao method- add(User user)
UserService: method- add(User user)
UserDao method- add(User user)
UserService: method-find(String id)
UserDao method- find(String id)
1-Ilucky1-pwd1
UserService: method-find(String id)
UserDao method- find(String id)
1-Ilucky1-pwd1
UserService: method-find(String id)
UserDao method- find(String id)
2222222-Ilucky2-pwd2
2222222-Ilucky2-pwd2
*/
</span>

  在测试代码中通过ClassPathXmlApplicationContext类加载spring配置文件,因为此maven项目是jar项目,并且在maven中约定资源
  放在src/main/resources目录,所以spring配置文件需要放在src/main/resources目录下.
注意:spring缓存分为两种:方法和数据,如果方法被清除了,需要重新从数据库获取数据放入缓存,另外只有方法加入了缓存才可以获取缓存中的数据.

点击链接下载源码


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring缓存机制-根据condition加入缓存(三) 的相关文章

随机推荐

  • 开篇导读

    你好 我是码闻强 拥有 12 年软件开发管理经验 创业前服务于杭州知时信息科技有限公司 任高级系统架构师 带领团队研发出一套适合汽车流通行业的 SaaS 产品 指是金融及周边配套产品 为业内数十家机构提供线上支撑服务 你是不是有这样的困惑
  • android edittext 监听输入完成,Android编程实现实时监听EditText文本输入的方法

    Android开发过程中经常使用EditText 有时您可能需要监视在textview中输入的单词数的状态和变化 下面就让爱站技术频道小编给大家带来的Android编程实现实时监听EditText文本输入的方法 分享给大家供大家参考 具体如
  • 疫情之下要不要转行?

    现在说这个话题可能有的人感觉有些晚了 但是我觉得还是可以聊聊 很有借鉴意义的 比较一起还在 生活还得继续 有很多东西还是需要去思考的 这里就把王豆豆的一篇关于是否要转行的文章 你且看 今年的疫情我一直在关注最新的情况 最近这几天国外感染人数
  • github 上传大文件的方法

    背景 版本库中有两个压缩包 大概在300M左右 上传时提示超过100M 上传失败 1 安装 git lfs git lfs install 2 跟踪指定大文件 可以使用 bin 之类的命令来跟踪一类文件 git lfs track root
  • 【JAVA核心】Java GC机制详解

    垃圾收集 Garbage Collection 通常被称为 GC 本文详细讲述Java垃圾回收机制 导读 1 什么是GC 2 GC常用算法 3 垃圾收集器 4 finalize 方法详解 5 总结 根据GC原理来优化代码 正式阅读之前需要了
  • private的构造函数

    package nuaa public class Xxx public int a private Xxx int a this a a System out println this a this a public static voi
  • avalon的使用与总结

    avalon是前端MVVM框架 将所有前端代码彻底分成两部分 视图的处理通过绑定实现 angular有个更炫酷的名词叫指令 业务逻辑则集中在一个个叫VM的对象中处理 我们只要操作VM的数据 它就自然而然地神奇地同步到视图 作用域绑定ms c
  • Keras实现Unet语义分割医学细胞图像并训练自己的数据集

    文章目录 一 Unet网络模型 二 代码运行 三 制作自己的数据集进行训练并测试标注 前言 本文实现keras下的Unet语义分割模型并且用自己制作的数据集进行训练并预测 本文引用了一些博文里面的内容 侵权请联系删改 引用的一些文章链接地址
  • linux+缺少+libc.so.6,libc.so.6 缺失问题

    今天中午 在Redhat AS5 上解决一个数据库连接问题 在应用的日志中发现如下报错信息 error client 145 24 216 86 lib libc so 6 libc start main 0xdc 0x4138cdec 在
  • 状态模式(State)

    1 概念 状态模式允许一个对象在其内部状态改变时改变它的行为 对象看起来似乎修改了它所属的类 属于行为型模式 2 模式结构 环境角色 Context 定义客户端所感兴趣的接口 并且保留一个具体状态类的实例 这个具体状态类的实例给出此环境对象
  • Linux基础命令

    文章目录 Linux基础命令 Linux命令基础格式 ls命令 ls命令的参数 ls 命令的 a选项 ls命令的 l选项 ls命令选项的组合使用 ls选项和参数的组合使用 ls 命令的 h选项 目录切换相关命令 cd pwd cd 切换工作
  • 如何查看自己电脑的IP地址

    如何查看自己电脑的IP地址 简略概括 打开命令窗口 win R gt 输入cmd进入 gt 敲ipconfig gt 进行查看 图片图示 首先打开命令窗口 在命令窗口中输入ipconfig 进行查看 这就是查看结果 以我的为例 我的IP地址
  • 【StyleGAN代码学习】StyleGAN模型架构

    完整StyleGAN笔记 http www gwylab com pdf Note StyleGAN pdf 基于StyleGAN的一个好玩的网站 www seeprettyface com 第二章 StyleGAN代码解读 上 这一章将对
  • CMOS图像传感器——从传感器冗余说起

    在这先抛出一个概念 什么是成像圈 众所周知 相机的镜头近似于圆柱体 光线透过圆筒子投射出的大都是圆形 我们可以拿一个镜头演示一下 当这个圆圈投在传感器所在焦平面时 我们称之为像场 像场的边界我们称之为成像圈 成像圈是圆的 但是传感器是矩形
  • 【测试】用例篇

    努力经营当下 直至未来明朗 文章目录 一 设计测试用例的万能公式 二 设计测试用例的具体方法 1 等价类 2 边界值 3 因果图 判定表 4 场景设计法 5 正交法 6 错误猜测法 sparkles 小结 普通小孩也要热爱生活 一 设计测试
  • WEB-1-前端三剑客

    前端三剑客 一 HTML 1 什么是HTML 2 元素 3 常见的元素 1 标题元素 2 段落元素 3 列表 4 超链接 5 图片 6 无语义标签 二 CSS 1 什么是 CSS 2 引入的样式 3 常见的 CSS 选择器 1 标签选择器
  • c++使用高斯顺序消元法,求解方程组

    方程组形式为 AX b 高斯顺序消元法的目的是将方程组整理为一个上三角矩阵 在获得这个上三角矩阵后 就可以通过回代的方法 逆序的求出方程的根X n 1 X 0 可以将求解方程组分为如下几个步骤 1 首先消去第一列除第一行外的所有元素 将第2
  • 微信小程序获取当前日期及时间

    1 在微信小程序新建好之后 项目内可以看到有一个名字为utils的文件夹 内放置util js文件 util js文件用于存放公共方法 打开后可以看到内容如下图 如果说你只需要获得当前日期等其他文件内没有的数据 就需要你进行添加 可以看到源
  • 100行代码实现加权负载均衡算法(WRR)

    轮询算法round robin是很基础的负载均衡算法 实际应用中wrr更为常见 但一般不需要自己实现 因为一般需要rr的场景 都已经在基础设施层面进行了支持 比如lvs或nginx通过配置即可实现 但业务上偶尔也需要自己实现负载均衡 所以有
  • spring缓存机制-根据condition加入缓存(三)

    spring是一个轻量级开源框架 以IoC Inverse of Control 控制反转 和AOP Aspect Oriented Programming 面向切面编程 为内核 兼具功能强大的的原生展现层spring mvc 原生持久层s