注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

和申的个人主页

专注于java开发,1985wanggang

 
 
 

日志

 
 

spring2.0中使用Aspect方式进行AOP如何得到method对象  

2010-11-16 15:13:36|  分类: Spring |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Signature signature = a_joinPoint.getSignature();   
MethodSignature methodSignature = (MethodSignature) signature;   
Method method = methodSignature.getMethod();   
  
try  
{   
    Object[] arguments = a_joinPoint.getArgs();   
    result = method.invoke(mock, arguments);   
    s_logger.debug("Mocking " + formatCall(a_joinPoint));   
}   
catch (InvocationTargetException e)   
{   
    s_logger.debug("Failed to delegate to mock: "  
            + formatCall(a_joinPoint), e);   
    throw e.getTargetException();   
}  
=============================================

import java.io.Serializable;
import java.lang.reflect.Method;

import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;

import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;

/**
 * @author Administrator
 *
 *         TODO 缓存处理
 */
public class ServiceMethodCacheInterceptor implements InitializingBean {

 private Logger logger = Logger.getLogger("Method-Cache-Inegceptor");

 private Cache serviceCache;

 /**
  * 设置缓存名
  */
 public void setServiceCache(Cache serviceCache) {
  this.serviceCache = serviceCache;
 }

 /**
  * 主方法 如果某方法可被缓存就缓存其结果 方法结果必须是可序列化的(serializable)
  */
 public Object doCacheOperation(ProceedingJoinPoint pjp)
   throws Throwable {

  String targetName = pjp.getTarget().getClass().getName();
  Signature signature = pjp.getSignature();
  MethodSignature methodSignature = (MethodSignature) signature;
  Method method = methodSignature.getMethod();

  // String methodName = pjp.getThis()methodName.
  // invocation.getMethod().getName();
  String methodName = method.getName();

  Object[] arguments = pjp.getArgs();// invocation.getArguments();
  Object result;
  // logger.info("looking for method result in cache");
  String cacheKey = getCacheKey(targetName, methodName, arguments);
  logger.info("cache key" + cacheKey);
  Element element = serviceCache.get(cacheKey);
  if (element == null) {
   // call target/sub-interceptor
   logger.info("calling intercepted method");
   result = pjp.proceed();

   // cache method result
   logger.info("caching result");
   element = new Element(cacheKey, (Serializable) result);
   serviceCache.put(element);
  }
  return element.getValue();

 }

 /**
  * creates cache key: targetName.methodName.argument0.argument1...
  */
 private String getCacheKey(String targetName, String methodName,
   Object[] arguments) throws Exception {
  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();
 }
 
 /**
  * 检查是否提供必要参数。
  */
 public void afterPropertiesSet() throws Exception {
  Assert.notNull(serviceCache,
    "A cache is required. Use setCache(Cache) to provide one.");
 }

========================================

<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 http://www.springframework.org/schema/tx
 http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
 http://www.springframework.org/schema/aop
 http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
 default-autowire="byName">
   
  
    <bean id="serviceMethodCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">  
        <property name="cacheManager">
         <ref bean="cacheManager"/> 
        </property>  
        <!-- 设置所使用的cache name -->
        <property name="cacheName">  
            <value>testSeviceCache</value>
        </property>  
    </bean> 
  
 <aop:config>
   <aop:aspect id="cacheOperation" ref="serviceMethodCacheInterceptor">
     <aop:pointcut id="testServiceCacheCut"
         expression="execution(* com.my163.service.impl.CacheServiceImpl.*(..))"/>
     <aop:around
        pointcut-ref="tesServiceCacheCut"
        method="doCacheOperation"/>
   </aop:aspect>
 </aop:config>
 <bean id="serviceMethodCacheInterceptor" class="com.my163.cache.ServiceMethodCacheInterceptor">
      <property name="serviceCache">  
            <ref local="serviceMethodCache" />  
        </property>  
 </bean>
 
</beans>

  评论这张
 
阅读(1371)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016