基于配置文件实现Spring AOP日志管理

spring AOP 是基于面向切面的编程,它能够使得我们专注于我们的业务处理,将一些其他的东西由它来统一完成,程序的侵入性很小,所以被广泛应用,至于实现原理我就不多说了,两个字:"代理"!

下面说说标题所示的应用,记录日志,什么时候记录日志,都记录什么?想想,可不就是在调用方法的时候写日志嘛,之前如果使用logger的话,都会在方法的开始写一个logger.info("xxxxxxxxxxxx");结束的时候再写一个,这不是很麻烦吗,每次都要写。实际上这个时候我们就可以用aop来做,当方法进入的时候写一条日志,结束的时候再写一条,分别对应“前置通知”和”后置通知“,如果我们的日志有新的写法,只需要修改控制日志的这个类,对程序没有丝毫影响,也就谈不上改动大量的代码了。下面开始:

1.引入aop的命名空间(其中有AOP的那部分):

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">


  2.书写记录日志的类:

package com.yjck.fm.util;

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

public class LogUtil {
	Logger logger = Logger.getLogger(LogUtil.class);
	
	public void logAll(JoinPoint jp){
		String methodName = jp.getSignature().getName();
		logger.info(jp.getTarget().getClass().getName()+"---"+methodName);
		Object[] args = jp.getArgs();
		for(int i=0;i<args.length;i++){
			logger.info("params["+i+"]:"+ args[i].toString());
		}
	}
}
    






 上面这段代码实现了输出要调用的类名,方法已经参数。

3.配置xml文件:

<!-- 日志管理aop -->
<!-- 强制使用cglib代理,如果不设置,将默认使用jdk的代理,但是jdk的代理是基于接口的 -->
<aop:config proxy-target-class="true" />  
<aop:config>
 <aop:aspect id="myAspect" ref="logUtil">
  <aop:pointcut expression="execution(* com.yjck.fm.*.action.*.*(..))" id="logPointCut"/>
  <aop:before method="logAll" pointcut-ref="logPointCut"/>
 </aop:aspect>
</aop:config>
<!-- 日志记录类 -->		
 <bean id="logUtil" class="com.yjck.fm.util.LogUtil"></bean>


 注意:我这里配置的是拦截所有action的所有方法,可以根据自己的情况配置,同时也只配了一个”前置通知“before,如果要需要还可以配置其他的。


OK,到此,实现已经完毕了!


猜你喜欢

转载自yjck.iteye.com/blog/1221129
今日推荐