OA项目(使用Spring AOP 给执行方法添加日志功能)

Spring AOP 实现有两种:

①、基于代理类 ProxyFactoryBean 的 AOP 实现

②、AOP 配置方式实现 (本教程采用第二种)

本教程的目的:

原来搭建的 SSH2 + log4j 框架中,打印输出的日志信息很单一,基本上只有执行的 SQL 语句,无法满足我们的需求

所以就想到 使用 Spring AOP 技术完成日志功能,在使用这个技术后我们可以

①、记录每个方法执行的时间,从而为后面优化我们的程序

②、记录什么时间,谁做了什么,从而完成审计功能

③、记录自定义的异常信息

一、编写 java 类

package cn.oa.aop;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

public class AllLogAdvice {

	private Logger logger = Logger.getLogger(AllLogAdvice.class);

	//前置通知,方法执行之前执行
	public void myBeforeAdvice(JoinPoint jionpoint) {
		// 获取被调用的类名
		String targetClassName = jionpoint.getTarget().getClass().getName();
		// 获取调用的方法名
		String targetMethodName = jionpoint.getSignature().getName();
		// 日志格式 字符串
		String logInfoText = "前置通知" + targetClassName + " 类的  " + targetMethodName + " 方法开始执行........";
		logger.info(logInfoText);
	}

	//后置通知,方法执行之后执行(不管是否发生异常)
	public void myAfterReturnAdvice(JoinPoint jionpoint) {
		// 获取被调用的类名
		String targetClassName = jionpoint.getTarget().getClass().getName();
		// 获取调用的方法名
		String targetMethodName = jionpoint.getSignature().getName();
		// 日志格式 字符串
		String logInfoText = "后置通知" + targetClassName + " 类的  " + targetMethodName + " 方法执行完毕........";
		logger.info(logInfoText);
	}

	// 异常通知
	public void myThrowingAdvice(JoinPoint jionpoint, Exception e) {
		// 获取被调用的类名
		String targetClassName = jionpoint.getTarget().getClass().getName();
		// 获取调用的方法名
		String targetMethodName = jionpoint.getSignature().getName();
		// 日志格式 字符串
		String logInfoText = "异常通知:执行 " + targetClassName + " 类的  " + targetMethodName + " 方法 发送异常......." + "异常信息:" + e.getMessage();
		logger.info(logInfoText);
	}
	// 环形通知
	public void myAroundAdvice(ProceedingJoinPoint jionpoint) throws Throwable {
		long beginTime = System.currentTimeMillis();
		jionpoint.proceed();
		long endTime = System.currentTimeMillis();
		// 获取被调用的类名
		String targetClassName = jionpoint.getTarget().getClass().getName();
		// 获取调用的方法名
		String targetMethodName = jionpoint.getSignature().getName();
		// 日志格式 字符串
		String logInfoText = "环形通知:执行 " + targetClassName + " 类的  " + targetMethodName + " 方法 用时......." + (endTime - beginTime);
		logger.info(logInfoText);
	}

}

二、编辑 spring 配置文件





	
	


	
	


	
	
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
	


	
	
		
		
	


	
	
		
	
	
	

    
	
		
		
			
			
			
			
			
		
	



PS: ①、添加了日志处理的 aop

       ②、修改bean 的头部命名空间

       ③、切入点表达式:选择 cn.oa.action 包中所有类的所有方法(但排除 set 方法外),做日志记录

三、将所有的 action 类取消 继承 ActionSupport 类

至于为什么选择取消 继承 ActionSupport 类?

我发现, 继承 ActionSupport 类,当客户端发出请求时,没有继承 ActionSupport 类的方法正常运行,而继承 ActionSupport 类的Action 会报异常:java.lang.NoSuchMethodException: com.sun.proxy 

 

你可能感兴趣的:(SSH2,OA项目)