项目进入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
有兴趣的可以查看附件的源码和程序执行的效果。
分享到:
相关推荐
Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 框架 ---- AOP ---- 代码 Spring5 ...
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
开发工具 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
Android-Jet-AOP便是一个专为Android平台设计的AOP框架,它借助注解和AspectJ技术,使得在Android应用中实现AOP变得简单易行。 ### 一、面向切面编程(AOP) AOP的核心理念是将程序中的关注点分离,关注点可以理解...
然后使用`@Before`、`@After`、`@Around`、`@AfterReturning`和`@AfterThrowing`等注解来定义不同类型的通知,它们分别对应于方法执行前、后、环绕、正常返回和抛出异常时执行的代码。 标签中的“源码”提示,这篇...
本示例是关于如何在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...
3. 性能监控:统计方法的执行时间,用于性能分析。 4. 安全控制:在方法调用前检查权限。 总结起来,"spring-aop-jar"涉及了Spring框架中的面向切面编程模块,包括Spring AOP和AspectJ的集成。通过理解和熟练使用...
spring-3.2-aop.jar
1. 添加AspectJ的依赖库,这通常包括`aspectjrt.jar`(运行时库)和`aspectjweaver.jar`(织入器,用于在Spring应用上下文中实现AOP)。 2. 配置Spring,声明启用AspectJ自动代理,可以通过`<aop:aspectj-autoproxy>...
- **`org.aopalliance.aspectj.JoinPoint`**:代表一个连接点,在此可以访问当前执行的方法及参数信息。 - **`org.aopalliance.aspectj.Pointcut`**:与 `org.aopalliance.intercept.Pointcut` 类似,但提供了更多的...
**Spring 框架** Spring 是一个开源的 Java 应用框架,主要设计用于简化企业级应用开发。它提供了一个全面的编程和配置模型,旨在提高生产效率...这样的组合使得开发人员能够构建出高效、可维护且易于扩展的应用程序。
它定义了一些基本的接口,如`org.aopalliance.intercept.MethodInterceptor`和`org.aopalliance.intercept.MethodInvocation`,这些接口是拦截器模式的核心,允许在方法调用前后执行自定义逻辑。Spring AOP就是基于...
- 性能监控:记录方法的执行时间,进行性能分析。 7. 实例分析 创建一个简单的日志切面,定义切入点表达式匹配所有业务方法,并在方法执行前后打印日志。 ```java @Aspect @Component public class ...
代理模式与动态代理--Spring AOP原理.doc
它提供了一种模块化和声明式的方式来处理横切关注点,如事务管理、日志记录、性能监控等,这些关注点通常会分散在应用程序的各个角落。Spring AOP通过代理模式实现,允许我们在不修改源代码的情况下,对方法执行前后...
java运行依赖jar包