我也是根据网上的信息自己做的,仅供参考。

    明确一点:使用的是@Aspect注解方式,项目是maven项目。

    使用@Aspect注解方式,需要修改的地方主要有:

    1、pom文件,增加:

    


    
        org.aspectj
        aspectjweaver
        1.7.4
    
    
    
        org.aspectj
        aspectjrt
        1.7.4
    

    这里需要注意一个问题。我一开始这里使用的版本是1.5.4,但是在启动的时候,会遇到一个报错,

    0 can't find referenced pointcut,这个问题让我很费解,后来经过网上查资料,说是环境的问题。

    一般情况下:

    Spring+SpringMVC+maven使用@aspectJ添加切面_第1张图片

    我的jdk版本是1.7的,所以换成1.7.4ok了。

    2、SpringMVC配置,我这儿是默认的名字,叫springMVC-servlet.xml

    这个配置文件里需要加上

    

    
    
    
    

    3、定义注解类。

    说明:我这个是实验性质的,所以并没有什么具体 的业务代码。里面可以添加你需要的业务,例如:日志记录,事务控制等等。

package com.tarena.vote.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;

/**
 * 

 *    Description: 注解逻辑类(测试,无实际意义)  * 

 *  * @author fcl  * @date 2017年1月11日  * @version v_1.0  */ @Aspect @Component public class AspectAdvice {     /**      * Pointcut      * 定义Pointcut,Pointcut名称为aspectjMethod,必须无参,无返回值      * 只是一个标识,并不进行调用      * 切点我这儿定义的是为controller包下的所有类,所有方法都加,      * 你可以指定具体的类或具体的方法      */     @Pointcut("execution(* com.tarena.vote.web.controller.*.*(..))")     //@Pointcut("@annotation(com.tarena.vote.aspect.AspectAdvice)")     private void aspectJMethod(){};     @Before("aspectJMethod()")     public void doBefore(JoinPoint joinPoint){         System.out.println("----dobefore()开始----");         System.out.println("执行业务逻辑前做一些工作");         System.out.println("通过jointPoint获得所需内容");         System.out.println("----dobefore()结束----");     }     @Around("aspectJMethod()")     public Object doAround(ProceedingJoinPoint pjp) throws Throwable{         System.out.println("----doAround()开始----");         System.out.println("此处可做一些类似before的工作");         //核心逻辑         Object retval=pjp.proceed();         System.out.println("此处可做一些类似after的工作");         System.out.println("----doAround()结束----");         return retval;     }     @After(value="aspectJMethod()")     public void doAfter(JoinPoint joinPoint){         System.out.println("----doAfter()开始----");         System.out.println("执行核心逻辑之后,所做工作");         System.out.println("通过jointPoint获得所需内容");         System.out.println("----doAfter()结束----");     }     @AfterReturning(value="aspectJMethod()",returning="retval")     public void doReturn(JoinPoint joinPoint, String retval){         System.out.println("AfterReturning()开始");         System.out.println("Return value= "+retval);         System.out.println("此处可对返回结果做一些处理");         System.out.println("----AfterReturning()结束----");     }     @AfterThrowing(value="aspectJMethod()", throwing="e")     public void doThrowing(JoinPoint joinPoint,Exception e){         System.out.println("-----doThrowing()开始-----");         System.out.println(" 错误信息:"+e.getMessage());         System.out.println(" 此处意在执行核心业务逻辑出错时,捕获异常,并可做一些日志记录操作等等");         System.out.println(" 可通过joinPoint来获取所需要的内容");         System.out.println("-----End of doThrowing()------");     } } /**  * 自定义注解。  * 这个自定义注解我也不知是用来干啥的,我感觉可能是用来描述的吧,  * 感觉项目中并没有地方需要用到,但是看网上的例子都有加  * 如果大神看见了,帮我解答一下。  */ package com.tarena.vote.aspect; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /**  *自定义注解 拦截Controller  */ @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public  @interface SystemLog {     String operationType()  default "";   //操作类型     String methods()  default "";  //新增用户     String description()  default "";  // }

至此,需要做的工作已经完成了。运行项目的结果如下:

Spring+SpringMVC+maven使用@aspectJ添加切面_第2张图片