我也是根据网上的信息自己做的,仅供参考。
明确一点:使用的是@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="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 ""; //
}
至此,需要做的工作已经完成了。运行项目的结果如下:
转载于:https://blog.51cto.com/fengcl/1891863