记录每个方法的执行时间 AOP

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;

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-02 20:40:51

记录每个方法的执行时间 AOP的相关文章

代理模式——用AOP测试业务层方法的执行时间

代理模式 对代理模式的理解,通过http://www.runoob.com/design-pattern/proxy-pattern.html 对AOP的代理模式,参考https://www.cnblogs.com/xujiming/p/5737531.html 目标:测试service层每一个方法的执行时间: 代理模式的本质:将被代理对象注入给代理对象,当调用代理对象时,实际上,是在调用被注入的被代理对象 理解: 代理对象 被代理对象 代理类 被代理对象 商家 厂商 房屋中介 房东 静态代理:

PHP利用魔术方法实现准AOP

PHP利用魔术方法实现准AOP 在 传统的OOP(面向对象编程:Object-Oriented Programming)思想里,一般把应用程序分解成若干个的对象,强调高内聚,弱耦合,从而提高应用程序的模块化程度,但是在处理某些问题的时 候,OOP会显得不够灵活,比如说,应用程序里很多业务逻辑都要在操作之初进行“权限检查”,在操作之后进行“日志记录”,如果直接把处理这些操作的代码 加入到每个模块中,那么无疑破坏了OOP的“单一职责”原则,模块的可重用性会大大降低,这时候传统的OOP设计往往采取的策

获取C#中方法的执行时间及其代码注入

在优化C#代码或对比某些API的效率时,通常需要测试某个方法的运行时间,可以通过DateTime来统计指定方法的执行时间,也可以使用命名空间System.Diagnostics中封装了高精度计时器QueryPerformanceCounter方法的Stopwatch类来统计指定方法的执行时间: 1.使用DateTime方法: DateTime dateTime = DateTime.Now; MyFunc(); Console.WriteLine((DateTime.Now - dateTime

MySQL删除重复记录的方法

参考网上的方法,总结了产出重复记录的方法,欢迎交流. 方法1:创建一个新表临时储存数据 假设我们有一个存在多个字段的表,表中有部分数据的若干字段重复,此时我们可以使用DISTINCT这个关键字对表数据进行筛选. 1 CREATE [TEMPORARY] TABLE temp LIKE origin_tb; 2 INSERT temp(attr1,attr2,...) SELECT DISTINCT attr1,attr2,... FROM origin_tb; 3 DELETE FROM ori

用一条SQL语句取出第 m 条到第 n 条记录的方法

原文:用一条SQL语句取出第 m 条到第 n 条记录的方法   --从Table 表中取出第 m 条到第 n 条的记录:(Not In 版本) SELECT TOP n-m+1 * FROM Table WHERE (id NOT IN (SELECT TOP m-1 id FROM Table )) --从TABLE表中取出第m到n条记录 (Exists版本) SELECT TOP n-m+1 * FROM TABLE AS a WHERE Not Exists (Select * From 

SQL语句删除表中所有记录的方法

如何用一条sql语句删除表中的所有记录,这里分享下我的方法.参考链接: sql语句如何删除重复记录?四种方法 sql语句如何删除重复记录?教程详解 TRUNCATE TABLE删除表中的所有行,而不记录单个行删除操作. 语法TRUNCATE TABLE name 参数name 是要截断的表的名称或要删除其全部行的表的名称. 注释TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度

mysql使用GROUP BY分组实现取前N条记录的方法

MySQL中GROUP BY分组取前N条记录实现 mysql分组,取记录 GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY分组取前N条记录实现方法. 这是测试表(也不知道怎么想的,当时表名直接敲了个aa,汗~~~~): 结果: 方法一: SELECT a.id,a.SName,a.ClsNo,a.Score FROM aa a LEFT JOIN aa b ON a.ClsNo=b.ClsNo AND a.Score<b.Score group by a.id,a.

查询数据库中重复记录的方法

select * from [DataBase].[dbo].[TableName] where [字段一] in (select [字段一] from [DataBase].[dbo].[TableName] group by [字段一] having count([字段一]) > 1) 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (select peopleId from peop

paip.取当天记录的方法sql跟hql hibernate

#------两个方法...函数法和日期计算法.. 函数法: DATEDIFF(d,createTime,GETDATE())=0   //d指定为day hb也有一样的函数.. 日期 计算法: where  createTime>='2014-5-4 00:00:01' and createTime<='2014-5-4 23:59:59' where  createTime='2014-5-4 00:00:00' 应该优先使用日期 计算法,,因为这个方法能使用索引了...不个日期时间转换为