关于aop的一些理论,不懂的同学可以参考下以下的链接:
aop理论:
http://blog.csdn.net/csh624366188/article/details/7651702
http://www.cnblogs.com/davidwang456/p/4013631.html
Aspectj切入点语法:
http://blog.csdn.net/lk7688535/article/details/51989746
拦截controller:
http://blog.csdn.net/shi_longyan/article/details/70917447
http://www.cnblogs.com/Frank-Hao/p/5787813.html
进入正题:
目标是为登录行为添加日志。
选择的是注解的实现方式。(aop有4种实现方式,自行百度;完整的注解应该是用describetion的,后面再讲)
那么现在就两个步骤:
1.写好切面;
2.修改xml文件。
1.切面代码
package swt.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
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;
/**
* 应用日志
*
*/
@Component
@Aspect
public class AppLogAspect {
@Pointcut("execution(* swt.controller.sys..*.*(..))")//此处切入点语法参见连接
public void allMethod(){}
@Before("allMethod()")
public void before(JoinPoint call){
String className = call.getTarget().getClass().getName();
String methidName = call.getSignature().getName();
System.out.println("前置通知:"+className+"类的"+methidName+"方法开始了");
}
@AfterReturning("allMethod()")
public void afterReturn(){
System.out.println("后置通知:方法正常结束了");
}
@AfterThrowing("allMethod()")
public void afterThrow(){
System.out.println("异常后通知:方法执行异常");
}
@After("allMethod()")
public void after(){
System.out.println("最终通知:无论方法是否正常执行完成,都会在这里结束");
}
}
2.将原spring-bean.xml中的aop的基础上,再在spring-mvc.xml中加上引用。(如果注释掉原bean中的引用,将无法拦截controller)
原spring-bean.xml:
<aop:aspectj-autoproxy/>
在spring-mvc.xml中加上:
<aop:aspectj-autoproxy proxy-target-class="true" />
测试ok。
补充一些其他的注意事项:
1.多个切点适用同一个方法,用||连接:
execution(* com.travelsky.ccboy.dao..*.find*(..)) || execution(* com.travelsky.ccboy.dao..*.query*(..))"
2.抛出异常和返回,注意加上throwing = "ex"和returning = "result":
@AfterThrowing(value = "declareJoinPointExpression()", throwing = "ex")
@AfterReturning(value = "declareJoinPointExpression()", returning = "result")