小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

利用Spring aop 自帶的ehcache來緩存對象。

 Joshua 2005-12-30
1.采用ehcache來緩存得到的對象結(jié)合Spring aop實現(xiàn)通過MethodCacheInterceptor類攔截器來實現(xiàn):
java代碼: 

/*
* 創(chuàng)建日期 2005-3-15
*
* TODO 要更改此生成的文件的模板,請轉(zhuǎn)至
* 窗口 - 首選項 - Java - 代碼樣式 - 代碼模板
*/

package com.cnsi.softer.interceptor.MethodCacheInterceptor;



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.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;


/**
* @author Administrator
*
* TODO 要更改此生成的類型注釋的模板,請轉(zhuǎn)至
* 窗口 - 首選項 - Java - 代碼樣式 - 代碼模板
*/

class MethodCacheInterceptor implements MethodInterceptor, InitializingBean {
        private static final Log logger = LogFactory.getLog(MethodCacheInterceptor.class);
       
        private Cache cache;
       
        public void setCache(Cache cache){
             this.cache = cache;       
        }
        /**
        *
        */

        public MethodCacheInterceptor() {
                super();
                // TODO 自動生成構(gòu)造函數(shù)存根
        }

          /**
           * 主方法
           * 如果某方法可被緩存就緩存其結(jié)果
           * 方法結(jié)果必須是可序列化的(serializable)
           */

          public Object invoke(MethodInvocation invocation) throws Throwable {
            String targetName  = invocation.getThis().getClass().getName();
            String methodName  = invocation.getMethod().getName();
            Object[] arguments = invocation.getArguments();
            Object result;

            logger.debug("在緩存中查找方法返回的對象!");
            String cacheKey = getCacheKey(targetName, methodName, arguments);
            Element element = cache.get(cacheKey);
            if (element == null) {
                 logger.debug("正在攔截方法!");
                 result = invocation.proceed();

                 logger.debug("正在緩存對象!");
                 element = new Element(cacheKey, (Serializable) result);
                 cache.put(element);
            }
            return element.getValue();
          }

          /**
           *創(chuàng)建一個緩存對象的標(biāo)識: 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();
          }



        /* £ǚÇ Javadoc)
        * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
        */

        public void afterPropertiesSet() throws Exception {
                Assert.notNull(cache, "需要一個緩存. 使用setCache(Cache)分配一個.");

        }

}


當(dāng)程序中的如create方法,update方法,delete方法修改了內(nèi)存中的對象值時,通過如下的通知來除去此對象:
java代碼: 

/*
* 創(chuàng)建日期 2005-3-15
*
* TODO 要更改此生成的文件的模板,請轉(zhuǎn)至
* 窗口 - 首選項 - Java - 代碼樣式 - 代碼模板
*/

package com.cnsi.softer.interceptor.MethodCacheInterceptor;

import java.lang.reflect.Method;

import net.sf.ehcache.Cache;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;

/**
* @author Administrator
*
* TODO 要更改此生成的類型注釋的模板,請轉(zhuǎn)至
* 窗口 - 首選項 - Java - 代碼樣式 - 代碼模板
*/

public class MethodCacheAfterAdvice implements AfterReturningAdvice,InitializingBean {
        private static final Log logger = LogFactory.getLog(MethodCacheAfterAdvice.class);
       
        private Cache cache;
       
        public void setCache(Cache cache){
             this.cache = cache;       
        }
        /**
        *
        */

        public MethodCacheAfterAdvice() {
                super();
        }

        /* (非 Javadoc)
        * @see org.springframework.aop.AfterReturningAdvice#afterReturning(java.lang.Object, java.lang.reflect.Method, java.lang.Object[], java.lang.Object)
        */

        public void afterReturning(Object arg0, Method arg1, Object[] arg2,
                        Object arg3) throws Throwable {
                    StringBuffer buffer = new StringBuffer();
                    buffer.append(arg3.getClass().getName()).append(".").append(arg1.getName());
                    if (arg2 != null&&arg2.length != 0){
                              for (int i=0; i<arg2.length; i++) {
                                buffer.append(".")
                                  .append(arg2[i]);
                              }
                           
                    }
                    cache.remove(buffer);
        }

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

        public void afterPropertiesSet() throws Exception {
                Assert.notNull(cache, "需要一個緩存. 使用setCache(Cache)分配一個.");
    }

}


2.我的配置文件如下:
由于發(fā)現(xiàn)直接把文件貼出來,定義的bean標(biāo)簽都不見了,所以還是上傳一個文件附件吧,大家打開文件看看

假若可以這樣配置是不是在serviceCache和serviceCacheAdvice對象中就會存在多個target對象,對內(nèi)存的要求就會增大呢?
3.這樣配置后,就可以了對巴,用不用在其他地方注入newsServiceCache,和newsServiceCacheAdvice。是自動執(zhí)行的對巴

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多