<2021SC@SDUSC>山东大学软件工程应用与实践JPress代码分析(十)

2021SC@SDUSC

本篇文章着重围绕代码模块jpress-service,jpress-service-provider,分析menuService、menuServiceProvider两个类。因为该类设计底层JFinal、Jboot的各项缓存的二次开发及使用,所以会补充一些缓存的相关知识,便于我们更好的理解代码。

一、MenuService

1.1 menu数据库表

通过数据库中表的属性更利于了解函数中的相关操作。以下是menu表:

在这里插入图片描述

1.2 MenuService

MenuService定义了菜单操作的相关接口,在provider会给予详细实现,在这里简述接口的用途。

Menu findById(Object id);

通过id值找到对应的菜单

List<Menu> findAll();

查询所有的菜单数据

boolean delete(Menu model);

通过menu类型的model删除菜单数据

Object saveOrUpdate(Menu model);

新增或者更新 Model 数据,新增或更新成功后,返回该 Model 的主键值

int sync(List<Menu> menus);

实现菜单的同步

List<Menu> findListByParentId(Object id);

通过父级菜单ID找到子菜单列表

List<Menu> findListByRelatives(String table, Object id);

通过相关联的表找到子菜单的列表,菜单的数据库表定义中有relative_table一值、

二、Cache缓存

首先展示部分MenuServiceProvider的代码:

@Cacheable(name = "menu", key = "type:#(type)")
public List<Menu> findListByTypeInDb(String type) {
    return DAO.findListByColumn(Column.create("type", type), "order_number asc, id desc");
}

我们可以看到,如果不理解注解的用途以及使用方法,不能对代码有很好的解读,接下来我们会先进行缓存机制的代码分析,再进行MenuServiceProvider的代码分析。

import io.jboot.components.cache.annotation.CacheEvict;
import io.jboot.components.cache.annotation.Cacheable;

MenuServiceProvider使用Jboot提供的注解来使用缓存机制。

2.1 缓存描述

Jboot 定位为高性能的微服务框架,然而高性能离不开合理的缓存设计。Jboot 内置了丰富的框架支持,比如:

  • ehcache
  • redis
  • ehredis
  • caffeine
  • caredis
  • j2cache

默认情况下 Jboot 是使用 caffeine 作为 Jboot 的缓存方案

JFinal中默认的缓存实现是 ehcache,使用时需要引入 ehcache 的 jar 包及其配置文件

EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认CacheProvider。Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。

在集成上,可以单独使用,一般在第三方库中被用到的比较多(如mybatis、shiro等)ehcache 对分布式支持不够好,多个节点不能同步,通常和redis一块使用。

2.2 通过注解使用缓存

  • @Cacheable
  • @CacheEvict
  • @CachesEvict
  • @CachePut

在 service 中,Jboot 提供了以上的 4 个组件,方便我们进行缓存操作,而无需使用 CacheUtil 来显示调用。

例如:

@Bean
public class CommentServiceImpl implements CommentService {

    @Override
    public String getCommentById(String id) {
        return "id:" + id + "  data:" + UUID.randomUUID();
    }

    @Override
    @Cacheable(name = "cacheName", key = "#(id)")
    public String getCommentByIdWithCache(String id) {
        return "id:" + id + "  data:" + UUID.randomUUID();
    }

    @Override
    @Cacheable(name = "cacheName", key = "#(id)", liveSeconds = 5)
    public String getCommentByIdWithCacheTime(String id) {
        return "id:" + id + "  data:" + UUID.randomUUID();
    }

    @Override
    @CachePut(name = "cacheName", key = "#(id)")
    public String updateCache(String id) {
        return "id:" + id + "  data:" + UUID.randomUUID();
    }

    @Override
    @CacheEvict(name = "cacheName", key = "#(id)")
    public void delCache(String id) {
    }
}
  • getCommentById 方法没有使用任何注解,每次调用的时候,data后面的都是一个新的随机数。
  • getCommentByIdWithCache 使用 @Cacheable 注解,缓存的 key 是传入进来的 id,因此只要是同一个 id 值,每次返回的随机数都是一样的,因为随机数已经被缓存起来了。
  • getCommentByIdWithCacheTime 使用 @Cacheable 注解,但是添加了 5秒 的时间限制,因此,在 5秒钟内,无论调用多少次,返回的随机数都是一样的,5秒之后缓存被删除,再次调用之后会是一个新的随机数,新的随机数会继续缓存 5秒钟。
  • updateCache 使用了注解 @CachePut ,每次调用此方法之后,会更新掉该 id 值的缓存。
  • delCache 使用了 @CacheEvict 注解,每次调用会删除该 id 值的缓存。

三、MenuServiceProvider

实现了menuService中的重要函数,给上层Controller的菜单操作提供接口。接下来进行provider主方法的详细解析。

3.1 shouldUpdateCache

@Override
@CacheEvict(name = "menu", key = "*")
public void shouldUpdateCache(int action, Model model, Object id) {
    super.shouldUpdateCache(action, model, id);
}

该方法为更新缓存,输入action的参数值,在调用该函数的时候,会删除该id值的缓存,达到更新效果。但是因为key中选用的是“*”,所以无论是哪个id值,都会在缓存的名字为menu的对象删除出缓存。

3.2 findListByType

@Override
public List<Menu> findListByType(String type) {
    return ModelUtil.copy(findListByTypeInDb(type));
}
//上面的方法中所调用的方法
@Cacheable(name = "menu", key = "type:#(type)")
    public List<Menu> findListByTypeInDb(String type) {
        return DAO.findListByColumn(Column.create("type", type), "order_number asc, id desc");
    }

该方法的目的是通过type类型查找该类型的一个列表。

首先通过DAO找到整个列表,通过订单号和id进行顺序排列。

其次使用@Cacheable注解,将key为type的信息存入缓存当中。

四、总结

本篇文章中,介绍了菜单功能的相关重要方法,并介绍了缓存机制在JPress项目中通过注解的使用和实现。在下篇文章中,会介绍缓存机制的显式调用与实现。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值