spring框架下缓存与工具类的结合

   实现缓存的方式有很多,而在spring框架下,通常我们可以通过它的单例模式简单达到缓存对象的目的。
   这里着重介绍缓存信息如何达到在系统启动时初始化,并延伸出简单的使用缓存工具类,达到两者较好的结合效果。
下面首先介绍缓存老大,缓存工厂(CacheFactory),因为下面所有的说明都以此为依据,那么先看看这个缓存工厂的定义吧。

/**
 * <p>缓存工厂</p>
 */
public interface CacheFactory {

    /**
     * 刷新配置中的所有缓存
     */
    public void refresh();
    
    /**
     * 获取缓存配置
     * @param cacheTypeEnum 缓存类型
     * @return
     */
    public Map<String, CachedObject> getCacheByType(CacheTypeEnum cacheTypeEnum);
}

   缓存工厂包含两个方法,一个是缓存刷新,一个是获取某个类型下的缓存内容。(这里说的CacheTypeEnum也就是缓存类型枚举定义,自己可以根据业务需要添加。)
这是缓存最基本的要求,即数据的输入和输出。掩藏在缓存工厂下面的就是具体业务的缓存模具了,针对不同的业务,你可以从数据库、或者从文件等数据来源获取需要缓存的信息,具体实现这里就不赘述,相信实现这个不复杂。

  现在我们关心的问题是,现在有了这个缓存工厂,难道在每次需要用缓存数据的时候再注入CacheFactory实例来获取,这样就到处充斥着缓存的东西了,为了让业务不关心这些琐碎的事情,可以引入具体业务的缓存工具。如AreaUtil地区信息工具类,在此工具类里完成对缓存工厂的封装。我们可以抽出一个缓存工具基类,所有其他业务工具类继承此类。

/**
 * <p>缓存工具基类</p>
 */
public class CacheUtilBase {
    /** 缓存工厂
     * 
     * 所有子类都共用一份引用,此引用在<code>cacheFactory</code>初始化完成时设置
     */
    protected static CacheFactory cacheFactory;

    public static void setCacheFactory(CacheFactory cacheFactory) {
        CacheUtilBase.cacheFactory = cacheFactory;
    }
}

 这里也随之带来了我们需要关心的问题,即我们希望通过static的方式访问工具类方法,所以cacheFactory属性也必须是static的。那什么时候来初始化这个工厂实例呢?废话,肯定要在工厂实例初始化完成之后喽,呵呵。那你怎么
知道他初始化完成了呢,这个时候可以通过实现spring的BeanPostProcessor接口,在此实现中完成两件事:1、刷新缓存工厂下的所有缓存;2、初始化缓存工具基类的工厂实例属性。

/**
 * <p>容器bean初始化处理实现</p>
 * 
 * 针对bean初始化完成前后的特殊处理在此完成。
 */
public class InstantiationBeanPostProcessor implements BeanPostProcessor {
    private static final Logger logger = Logger.getLogger(InstantiationBeanPostProcessor.class);

    /*
     * (non-Javadoc)
     * @see org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization(java.lang.Object, java.lang.String)
     */
    public Object postProcessAfterInitialization(Object bean, String beanName)
                                                                              throws BeansException {
        // 初始化缓存
        if (bean instanceof CacheFactory) {
            if (logger.isInfoEnabled()) {
                logger.info("执行缓存初始化");
            }
            CacheFactory cacheFactory = (CacheFactory) bean;
            // 初始化工具类缓存信息
        CacheUtilBase.setCacheFactory(cacheFactory);

            // 缓存刷新
        cacheFactory.refresh(true);
        }

        return bean;
    }

    /*
     * (non-Javadoc)
     * @see org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization(java.lang.Object, java.lang.String)
     */
    public Object postProcessBeforeInitialization(Object bean, String beanName)
                                                                               throws BeansException {
        // do nothing
        return bean;
    }
}

 

通过注册InstantiationBeanPostProcessor,spring在初始化bean实例的时候就会可以完成对缓存工厂实例的操作了,这样就大功告成了。
系统启动之日,即缓存工作之时,yeah!

你可能感兴趣的:(spring,框架,bean,工作)