JFINAL注解如何清除多个缓存?报错-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

JFINAL注解如何清除多个缓存?报错

2020-06-06 10:49:40 259 1

jfinal注解清除缓存,如何清除多个,@CacheName("order_cache","order_cache")这种写法报错,

也无法多个@CacheName

取消 提交回答
全部回答(1)
  • 爱吃鱼的程序员
    2020-06-06 10:49:57
                        <p>扒一下 <strong>EvictInterceptor.java</strong> 自己做一个啦。</p> 
    

    自己做一个 EvictInterceptor 的子类 MultiEvictInterceptor ,主要功能是 增强 原先父类的业务,支持自己定义的注解,并且也支持 原先 JFinal 的 CacheName 注解。

    自己写一个注解 MultiCacheName :

    package com.rocbin.demo;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface MultiCacheName {
        String[] value();
    }
    

    拦截器和注解结合的桥梁就是通过 Java 反射,通过反射来获取 被调用的 Method(方法)的注解,然后进一步取得注解配置的信息,最后做一些基于配置的反应操作。

    想要搞懂那就去看 EvictInterceptor.java ,估计里面都涉及到上面的知识点。

    最后,建议一点点,反射 Method 最好能加一个 Cache:

    ConcurrentHashMap<Method, String[]> MultiEvictCacheNameMap;
    // KEY 存对于的 Method
    // VALUE 是 对应注解上面的信息,下次取缓存,如命中则无需再次反射。

     

                        <p>拦截器代码实现只是增强一下,支持自己的注解也支持 JFinal 的注解: </p> 
    
    package com.rocbin.demo;
    
    public class MultiEvictInterceptor extends com.jfinal.plugin.ehcache.EvictInterceptor implements Interceptor {
    	
    	final public void intercept(Invocation inv) {
    		inv.invoke();
    		String name = buildCacheName(inv);
            String[] multiName = buildMultiCacheName(inv);
            Set<String> nameSet = new HashSet();
            if(name!=null)
               nameSet.add(name);
            nameSet.addAll(Arrays.asList(multiName));
    
    		if (nameSet.isEmpty())
    			throw new RuntimeException("MultiEvictInterceptor need CacheName or MultiCacheName annotation in controller.");
            for(String name: nameSet)
    		   CacheKit.removeAll(name);
    	}
    	
    	private String[] buildMultiCacheName(Invocation inv) {
    		MultiCacheName cacheName = inv.getMethod().getAnnotation(MultiCacheName.class);
    		if (cacheName != null)
    			return cacheName.value();
    		cacheName = inv.getController().getClass().getAnnotation(MultiCacheName.class);
    		return cacheName != null ? cacheName.value() : new String[]{};
    	}
    	
    	private String buildCacheName(Invocation inv) {
    		CacheName cacheName = inv.getMethod().getAnnotation(CacheName.class);
    		if (cacheName != null)
    			return cacheName.value();
    		
    		cacheName = inv.getController().getClass().getAnnotation(CacheName.class);
    		return cacheName != null ? cacheName.value() : null;
    	}
    }

     

                            又是 业务注解,又是 <a class="referer" target="_blank">@Before</a> ,写多了就累赘,全局 拦截器 自动按 Method 注解 查找 注册的 拦截器 调用处理,更完美。<a class="referer" target="_blank">@JFinal</a> 
                        
    
                        <p>建议扩展一下 EvictIntercpetor 用于支持这种形式: @CacheName("order_cache","order_cache")这种写法报错</p> 
    

     

    扩展起来很容易,基本就是添加一个 cacheName.splite(",") 就可以了

    0 0
相关问答

1

回答

在Vagrant中如何删除虚拟机?

2021-10-29 17:26:08 254浏览量 回答数 1

0

回答

如何缓解开发者感受着日新月异的技术发展所带来技术能力提升的焦虑

2021-10-02 20:02:00 142浏览量 回答数 0

0

回答

多进程写日志造成的混乱:报错

2020-06-14 09:08:27 259浏览量 回答数 0

1

回答

logback和log4j能共存吗??报错

2020-06-10 14:22:12 841浏览量 回答数 1

0

回答

#职场 7期 销售时间片的方式

2020-05-01 17:12:52 611浏览量 回答数 0

1

回答

因公司申请ICP许可证需要阿里云的ISP、IDC资质,如何申请?

2019-03-11 16:08:19 229浏览量 回答数 1

1

回答

删除vpc报错

2018-09-11 11:46:10 488浏览量 回答数 1

0

回答

如何删除主题?

2017-10-24 11:13:36 1295浏览量 回答数 0

1

回答

关于电商购物车的缓存设计的问题

2016-03-03 17:14:11 3410浏览量 回答数 1

1

回答

如何用多个线程顺序读取缓存队列?

2016-02-29 17:01:05 2813浏览量 回答数 1
+关注
爱吃鱼的程序员
https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
2
文章
21564
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载