文档章节

基于AOP的缓存

顾志雄
 顾志雄
发布于 2016/06/30 10:14
字数 673
阅读 75
收藏 2

在实际的开发框架中,需要用到缓存,很多时候,我们的缓存是基于ORM框架的缓存,使用起来不能满足实际情况

目前我们的开发是按照接口来开发的,需要在service 层就使用缓存,如CMS中的文章等等。故我们设计了基于AOP的缓存框架

不多说,直接贴代码

annotation:

package com.lsxin.framework.annotation;

import com.lsxin.framework.annotation.constant.CacheExpirationTime;
import com.lsxin.framework.annotation.constant.CacheType;

import java.lang.annotation.*;

/**
 * ***************************************************************
 * <pre>
 * Copyright (c) 2016 –苏州利盛欣信息科技有限公司
 *  Title: com.lsxin.framwork.annotation
 *  Description:
 *  History:
 * <p> 2016/3/21 init</p>
 * ***************************************************************
 *  2016/3/21   V1.0  guzhixiong    New Files for framework
 * </pre>
 */
@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LsxCache {
    /**
     * 缓存类型
     * @return
     */
    CacheType cacheType() default CacheType.CACHE;

    /**
     * 缓存名称
     * @return
     */
    String cacheName();

    /**
     * 过期时间
     * @return
     */
    CacheExpirationTime expirationTime() default CacheExpirationTime.ONE_DAY;
}

缓存Aop 缓存的AOP是基于Annotation的

package com.lsxin.framework.support.spring;

import com.alibaba.fastjson.JSON;
import com.lsxin.framework.annotation.LsxCache;
import com.lsxin.framework.annotation.constant.CacheType;
import com.lsxin.framework.cache.LsxCacheManager;
import com.lsxin.framework.log.LsxLog;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * ***************************************************************
 * <pre>
 * Copyright (c) 2016 –苏州利盛欣信息科技有限公司
 *  Title: com.lsxin.framework.support.spring
 *  Description:缓存拦截Aop
 *  History:
 * <p> 2016/3/24 init</p>
 * ***************************************************************
 *  2016/3/24   V1.0  guzhixiong    New Files for framework
 * </pre>
 */
@Aspect
public class CacheAop {
    private LsxLog log = LsxLog.getInstance(MethodAop.class,"framework");
    // 缓存
    @Autowired(required = false)
    private LsxCacheManager cacheManager;
    @Pointcut("@annotation(com.lsxin.framework.annotation.LsxCache)")
    public void cachePointcut() {
    }
    @Around("cachePointcut()&& @annotation(lsxCache)")
    public Object aroundMethod(ProceedingJoinPoint joinPoint,LsxCache lsxCache) throws Throwable {
        //原方法名
        String methodName = joinPoint.getSignature().getName();
        if(lsxCache !=null){
            if (lsxCache.cacheType().equals(CacheType.CACHE)) {
                Object[] arguments = joinPoint.getArgs();
                String cacheKey = getCacheKey(lsxCache.cacheName(), methodName, arguments);
                Object data = cacheManager.get(lsxCache.cacheName(),cacheKey);
                if(data==null){
                    data = joinPoint.proceed();
                    cacheManager.set(lsxCache.cacheName(),cacheKey,data);
                }
                log.i("{} use cache: {} ",methodName,lsxCache.cacheName());
                return data;
            }
            if(lsxCache.cacheType().equals(CacheType.CACHE_UPDATE)){
                cacheManager.clear(lsxCache.cacheName());
                log.i("{} clear cache: {}",methodName,lsxCache.cacheName());
            }
        }
        return joinPoint.proceed();
    }

    private String getCacheKey(String className, String methodName, Object[] arguments) {
        StringBuffer sb = new StringBuffer();
        sb.append(className).append(".").append(methodName);
        if ((arguments != null) && (arguments.length != 0)) {
            for (int i = 0; i < arguments.length; i++) {
                sb.append(".").append(JSON.toJSONString(arguments[i]));
            }
        }
        return sb.toString();
    }

    public void setCacheManager(LsxCacheManager cacheManager) {
        this.cacheManager = cacheManager;
    }
}

Cache 接口类,在开发中,我们可以根据不同的情况实现不同的缓存(redis mongodb等) 即可

package com.lsxin.framework.cache;

import java.util.List;

/**
 * ***************************************************************
 * <pre>
 * Copyright (c) 2016 –苏州利盛欣信息科技有限公司
 *  Title: com.lsxin.framwork.cache
 *  Description:缓存接口
 *  History:
 * <p> 2016/3/22 init</p>
 * ***************************************************************
 *  2016/3/22   V1.0  guzhixiong    New Files for framework
 * </pre>
 */
public interface LsxCacheManager {
    /**
     * 设置缓存
     * @param name
     * @param key
     * @param value
     */
    public void set(String name, Object key, Object value) throws CacheException;

    /**
     * 获取缓存
     * @param name
     * @param key
     * @return
     */
    public Object get(String name,Object key) throws CacheException;

    /**
     * 获取缓存
     * @param resultClass
     * @param name
     * @param key
     * @param <T>
     * @return
     */
    public <T> T get(Class<T> resultClass, String name, Object key) throws CacheException;

    /**
     * 删除一个数据
     * @param name
     * @param key
     */
    public void  delete(String name, Object key) throws CacheException;

    /**
     * 批量删除
     * @param name
     * @param keys
     */
    public void batchDelete(String name,List keys) throws CacheException;

    /**
     * 清空数据
     * @param name
     */
    public void clear(String name) throws CacheException;

    /**
     * 获取所有的缓存键值
     * @param name
     * @return
     * @throws CacheException
     */
    public List keys(String name) throws CacheException;
}

使用:

 在使用的时候,只需要配置aop 如下图

在实际使用中只需要在对应的代码上面只需要打上cache 的注解即可,是不是很方便

© 著作权归作者所有

顾志雄
粉丝 13
博文 9
码字总数 14869
作品 0
苏州
高级程序员
私信 提问
AutoLoadCache 2.8 发布,缓存管理方案

AutoLoadCache 2.8 发布,此版本主要优化通过反射生成缓存Key的方法,将反射结果放入内存,提升反射效率。 在2.7版本中解决了, 当参数类型为 Class,自动生成的缓存Key会出问题。 AutoLoad...

qiujiayu
2016/01/19
2.7K
4
Smart framework 缓存插件的实现

Smart是一个轻量级的java web框架,里面已经实现了IOC,AOP以及事务管理,同时也实现了MVC模块。本插件是基于Smart的AOP来进行实现的。目标是:在不需要改变当前业务代码的情况下将缓存功能嵌...

Bieber
2013/11/02
1K
2
一个基于 JFinal 的微服务框架-Jboot

JBoot 是什么 Jboot,专为大型分布式项目和微服务而生。她是一个基于jfinal 和 undertow开发的微服务框架。提供了AOP、RPC、分布式缓存、限流、降级、熔断、统一配置中心、swagger api自动生...

michaely
2017/06/05
38.1K
50
justlive1/oxygen

oxygen 轻量级Java框架 介绍 一个轻量级Java框架 oxygen-core 核心部分 基于cglib的aop实现 提供缓存管理和基于注解的缓存,内置LocalCache和Ehcache实现,可扩展 配置管理,支持${attrs.key...

justlive1
2018/10/08
0
0
Jboot v1.1.0 发布,小步快跑,唯快不破

Jboot是一个基于jfinal 和 undertow开发的微服务框架。提供了AOP、RPC、分布式缓存、限流、降级、熔断、统一配置中心、swagger api自动生成、Opentracing数据追踪、metrics数据监控、分布式s...

理工男海哥
2017/11/28
2.4K
12

没有更多内容

加载失败,请刷新页面

加载更多

崛起于Springboot2.X之5分钟解决单点登陆(53)

SpringBoot2.X心法总纲 1、pom文件依赖 <dependency> <groupId>com.majiaxueyuan</groupId> <artifactId>sso-core</artifactId> <version>1.2.2</version></dependency> 2、......

木九天
13分钟前
13
0
面向对象和面向过程的区别

面向过程 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。 缺点:没有面向对...

无名氏的程序员
15分钟前
10
0
OpenStack大事记

2010年7月19日,Rackspace、NASA、Citrix、Dell共同开发并发布OpenStack第一个版本。 2011年10月,Rackspace放弃OpenStack控制权,交由一新成立的OpenStack基金会管理。 2012年5月NASA宣布退...

大别阿郎
15分钟前
8
0
面向对象的简单应用—以交通工具(Vehicle)为列

请定义一个交通工具(Vehicle)的类其中有: 属性: 速度(speed)、 体积(size)等,方法:移动(move())、设置速度(setSpeed(int speed))、加速 speedUp()、减速 speedDown()等。最后在测试类 Ve...

INEVITABLE
26分钟前
7
0
通往艺术家之路

通往艺术家之路 并发编程中,开发者往往需要权衡锁的颗粒粗细,锁住的代码块太大呢会导致可能的线程堵塞,锁的颗粒太细呢又会因为频繁地加锁解锁导致系统用户态内核态的转换从而消费很多时间...

StupidZhe
27分钟前
22
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部