package com.aop; import org.apache.log4j.Logger; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; public class MyAspect { private static final Logger LOGGER=Logger.getLogger(MyAspect.class); //输出到指定文件 //private static final Logger LOGGER=Logger.getLogger("com.util.TimerLogger"); long a=0; public void doBefore(JoinPoint jp) { Object[] o=jp.getArgs(); for(int i=0;i<o.length;i++){ System.err.println("输入参数为"+o[i]); } a=System.currentTimeMillis(); System.err.println("当前方法执行时间为: " + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName()); } public void doAfter(JoinPoint jp) { System.err.println("方法结束时间为: " + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName()); System.err.println("\r<br>执行耗时 : "+(System.currentTimeMillis()-a)+" 秒 "); } public Object doAround(ProceedingJoinPoint pjp) throws Throwable { long time = System.currentTimeMillis(); Object retVal = pjp.proceed(); time = System.currentTimeMillis() - time; Object[] o=pjp.getArgs(); for(int i=0;i<o.length;i++){ LOGGER.info("第"+(i+1)+"输入参数 = "+o[i]); } LOGGER.info("当前方法为 " + pjp.getTarget().getClass().getName() + "." + pjp.getSignature().getName()+" 执行时间为"+time+"ms"); return retVal; } public void doThrowing(JoinPoint jp, Throwable ex) { System.out.println("method " + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName() + " throw exception"); System.out.println(ex.getMessage()); } }
spring配置文件
<aop:config> <aop:aspect id="concurrentOperationRetry" ref="myAspect"> <aop:pointcut id="idempotentOperation" expression="execution(* com.service.imp.*.*(..))"/> <!--<aop:before pointcut-ref="idempotentOperation" method="doBefore"/> <aop:after pointcut-ref="idempotentOperation" method="doAfter"/> --> <aop:around pointcut-ref="idempotentOperation" method="doAround"/> </aop:aspect> </aop:config>
测试方法
package function; import java.io.IOException; import org.junit.Test; import com.model.User; import com.service.UserService; import com.util.BeanFactoryUtil; public class MyAspectTest { @Test public void aopTest() throws IOException{ UserService userservice=(UserService)BeanFactoryUtil.getInstance().getBean("userService"); User user=userservice.getUserByUid(3); System.err.println(user.getName()); } }
控制台输出
[30 14:32:22,192 INFO ] [main] imp.UserServiceImpl - UserServiceImpl中getUserByUid执行结束
[30 14:32:22,193 INFO ] [main] aop.MyAspect - 第1输入参数 = 3
[30 14:32:22,194 INFO ] [main] aop.MyAspect - 当前方法为 com.service.imp.UserServiceImpl.getUserByUid 执行时间为459ms
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
配置文件说明
1写切面类。
2定义切入点。 pointcut 指定切入点
3定义通知。(对目标对象进行增强处理)
常用通知类型:
拦截环绕通知 around
前置通知 before
异常通知 after-throwingmethod
后置通知 after
记录com.service.imp.*.*(..))所有方法的执行时间
第一个*记录的是imp包下所有类,第二个*是所有类下的记录所有方法,(..)表示匹配所有的输入参数。
1 目标方法执行前执行切面的around()方法记录当前系统时间为a,
2 执行目标对象方法Object retVal = pjp.proceed();
3 目标方法执行后执行切面的around()方法记录当前系统时间为b
方法执行时间=b-a;
版权声明:本文为博主原创文章,未经博主允许不得转载。