使用@Aspect注解进行aop进行性能监控以及异常记录
1、定义aop类
package com.szwx.springmvc.common.aop;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import com.szwx.springmvc.common.util.PropertiesFactory;
import com.szwx.springmvc.common.util.PropertiesHelper;
import com.szwx.springmvc.common.util.PropertyFiles;
@Component
@Aspect
public class AopLog {
private static Logger log = Logger.getLogger(AopLog.class);
// 定义切入点
@Pointcut("execution(* com.szwx.springmvc.*.controller.*.*(..))")
public void pointcut() {
}
// 方法执行前调用
@Before(value = "pointcut()")
public void before() {
//System.out.println("在方法执行前调用!");
}
// 方法执行后调用
@After(value = "pointcut()")
public void after() {
//System.out.println("方法执行后调用!");
}
// 方法执行的前后调用
@Around("pointcut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
String clazzString = point.getTarget().getClass().getName();
String methodName = point.getSignature().getName();
String fullPath = clazzString + "." + methodName;
int flag = clazzString.indexOf("$");
if (flag < 0)
log.info("开始业务处理[" + methodName + "];全路径[" + fullPath + "]");
long time = System.currentTimeMillis();
Object retVal = point.proceed();
time = System.currentTimeMillis() - time;
if (flag < 0)
log.info("结束业务处理[" + methodName + "];耗时:" + time + "毫秒;全路径[" + fullPath + "]");
return retVal;
}
// @AfterThrowing(pointcut="pointcut()")
// 如果使用该种写法则无法给doThrowing添加Throwable ex
// 参数,如没有该参数我们无法获悉程序运行的错误:error at ::0 formal unbound in pointcutd
// 故可修改成为如下:
@AfterThrowing(pointcut = "pointcut()", throwing = "ex")
public void doThrowing(JoinPoint jp, Throwable ex) {
PropertiesHelper g4PHelper = PropertiesFactory.getPropertiesHelper(PropertyFiles.APP);
String exceptionMonitor = g4PHelper.getValue("exceptionMonitor");
if (exceptionMonitor.equals("0")) {
return;
}
String clazzString = jp.getTarget().getClass().getName();
String methodName = jp.getSignature().getName();
String fullPath = clazzString + "." + methodName;
int flag = clazzString.indexOf("$");
if (flag < 0) {
log.info("业务处理时发生了异常:[" + fullPath + "]");
// ex.printStackTrace();
log.info("[异常类:"+clazzString+"],"+"[异常方法:"+methodName+"]"+"[异常信息:"+ex.getMessage()+"]");
}
}
}
2在spring 配置文件中添加aop命名空间,然后加入
<aop:aspectj-autoproxy proxy-target-class="true"/> 这里proxy-target-class="true"表示使用cglib进行代理
使用到的jar:cglib-nodep,aspectjweaver,aspectjtools,spring-asm
说明:当使用aop进行异常记录时,一些dao抛出的异常,如sqlexception等当事务由spring代理时,并不是立即抛出异常的,所以在这里是无法记录到的,经测试,在service中捕捉dao层的异常,如发生主键冲突,并不会立即捕获到异常,只有在spring提交事务以后才能知道异常,这些异常只能在controller层才能进行捕获,除非手动执行事务。
据说spring aop无法代理struts的action层,但是springmvc的controller经测试有效。
但是要在springmvc.xml中添加<aop:aspectj-autoproxy proxy-target-class="true"/>
相关推荐
在"SpringAOP测试Demo"中,我们通常会涉及以下几个核心概念和操作: 1. **切面(Aspect)**:切面是关注点的一个模块化,它包括了连接点、通知、目标对象、织入和引入。在Spring AOP中,切面通常由一个或多个注解的...
本测试项目旨在帮助理解并实践Spring AOP的核心概念和用法。 在Spring AOP中,切面(Aspect)是封装了特定关注点的模块,如日志记录、事务管理或性能监控。切面由两部分组成:通知(Advice)和切点(Pointcut)。...
在提供的压缩包文件"springAOP"中,可能包含了以下内容: - **切面类(Aspect Class)**:包含切点和通知的Java类,可能使用了`@Aspect`注解。 - **目标类(Target Class)**:被AOP代理的对象,通常包含业务逻辑。...
4. **测试**:在测试类中,创建Spring容器并调用`UserService`的方法,你会看到日志信息先于方法执行输出。 以上就是Spring AOP的基本用法。在实际项目中,你可以根据需求定义不同的通知类型,如`@After`、`@Around...
在本教程中,我们将深入探讨Spring AOP的不同使用方法,包括定义切点、通知类型、组装切面以及使用JUnit4进行测试。 首先,我们需要理解Spring AOP的基础概念。AOP的核心是切点(Pointcut),它定义了关注点在何处...
掌握AOP的测试源码,仅为学习使用,我在学习时也困惑了很长时间,主要是看不到AOP的结果。经过分析,主要是不会用org.junit.Test 注意运行步骤为: 1.选中工程 2.右键选择Run As Junit Test 3.正常运行就可看到结果...
Spring AOP 和 Spring IOC 是 Spring 框架的两个核心组件,它们对于任何基于 Java 的企业级应用开发都至关重要。Spring AOP(面向切面编程)允许开发者在不修改源代码的情况下,通过“切面”来插入新的行为或增强已...
在这个名为"spring-aop:一个spring aop测试项目"的压缩包中,我们可以深入学习和实践Spring AOP的相关知识。 首先,Spring AOP的核心概念是切面(Aspect)和通知(Advice)。切面是关注点的模块化,比如日志记录、...
Spring AOP(面向切面编程)与MyBatis框架的结合应用,可以帮助我们实现这一目标。以下将详细讲解如何利用Spring AOP来实现多数据库的读写分离。 首先,了解读写分离的基本概念。读写分离是指在一个数据库系统中,...
此外,`springtest`文件可能包含了一些用于测试Spring AOP性能监控器的示例代码,你可以根据这些代码进一步实践和理解这个主题。记住,理论知识与实际操作相结合才能更好地掌握技术。 总结来说,Spring AOP性能监控...
通过分析这个测试案例,你可以了解如何在实际项目中实现AOP。例如,它可能包含了一个带有切面逻辑的切面类,使用了`@Before`注解的方法会在目标方法执行前运行,而使用`@After`注解的方法则会在目标方法执行后运行。...
在本示例中,"springaop.zip" 包含了一个使用XML配置的Spring AOP应用实例,可以直接运行,配合相关的博客文章学习效果更佳。 在Spring AOP中,我们首先需要了解几个核心概念: 1. **切面(Aspect)**:切面是关注...
Spring AOP,全称为Aspect Oriented Programming,是Spring框架中的一个重要模块,主要负责处理系统中的...文件"5.SpringAOP_01"和"6.SpringAOP_02"很可能是课程的分阶段内容,涵盖了从基础概念到进阶实践的详细讲解。
- 测试类:用来验证AOP功能是否正确工作。 通过运行这个项目,你可以看到AOP如何在实际场景中工作,如何通过切面和通知来增强业务逻辑。 总的来说,Spring AOP提供了一种灵活的方式,让我们可以在不侵入核心业务...
**Spring AOP 实现详解** 在Java开发中,Spring框架以其强大的功能和灵活性深受开发者喜爱。其中,AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架的一个重要特性,它允许开发者将关注点从核心业务...
Spring AOP,全称为Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为Java应用程序提供了声明式的企业级服务,如事务管理、日志记录等。AOP的核心概念是切面(Aspect)和通知(Advice...
Spring框架是Java开发中不可或缺的一部分,它通过提供两种核心特性——控制反转(IoC)和面向切面编程(AOP)来简化应用的构建。理解并掌握这两种技术对于任何Java开发者来说都至关重要。 **控制反转(IoC)**,也...
在这个"SpringAOP的例子"中,我们将深入探讨如何在Eclipse环境下利用Spring AOP和动态代理来实现这些功能。 首先,让我们理解什么是AOP。AOP是一种编程范式,旨在减少代码的重复性和增强可维护性。在传统的OOP中,...
Spring AOP(面向切面编程)是Spring框架中的一个重要组成部分,它允许程序员在不修改源代码的情况下,通过插入切面来增强程序的功能。这个压缩包文件"Spring AOP代码"很可能包含了一些示例代码,用于演示如何在...