原文地址:
上一篇,中, 我们学习并了解了使用CacheBuilder方便的构造Cache和LoadingCache实例,我们可以通过CacheBuilder提供的 newBuilder()方法,使用建造者模式构建CacheBuilder实例,另外Guava Cache提供了CacheBuilderSpec类创建CacheBuilder实例,接下来,我们就来开始Guava Cache:CacheBuilderSpec的学习。
CacheBuilderSpec类以解析代表CacheBuilder配置的字符串的形式来创建CacheBuilder实例,需要说明的 是,Guava没有处理编译时异常,这将会导致当传入的字符串无效时,会出现编译时异常,下面是一个可以用来创建CacheBuilderSpec实例的 有效字符串:
//配置CacheBuilder的字符串String configString = "concurrencyLevel=10,refreshAfterWrite=5s";
通过上面的字符串,我们可以创建一个与 中 最后一个例子相同的CacheBuilder实例,通过一些方法来指定时间(refreshAfterWrite,expireAfterAccess, 等等),间隔的整数后面的‘s’,‘m’,‘h’或‘d’对应于秒,分钟,小时或天数,这里没有毫秒甚至纳秒级别的设置,当我们指定好了配置的字符串,我 们可以通过下面的方式创建一个CacheBuilderSpec实例:
//解析字符串,创建CacheBuilderSpec实例CacheBuilderSpec spec = CacheBuilderSpec.parse(configString);
我们可以通过下面的方式,使用CacheBuilderSpec实例创建CacheBuilder实例:
//通过CacheBuilderSpec实例构造CacheBuilder实例CacheBuilder.from(spec);
这里,我们调用了CacheBuilder中的静态from方法,使用CacheBuilderSpec 对象构造了CacheBuilder实例,通过格式化的字符串设置了CacheBuilder的属性,我们可以使用返回的CacheBuilder实例, 像我们之前一样调用一些适当的方法,比如添加一个RemovalListener或者通过CacheBuilder创建一个LoadingCache实 例:
//配置CacheBuilder的字符串String spec = "concurrencyLevel=10,expireAfterAccess=5m,softValues";//解析字符串,创建CacheBuilderSpec实例CacheBuilderSpec cacheBuilderSpec = CacheBuilderSpec.parse(spec);//通过CacheBuilderSpec实例构造CacheBuilder实例CacheBuilder cacheBuilder = CacheBuilder.from(cacheBuilderSpec);//ticker:设置缓存条目过期时间//removalListener:监听缓存条目的移除cacheBuilder.ticker(Ticker.systemTicker()) .removalListener(new TradeAccountRemovalListener()) .build(new CacheLoader() { @Override public TradeAccount load(String key) throws Exception { return tradeAccountService.getTradeAccountById(key); } });
上面的例子中,我们注册了一个Ticker实例和RemovalListener实例,通过build方法指定了一个CacheLoader,以字符串方式使用CacheBuilderSpec用于示例的演示目的,通常情况下,这个字符串将从命令行输入,或来自于配置文件的读取。
代码地址: