java aop实用小案例

来源:互联网 发布:闲鱼申请淘宝介入步骤 编辑:程序博客网 时间:2024/05/16 07:12

spring配置文件

 <!-- Spring AOP config 
   (* com.evan.crm.service.*.*(..))中几个通配符的含义:
  第一个 * —— 通配 任意返回值类型
  第二个 * —— 通配 包com.evan.crm.service下的任意class
  第三个 * —— 通配 包com.evan.crm.service下的任意class的任意方法                                                                                                                                                                                           第四个 .. —— 通配 方法可以有0个或多个参数    -->


  <!-- 性能拦截统计 -->
<bea id="methodTimeAdvice" class="com.yy.framework.interceptor.MethodTimeAdviceInterceptor" />
   <aop:config>
     <aop:advisor id="methodTimeLog" advice-ref="methodTimeAdvice" pointcut="execution(* *..service..*(..))" />
   </aop:config>


package com.test;

import java.lang.reflect.Method;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;


public class MethodTimeAdviceInterceptor implements MethodBeforeAdvice, AfterReturningAdvice {

private static final Logger logger=LoggerFactory.getLogger(MethodTimeAdviceInterceptor.class);


    long tt = 0;

    public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
        tt = System.currentTimeMillis();
    }

    public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
        long lastTime = System.currentTimeMillis() - tt;
        StringBuffer buf =
                new StringBuffer("EXECUTE:(").append(arg1.getName()).append(") BEGIN=").append(tt).append(", END=").append(System.currentTimeMillis())
                        .append(", ELAPSE=").append(lastTime);
        if (logger.isDebugEnabled()) {
            logger.debug(buf.toString());
        }
    }
}


1:MethodBeforeAdvice   before  在执行service方法之前,或者任意方法之前执行

2:AfterReturningAdvice  afterReturning  在执行方法之后,或者任意方法之后执行

并且,MethodBeforeAdvice和AfterReturningAdvice,也可以单独拿来配置重写,至于这个就不在这多说了。

这个案例是做了一个性能统计,即方法执行的一个时间效率统计。spring 的 aop 有很多种方法,当然在这里也只是其中一个罢了。采用的一个动态代理机制

0 0