首页 > 代码库 > Spring+SpringMVC+maven使用@aspectJ添加切面

Spring+SpringMVC+maven使用@aspectJ添加切面

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

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

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

    1、pom文件,增加:

    

<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.7.4</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/aspectj/aspectjrt -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.7.4</version>
    </dependency>

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

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

    一般情况下:

    技术分享

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

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

    这个配置文件里需要加上

    

    <!-- 扫描aop,该类对应自己定义的注解类-->
    <context:component-scan base-package="com.tarena.vote.aspect" />
    <!--启动对AspectJ注解的支持,proxy-target-class等于true是强制使用cglib代理-->
    <aop:aspectj-autoproxy proxy-target-class="true"/>

    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;

/**
 * <p>
 *    Description: 注解逻辑类(测试,无实际意义)
 * </p>
 *
 * @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="http://www.mamicode.com/aspectJMethod()")
    public void doAfter(JoinPoint joinPoint){
        System.out.println("----doAfter()开始----");
        System.out.println("执行核心逻辑之后,所做工作");
        System.out.println("通过jointPoint获得所需内容");
        System.out.println("----doAfter()结束----");
    }

    @AfterReturning(value="http://www.mamicode.com/aspectJMethod()",returning="retval")
    public void doReturn(JoinPoint joinPoint, String retval){
        System.out.println("AfterReturning()开始");
        System.out.println("Return value=http://www.mamicode.com/ "+retval);
        System.out.println("此处可对返回结果做一些处理");
        System.out.println("----AfterReturning()结束----");

    }

    @AfterThrowing(value="http://www.mamicode.com/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 "";  //
}

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

技术分享

本文出自 “不羁的风” 博客,请务必保留此出处http://fengcl.blog.51cto.com/9961331/1891863

Spring+SpringMVC+maven使用@aspectJ添加切面