pagehelper 分页插件 Cache缓存创建 工厂模式分析笔记

文章详细分析了PageHelper分页插件中如何使用工厂模式来创建和管理GuavaCache和SimpleCache两种缓存。Cache是一个公共接口,定义了get和put方法。GuavaCache基于Google的CacheBuilder实现,而SimpleCache基于MyBatis的CacheBuilder。CacheFactory作为抽象工厂,根据配置决定创建哪种类型的缓存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pagehelper 分页插件 Cache缓存创建 工厂模式分析笔记

工厂模式在组件中的运用(pagehelper分页插件)

定义一个Cache接口作为缓存品类的公共接口,定义了get 和 put方法

public interface Cache<K, V> {

    V get(K key);

    void put(K key, V value);
}

GuavaCache 和 SimpleCache类继承Cache接口通过自定义两参构造方法初始化(配置文件信息,配置前缀信息),并实现了接口中的get 和 put方法

GuavaCache 是谷歌的 com.google.common.cache.CacheBuilder 缓存

public class GuavaCache<K, V> implements Cache<K, V> {

    private final com.google.common.cache.Cache<K, V> CACHE;

    public GuavaCache(Properties properties, String prefix) {
        CacheBuilder cacheBuilder = CacheBuilder.newBuilder();
        String maximumSize = properties.getProperty(prefix + ".maximumSize");
        ...
        CACHE = cacheBuilder.build();
    }

    @Override
    public V get(K key) {
        return CACHE.getIfPresent(key);
    }

    @Override
    public void put(K key, V value) {
        CACHE.put(key, value);
    }
}

SimpleCache 是mybatis的 org.apache.ibatis.mapping.CacheBuilder 缓存

public class SimpleCache<K, V> implements Cache<K, V> {

    private final org.apache.ibatis.cache.Cache CACHE;

    public SimpleCache(Properties properties, String prefix) {
        CacheBuilder cacheBuilder = new CacheBuilder("SQL_CACHE");
        String typeClass = properties.getProperty(prefix + ".typeClass");
        ...
        CACHE = cacheBuilder.build();
    }

    @Override
    public V get(K key) {
        Object value = CACHE.getObject(key);
        if (value != null) {
            return (V) value;
        }
        return null;
    }

    @Override
    public void put(K key, V value) {
        CACHE.putObject(key, value);
    }
}

抽象类 CacheFactory 作为工厂创建缓存 createCache 为创建方法 返还缓存对象
工厂方法解析

public abstract class CacheFactory {

    public static <K, V> Cache<K, V> createCache(String sqlCacheClass, String prefix, Properties properties) {
        // 是否指定创建缓存类型
        if (StringUtil.isEmpty(sqlCacheClass)) {
            // 未指定先判断是否存在google的缓存如果存在则创建GuavaCache缓存
            try {
                Class.forName("com.google.common.cache.Cache");
                return new GuavaCache<K, V>(properties, prefix);
            } catch (Throwable t) {
                // 如果不存在则google的缓存则创建mybatis缓存 
                return new SimpleCache<K, V>(properties, prefix);
            }
        } else {
            // 指定了创建类型则反射找到类 初始化传入配置文件创建
            try {
                Class<? extends Cache> clazz = (Class<? extends Cache>) Class.forName(sqlCacheClass);
                try {
                    Constructor<? extends Cache> constructor = clazz.getConstructor(Properties.class, String.class);
                    return constructor.newInstance(properties, prefix);
                } catch (Exception e) {
                    Cache cache = clazz.newInstance();
                    if (cache instanceof PageProperties) {
                        ((PageProperties) cache).setProperties(properties);
                    }
                    return cache;
                }
            } catch (Throwable t) {
                throw new PageException("Created Sql Cache [" + sqlCacheClass + "] Error", t);
            }
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值