<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    輕松

    記述我學(xué)習(xí)java的里程

    常用鏈接

    統(tǒng)計

    積分與排名

    友情鏈接

    最新評論

    利用Spring AOP 緩存方法結(jié)果集

    我們都知道Hibernate可以用ehcache來作為Second Level Cache.主要是針對POJO的緩存,而且緩存的讀取

    Hibernate中是寫死.實際運用中感覺很不靈活.今天看到一篇介紹利用Spring Interceptor 來緩存指定

    方法結(jié)果的例子,感覺很不錯,充分體會到AOP的強大力量 :)

    首先配置ehcache.xml

     <ehcache>

        <diskStore path="java.io.tmpdir"/>

        <cache name="org.taha.cache.METHOD_CACHE"

            maxElementsInMemory="300"

            eternal="false"

            timeToIdleSeconds="500"

            timeToLiveSeconds="500"

            overflowToDisk="true"

            />

    </ehcache>

     

    接下在Spring配置文件中定義Ehcache組件

     

    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">

      <property name="configLocation">

        <value>classpath:ehcache.xml</value>

      </property>

    </bean>

     

    <bean id="methodCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">

      <property name="cacheManager">

        <ref local="cacheManager"/>

      </property>

      <property name="cacheName">

        <value>org.taha.cache.METHOD_CACHE</value>

      </property>

    </bean>

    建立我們自己的方法攔截器MethodCacheInterceptor.

    MethodCacheInterceptor實現(xiàn)了org.aopalliance.intercept.MethodInterceptor接口.

    import java.io.Serializable;

     

    import net.sf.ehcache.Cache;

    import net.sf.ehcache.Element;

     

    import org.aopalliance.intercept.MethodInterceptor;

    import org.aopalliance.intercept.MethodInvocation;

    import org.springframework.beans.factory.InitializingBean;

     

    /**

     * 攔截器,用于緩存方法返回結(jié)果.

     *

     * @version $Id: MethodCacheInterceptor.java v 1.0 2004-11-28 14:57:00 Znjq Exp $

     * @author <a href="mailto:znjq1980@etang.com">Znjq </a>

     */

    public class MethodCacheInterceptor implements MethodInterceptor,

            InitializingBean {

        private Cache cache;

     

        /**

         * sets cache name to be used

         */

        public void setCache(Cache cache) {

            this.cache = cache;

        }

     

        /*

         * (non-Javadoc)

         *

         * @see org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept.MethodInvocation)

         */

        public Object invoke(MethodInvocation invocation) throws Throwable {

           String targetName = invocation.getThis().getClass().getName();

            String methodName = invocation.getMethod().getName();

            Object[] arguments = invocation.getArguments();

            Object result;

     

            String cacheKey = getCacheKey(targetName, methodName, arguments);

            Element element = cache.get(cacheKey);

            if (element == null) {

                //call target/sub-interceptor

                result = invocation.proceed();

     

                //cache method result

                element = new Element(cacheKey, (Serializable) result);

                cache.put(element);

            }

            return element.getValue();

        }

     

        /**

         * creates cache key: targetName.methodName.argument0.argument1...

         */

        private String getCacheKey(String targetName, String methodName,

                Object[] arguments) {

            StringBuffer sb = new StringBuffer();

            sb.append(targetName).append(".").append(methodName);

            if ((arguments != null) && (arguments.length != 0)) {

                for (int i = 0; i < arguments.length; i++) {

                    sb.append(".").append(arguments[i]);

                }

            }

     

            return sb.toString();

        }

     

        /*

         * (non-Javadoc)

         *

         * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()

         */

        public void afterPropertiesSet() throws Exception {

            // TODO Auto-generated method stub

     

        }

    }

    invoke方法中,首先根據(jù)key查詢緩存(key=className + methodName + arguments)

    ,緩存中存在則返回,否之調(diào)用invocation.proceed()返回結(jié)果.

    Spring配置文件中定義攔截器

    <bean id="methodCacheInterceptor" class="org.taha.interceptor.MethodCacheInterceptor">

      <property name="cache">

        <ref local="methodCache" />

      </property>

    </bean>

     

    <bean id="methodCachePointCut" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">

      <property name="advice">

        <ref local="methodCacheInterceptor"/>

      </property>

      <property name="patterns">

        <list>

          <value>.*methodOne</value>

          <value>.*methodTwo</value>

        </list>

      </property>

    </bean>

     

    <bean id="myBean" class="org.springframework.aop.framework.ProxyFactoryBean">

      <property name="target">

       <bean class="org.taha.beans.MyBean"/>

      </property>

      <property name="interceptorNames">

        <list>

          <value>methodCachePointCut</value>

        </list>

      </property>

    </bean>

    這里org.springframework.aop.support.RegexpMethodPointcutAdvisor是一個正規(guī)表達式切入點,

    使用Perl 5的正規(guī)表達式的語法, Jakarta ORO(有空寫個文檔,自己研究一下).

      <property name="target">

       <bean class="org.taha.beans.MyBean"/>

      </property>

    org.taha.beans.MyBean是我們需要做緩存處理的類.

    methodCachePointCut

    <value>.*methodOne</value>

    <value>.*methodTwo</value>

    則是指定的模式匹配方法,對應(yīng)于org.taha.beans.MyBean中的方法. 這里指定了2個方法需要做緩存處理.

    呵呵,就是這么簡單.這樣每次對org.taha.beans.MyBeanmethodOne方法進行調(diào)用,都會首先從緩存查找,

    其次才會查詢數(shù)據(jù)庫. 這樣我就不需要在xx.hbm.xml來指定討厭的cache.也不需要在開發(fā)階段來關(guān)心緩存.

    一切AOP搞定.. ^_^

    posted on 2005-04-11 15:17 輕松 閱讀(4243) 評論(3)  編輯  收藏 所屬分類: JAVA轉(zhuǎn)貼

    評論

    # re: 利用Spring AOP 緩存方法結(jié)果集 2006-11-28 10:08 Tang Anping

    踏破鐵鞋無覓處,得來全不費工夫。
    一下子,這幾天的難題都解決了,謝謝!
    有一個小問題,好像使用默認(rèn)的cglib會報錯,設(shè)置target即可。  回復(fù)  更多評論   

    # re: 利用Spring AOP 緩存方法結(jié)果集 2008-11-27 17:00 ww

    如何對ModelAndView進行緩存啊  回復(fù)  更多評論   

    # re: 利用Spring AOP 緩存方法結(jié)果集 2010-08-29 08:05 lwq

    沒有大小設(shè)定嗎?
    會不會導(dǎo)致內(nèi)存溢出?  回復(fù)  更多評論   

    主站蜘蛛池模板: 全部免费毛片在线播放| 久久午夜免费视频| 91精品国产亚洲爽啪在线影院| 国产成人亚洲精品91专区手机 | 亚洲av无码成人黄网站在线观看| 亚洲欧洲自拍拍偷综合| 免费的一级片网站| 国产精品无码永久免费888| 久久丫精品国产亚洲av不卡| 国产精品无码免费视频二三区| 亚洲大片免费观看| 亚洲国产一区视频| 国产曰批免费视频播放免费s | 456亚洲人成影院在线观| 亚洲AV无码专区日韩| 久别的草原电视剧免费观看| 亚洲精品国产suv一区88| 国产亚洲人成网站在线观看不卡| 一级毛片不卡免费看老司机| 亚洲天堂中文字幕在线观看| 亚洲人成网站在线观看青青| 亚洲美女视频免费| 亚欧国产一级在线免费| 亚洲精华液一二三产区| 香蕉蕉亚亚洲aav综合| 亚洲JIZZJIZZ中国少妇中文| 久久久久久99av无码免费网站| 91丁香亚洲综合社区| 爱情岛论坛网亚洲品质自拍| 青青草免费在线视频| 免费无码毛片一区二区APP| 一级**爱片免费视频| 亚洲精品动漫免费二区| 亚洲宅男精品一区在线观看| 亚洲国产一区在线| 国内精品99亚洲免费高清| 大香人蕉免费视频75| 日韩国产免费一区二区三区| 日韩免费高清大片在线| 国产午夜精品理论片免费观看| 亚洲美女色在线欧洲美女|