`
ginge
  • 浏览: 212151 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

打印出,入口参数和执行时间--AOP简单应用

阅读更多

项目进入ST的时候,为了定位问题处于哪个模块。需要明确知道出入中的参数的值以追寻问题的根源。这经常需要编写大量的打印语句。可能有些人会写这些东西,但是有些人却忘记写了。也有人通过完整的Unit Testing确信自己的代码没有问题。可是当问题出现时,事情不会这么容易解决。因为人家可能也做了测试,只不过漏了测试某些分支而导致问题发生了。这个时候就需要证据了。一种方法是把出入口参数的值一一打印出来。可是这些语句要是散落在各个类里就太丑陋了,维护起来也费劲。

 

利用AOP我们可以一下这方面的事情。以下的主要的代码片段:

public Object cut(ProceedingJoinPoint pjp)
			throws Throwable {
		
		
		String instanceMethod = 
			pjp.getTarget().getClass() + "@" + pjp.getTarget().hashCode() + "]"+"." + pjp.getSignature().getName();
		if(this.isPrintArguments())
		{
			this.printArguments(instanceMethod, pjp.getArgs());
		}
		
		
		Object rel = null;
		
		long start = System.nanoTime();
		
		try
		{
			rel = pjp.proceed();
		}catch(Exception e)
		{
			if(this.isCatchException())
			{
				if(log.isErrorEnabled())
				{
					log.error("Exception occure while executing.", e);
				}
			}
			
			throw e;
		}
		
		long end = System.nanoTime();
		
		if(this.isPrintInvocationTime())
		{
			if(log.isDebugEnabled())
			{
				log.debug("["+(end - start)+"] nanoseconds elapsed executing [" + instanceMethod );
			}
		}
		
		
		if(this.isPrintReturnValue())
		{
			printReturnVal(rel);
		}
		
		log.debug("");
		
		return rel;
	}

 

样本配置如下:

<aop:config>
		<aop:aspect id="com.bee.fw.core.methodInvocationAspect" ref="com.bee.fw.core.MethodInvocationDetailsInspector">
			<aop:pointcut id="com.bee.fw.core.cutExpresseion"
				expression="execution(* com.bee.fw.debug.Aspect.*(..))" />
			<aop:around pointcut-ref="com.bee.fw.core.cutExpresseion" method="cut" />
		</aop:aspect>
	</aop:config>
	
	<bean id="com.bee.fw.core.MethodInvocationDetailsInspector" class="com.bee.fw.debug.MethodInvocationDetailsInspector">
		<property name="printInvocationTime" value="true" />
		<property name="order" value="100" />
	</bean>
	
	<bean id="com.bee.fw.core.Aspect" class="com.bee.fw.debug.Aspect">
	</bean>

 

这个代码依赖的类库有:

Spring >= 2.0

Commons-io >= 1.3.1

Commons-logging >=1.1

Commons-beanUtils > 1.8.0

Log4j >= 1.2.13

 

有兴趣的可以查看附件的源码和程序执行的效果。

 

1
0
分享到:
评论
2 楼 ginge 2009-03-03  
2009-03-03 16:54:34 DEBUG (MethodInvocationDetailsInspector.java:92)     - Intercepting:class com.bee.fw.debug.Aspect@18481629].invoke2, Arguments:
2009-03-03 16:54:34 DEBUG (MethodInvocationDetailsInspector.java:98)     -   [0]:java.lang.String@18f7386[value={I,',m, },offset=0,count=4,hash=2215633]
2009-03-03 16:54:34 DEBUG (MethodInvocationDetailsInspector.java:98)     -   [1]:java.lang.String@182ef6b[value={ ,G,i,n,g,e,!},offset=0,count=7,hash=468365303]
2009-03-03 16:54:34 DEBUG (MethodInvocationDetailsInspector.java:104)     -
2009-03-03 16:54:34 DEBUG (MethodInvocationDetailsInspector.java:68)     - [63695] nanoseconds elapsed executing [class com.bee.fw.debug.Aspect@18481629].invoke2
2009-03-03 16:54:34 DEBUG (MethodInvocationDetailsInspector.java:77)     -   Returned Valued:
2009-03-03 16:54:34 DEBUG (MethodInvocationDetailsInspector.java:78)     -                   java.lang.String@1f02b85[value={I,',m, , ,G,i,n,g,e,!},offset=0,count=11,hash=-442842106]
1 楼 ginge 2009-03-03  
有兴趣的可以进一步查看附件中的FieldsReflectionToStringBuilder类。
当出入口参数是对象时,还可以通过在classpath中放置acceptedFieldClasses.cnf和excludededFieldClasses.cnf文件指定特定类型的字段才打印。

其中acceptedFieldClasses.cnf和excludededFieldClasses.cnf文件一行放置一个类。全路径和类名都需要指定。

其它的需求根据自己的需要实现。

相关推荐

    Spring5 框架 ---- AOP ---- 代码

    Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 ...

    spring-aop.jar各个版本

    spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...

    sisu-guice-3.1.3-no_aop.jar

    sisu-guice-3.1.3-no_aop.jar

    开发工具 aopalliance-1.0

    开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具 aopalliance-1.0开发工具...

    guice-2.0-no_aop.jar

    guice-2.0-no_aop.jar

    Android-Jet-AOP一个AndroidAOP框架

    Android-Jet-AOP便是一个专为Android平台设计的AOP框架,它借助注解和AspectJ技术,使得在Android应用中实现AOP变得简单易行。 ### 一、面向切面编程(AOP) AOP的核心理念是将程序中的关注点分离,关注点可以理解...

    开源框架spring详解-----AOP的深刻理解

    然后使用`@Before`、`@After`、`@Around`、`@AfterReturning`和`@AfterThrowing`等注解来定义不同类型的通知,它们分别对应于方法执行前、后、环绕、正常返回和抛出异常时执行的代码。 标签中的“源码”提示,这篇...

    spring-boot aop

    本示例是关于如何在Spring Boot项目中实现AOP功能的一个简单演示。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了跨越多个对象的行为或关注点,如日志记录。切点(Pointcut)定义了在何处...

    开发工具 spring-aop-4.3.6.RELEASE

    开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE...

    spring-aop-jar

    3. 性能监控:统计方法的执行时间,用于性能分析。 4. 安全控制:在方法调用前检查权限。 总结起来,"spring-aop-jar"涉及了Spring框架中的面向切面编程模块,包括Spring AOP和AspectJ的集成。通过理解和熟练使用...

    spring-3.2-aop.jar

    spring-3.2-aop.jar

    jar包---Spring Aop AspectJ新增包.rar

    1. 添加AspectJ的依赖库,这通常包括`aspectjrt.jar`(运行时库)和`aspectjweaver.jar`(织入器,用于在Spring应用上下文中实现AOP)。 2. 配置Spring,声明启用AspectJ自动代理,可以通过`&lt;aop:aspectj-autoproxy&gt;...

    aopalliance-white-paper(AOP Alliance白皮书)

    - **`org.aopalliance.aspectj.JoinPoint`**:代表一个连接点,在此可以访问当前执行的方法及参数信息。 - **`org.aopalliance.aspectj.Pointcut`**:与 `org.aopalliance.intercept.Pointcut` 类似,但提供了更多的...

    Spring-Struts-IBatis-AOP-Transaction

    **Spring 框架** Spring 是一个开源的 Java 应用框架,主要设计用于简化企业级应用开发。它提供了一个全面的编程和配置模型,旨在提高生产效率...这样的组合使得开发人员能够构建出高效、可维护且易于扩展的应用程序。

    aspectjweaver-1.8.7和aopalliance1.0

    它定义了一些基本的接口,如`org.aopalliance.intercept.MethodInterceptor`和`org.aopalliance.intercept.MethodInvocation`,这些接口是拦截器模式的核心,允许在方法调用前后执行自定义逻辑。Spring AOP就是基于...

    spring----AOP实现

    - 性能监控:记录方法的执行时间,进行性能分析。 7. 实例分析 创建一个简单的日志切面,定义切入点表达式匹配所有业务方法,并在方法执行前后打印日志。 ```java @Aspect @Component public class ...

    代理模式与动态代理--Spring AOP原理.doc

    代理模式与动态代理--Spring AOP原理.doc

    spring-nested-aop.zip_aop_spring aop

    它提供了一种模块化和声明式的方式来处理横切关注点,如事务管理、日志记录、性能监控等,这些关注点通常会分散在应用程序的各个角落。Spring AOP通过代理模式实现,允许我们在不修改源代码的情况下,对方法执行前后...

    spring-boot-starter-aop-2.0.3.RELEASE.jar

    java运行依赖jar包

Global site tag (gtag.js) - Google Analytics