首页 > 代码库 > 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添加切面
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。