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,到此,实现已经完毕了!