利用SpringAOP手動實現一個緩存

場景:物流系統庫存管理模塊 : 用戶登錄、倉庫增刪改查spring JdbcTemplate實現數據層操作。

爲了減少DB的IO次數,配置AOP切面,用Map手動實現一個緩存:在添加、修改、刪除倉庫時,清空緩存;查詢倉庫列表或者查詢每個倉庫信息時,加載數據到緩存.

實現:

切面:

package main.com.store.aop;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import main.com.store.domain.Store;
import org.aspectj.lang.ProceedingJoinPoint;
/**
 * AOP緩存切面
 *
 * @author lee
 *
 */
@SuppressWarnings("all")
public class CacheAspect {
    // 爲了線程安全,使用Collections.synchronizedMap(new HashMap());
    private static Map<String, Object> aopCahche = Collections.synchronizedMap(new HashMap<String, Object>());
    // private static Map<String, Object> aopCahche = new HashMap<String, Object>();
    public static Map<String, Object> getAopCahche() {
        return aopCahche;
    }
    public static void setAopCahche(Map<String, Object> aopCahche) {
        CacheAspect.aopCahche = aopCahche;
    }
    public static List<Store> doCacheList(ProceedingJoinPoint point) throws Throwable {
        List<Store> result = (List<Store>) point.proceed();
        return result;
    }
    public static Store doCacheSingle(ProceedingJoinPoint point) throws Throwable {
        Store result = (Store) point.proceed();
        return result;
    }
    public static void clearCache() {
        aopCahche = new HashMap<String, Object>();
        System.out.println("清空緩存成功!");
    }
}

Dao

package main.com.store.dao;
import java.util.List;
import main.com.store.domain.Store;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
@SuppressWarnings("all")
public class StoreDao extends HibernateDaoSupport {
    /**
     * 查詢所有倉庫信息
     *
     * @return
     */
    public List<Store> findAllStores() {
        List<Store> stores = this.getHibernateTemplate().find("from Store");
        return stores;
    }
    /**
     * 增加倉庫信息
     *
     * @param store
     */
    public void add(Store store) {
        this.getHibernateTemplate().save(store);
    }
    /**
     * 刪除倉庫信息
     *
     * @param id
     */
    public void delete(Store store) {
        this.getHibernateTemplate().delete(store);
    }
    /**
     * 根據id查詢倉庫信息
     *
     * @param id
     * @return
     */
    public Store getStoreById(String id) {
        Store result = null;
        result = this.getHibernateTemplate().get(Store.class, id);
        return result;
    }
    /**
     * 修改倉庫信息
     *
     * @param store
     */
    public void update(Store store) {
        this.getHibernateTemplate().update(store);
    }
}

VO

package main.com.store.domain;
/**
 * 倉庫
 *
 * @author lee
 *
 */
public class Store {
    /** 倉庫編號 */
    private String id;
    /** 倉庫名稱 */
    private String name;
    /** 倉庫所在地 */
    private String addr;
    /** 倉庫管理人員 */
    private String manager;
    public Store() {
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddr() {
        return addr;
    }
    public void setAddr(String addr) {
        this.addr = addr;
    }
    public String getManager() {
        return manager;
    }
    public void setManager(String manager) {
        this.manager = manager;
    }
    @Override
    public String toString() {
        return "Store [id=" + id + ", name=" + name + ", addr=" + addr + ", manager=" + manager + "]";
    }
}

Service

package main.com.store.service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import main.com.store.aop.CacheAspect;
import main.com.store.dao.StoreDao;
import main.com.store.domain.Store;
public class StoreService {
    private StoreDao storeDao;
    public void setStoreDao(StoreDao storeDao) {
        this.storeDao = storeDao;
    }
    /**
     * 查詢所有倉庫信息
     */
    public List<Store> findAllStores() {
        List<Store> stores = new ArrayList<Store>();
        // 獲取緩存中值,如果有
        Map<String, Object> cacheMap = CacheAspect.getAopCahche();
        Set<Entry<String, Object>> entrySet = cacheMap.entrySet();
        if (!CacheAspect.getAopCahche().isEmpty()) {
            System.out.println("查詢緩存");
            for (Entry<String, Object> entry : entrySet) {
                String key = entry.getKey().toString();
                System.out.println(key);
                Store store = (Store) entry.getValue();
                stores.add(store);
            }
        } else {
            System.out.println("查詢數據庫");
            stores = storeDao.findAllStores();
            for (Store store : stores) {
                cacheMap.put(store.getId(), store);
            }
        }
        return stores.isEmpty() ? null : stores;
    }
    /**
     * 根據id查詢倉庫信息
     *
     * @param id
     * @return
     */
    public Store findStoreById(String id) {
        Store store = new Store();
        // 獲取緩存中值,如果有
        Map<String, Object> cacheMap = CacheAspect.getAopCahche();
        Set<Entry<String, Object>> entrySet = cacheMap.entrySet();
        if (!cacheMap.isEmpty()) {
            System.out.println("查詢緩存");
            for (Entry<String, Object> entry : entrySet) {
                String key = entry.getKey().toString();
                System.out.println(key);
                store = (Store) entry.getValue();
            }
        } else {
            System.out.println("數據庫");
            store = storeDao.getStoreById(id);
            cacheMap.put(store.getId(), store);
        }
        return store;
    }
    /**
     * 增加倉庫
     *
     * @param store
     */
    public void add(Store store) {
        storeDao.add(store);
    }
    /**
     * 刪除倉庫信息
     *
     * @param id
     */
    public void delete(Store store) {
        storeDao.delete(store);
    }
    /**
     * 修改倉庫信息
     *
     * @param store
     */
    public void update(Store store) {
        storeDao.update(store);
    }
}

applicationContext.xml

<bean id="cacheAdvice" class="main.com.store.aop.CacheAspect" />
<aop:config proxy-target-class="true">
<aop:aspect ref="cacheAdvice">
            <aop:pointcut expression="execution(* main.com.store.service.StoreService.findAllStores(..))" id="cacheList" />
            <aop:around method="doCacheList" pointcut-ref="cacheList"/>
            <aop:pointcut expression="execution(* main.com.store.service.StoreService.findStoreById(..))" id="cacheSingle" />
            <aop:around method="doCacheSingle" pointcut-ref="cacheSingle"/>
            <aop:pointcut expression="execution(* main.com.store.service.StoreService.add(..))" id="clearAdd" />
            <aop:pointcut expression="execution(* main.com.store.service.StoreService.delete(..))" id="clearDelete" />
            <aop:pointcut expression="execution(* main.com.store.service.StoreService.update(..))" id="clearUpdate" />
            <aop:before method="clearCache" pointcut-ref="clearAdd"/>
            <aop:before method="clearCache" pointcut-ref="clearDelete"/>
            <aop:before method="clearCache" pointcut-ref="clearUpdate"/>
        </aop:aspect>
    </aop:config>
<!-- 倉庫管理 -->
    <bean id="storeDao" class="main.com.store.dao.StoreDao">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <bean id="storeService" class="main.com.store.service.StoreService">
        <property name="storeDao" ref="storeDao" />
    </bean>
    <bean id="storeAction" class="main.com.store.web.StoreAction">
        <property name="storeService" ref="storeService" />
    </bean>

OK ! 完工!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章