自定义Cacheable问题

使用redis缓存,做0侵入式设计;CacheInterceptor仅仅是对controller方法缓存,
jfinal是否有Cacheable类似的注解,应用于service层;
如果没有,如何在jfinal下自定义Cacheable注解?
spring下通过aop可以实现Cacheable注解功能,Jfinal下AOP没有切面,环绕的概念

评论区

JFinal

2019-09-20 16:33

可以完全参考 com.jfinal.plugin.ehcache 下面的设计,里头有 CacheInterceptor

逻辑是完全一样的,只不过前者将数据放 ehcache 中, 而你是需要将数据放 redis 中

jfinal 的 aop 设计,拦截器就是切面,环绕拦截的逻辑如下:

public MyInterceptor implements Interceptor {
public void intercept(Invocation inv) {
before();
inv.invoke();
after();
}

public void before() {
这里放上环绕拦截的前拦截代码
}

public void after() {
这里放上环绕拦截的后拦截代码
}

然后用 @Before 配置好就可以使用了
}

tntxie

2019-09-20 16:40

Interceptor 只能拦截controller内方法,如何做到在service层方法上添加缓存?

JFinal

2019-09-20 16:50

@tntxie 在 service 上也是类似的, 只不过 service 层上的拦截器无法通过调用下面的方法:
inv.getController()
inv.getActionKey()

这些方法可能你在生成缓存的 key 时需要使用, 但你可以换个思路解决,例如:
// 获取当前 service 的类名
String className = inv.getTarget().getClass().getName();

// 获取当前调用的方法的方法名:
String methodName = inv.getMethod().getName();

// 获取当前调用的方法的参数列表:
Class[] paraClasses = inv.getMethod().getParameterTypes();

// 获取当前调用的方法的参数值:
Object[] args = inv.getArgs();

然后通过组合上面 className、methodName、args 三个变量就可以组合得到一个可以使用的 key 值用于缓存了,paraClasses 这个变量或许还用不上

有了 className、methodName、args 三个变量,你自己再弄一个生成 key 值的工具方法,后面的代码就很好写了,与 com.jfinal.plugin.ehcache 下面的方案差不多

热门反馈

扫码入社