Spring MVC AOP通过注解方式拦截
Controller等实现日志管理
开始上代码:
注解定义
package com.jiankunking.common;
import java.lang.annotation.*; /**
* @author jiankunking * @Date: 2016/8/15 * @Time: 11:09
* @annotation OperationLogger */
@Retention(RetentionPolicy.RUNTIME)//注解会在class中存在,运行时可通过反射获取 @Target(ElementType.METHOD)//目标是方法
@Documented//文档生成时,该注解将被包含在javadoc中,可去掉 public @interface OperationLogger {
/**
* 模块名字 */
String modelName() default \
/**
* 操作类型 */
String option(); }
@interface是用来自定义注释类型的。
注释的声明用@符号后面跟上这个注释类型的名字,再后面跟上括号,括号中列出这个注释中元 素/方法的key-value对。值必须是常量。 AOP拦截部分
package com.jiankunking.common;
import org.apache.log4j.Logger; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component;
import java.lang.reflect.Method; /**
* @author jiankunking * @Date: 2016/8/15 * @Time: 11:11
* @annotation SysLogAspect */
@Aspect @Component
public class SysLogAspect {
private static final Logger logger = Logger.getLogger(SysLogAspect.class);
/**
* 定义Pointcut,Pointcut的名称,此方法不能有返回值,该方法只是一个标示 */
@Pointcut(\ public void controllerAspect() {
System.out.println(\我是一个切入点\ }
/**
* 前置通知(Before advice) :在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。 * @param joinPoint */
@Before(\
public void doBefore(JoinPoint joinPoint) {
System.out.println(\前置通知开始=====\ //handleLog(joinPoint, null); }
/**
* 后通知(After advice) :当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
* @param joinPoint */
@AfterReturning(pointcut = \ public void doAfter(JoinPoint joinPoint) {
System.out.println(\后置通知开始=====\ //handleLog(joinPoint, null); }
/**
* 抛出异常后通知(After throwing advice) : 在方法抛出异常退出时执行的通知。 * @param joinPoint * @param e */
@AfterThrowing(value = \ public void doAfter(JoinPoint joinPoint, Exception e) {
System.out.println(\异常通知开始=====\ //handleLog(joinPoint, e); }
/**
* 环绕通知(Around advice) :包围一个连接点的通知,类似Web中Servlet规范中的Filter的doFilter方法。可以在方法的调用前后完成自定义的行为,也可以选择不执行。 * @param joinPoint */
@Around(\
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println(\环绕通知开始=====\ //handleLog(joinPoint, null); Object obj= joinPoint.proceed();
System.out.println(\环绕通知结束=====\ return obj; }
/**
* 日志处理 *
* @param joinPoint * @param e */
private void handleLog(JoinPoint joinPoint, Exception e) {