使用@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"/>
相关推荐
spring aop测试项目
跟开涛学习SpringAop之后的一些测试代码,也是这篇帖子测试代码的补充https://my.oschina.net/longfong/blog/805410
掌握AOP的测试源码,仅为学习使用,我在学习时也困惑了很长时间,主要是看不到AOP的结果。经过分析,主要是不会用org.junit.Test 注意运行步骤为: 1.选中工程 2.右键选择Run As Junit Test 3.正常运行就可看到结果...
NULL 博文链接:https://mutourenoo.iteye.com/blog/1156107
Spring AOP测试代码
Spring AOP 几个不同使用方法的完整例子,使用Junit4c测试, 在我的博客上有不同配置组合的说明,可以参考
spring aop做的日志管理,网上看的,没测试过。
1、spring切入点 2、spring前置织入,传入参数处理 3、spring后置织入,传入参数处理 4、环绕织入,参数及返回值处理 5、返回后织入,返回值处理 6、异常织入,异常处理 maven环境下,测试用例可直接运行
spring AOP实例 以及junit4做spring项目的测试实例
Spring AOP实现,项目源码,Myeclipse直接导入可用,本人根据教程编写,测试通过。
一个 Spring AOP 监控项目
有一天在用回调模版的时候,忽然间又想到jdk自带的Proxy类似乎不是怎么好用,为何不把其做成回调模版呢,可以将其改造称类似spring Aop 代码如下: package com.fjx.proxy.up.test; import ...
实现一个简单的spring aop切面,并对切点以及切面操作进行测试,内附代码和截图
仿springAOP框架。里面有测试案例。 涵盖自定义注解,切面,通知等内容。是学习AOP的学员难得的参考资料。
Spring3 AOP 最少的jar包集合,已测试通过!
用spring aop 编写的权限验证实例代码,下载后将解压后的文件直接导入到eclipse中,直接运行测试方法即可。
SpringAOP入门和原理分析,动态代理
srping 注解aop源码,包含sping junit测试
此单元测试基于spring的AbstractJUnit4SpringContextTests,你需要添加spring的关于单元测试的支持 在类上标注@ContextConfiguration(locations="classpath:applicationContext.xml")意思是去classpath路径下加载...
内含有mybatis 拦截器实现的分页代码,spring 的事务和aop 测试、和反射工具类