1.创建注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestA {
}
2.创建切面
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.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.sgcc.uap.persistence.IHibernateDao;
import com.sgcc.uap.rest.utils.JsonUtils;
@Component//为注册数据库连接的bean使用
@Aspect
public class TestAspect {
// @Pointcut("@annotation(com.controller.TestA)")
// public void testCut() {}
//数据库连接
@Autowired
private IHibernateDao dao;
@Before("@annotation(com.controller.TestA)")
public void method1(JoinPoint pjp) throws Exception {
System.out.println("before---开始");
Object[] args = pjp.getArgs();
String param = param = JsonUtils.toJson(args);
//System.out.println("参数为:" + param);
System.out.println("before---结束");
}
@After("@annotation(com.controller.TestA)")
public void method3() {
System.out.println("after---开始");
System.out.println("after---结束");
}
@AfterReturning(value="@annotation(com.controller.TestA)",returning="result")
public void method4(Object result) throws Exception {
System.out.println("afterReturning---开始");
String res = res = JsonUtils.toJson(result);
//System.out.println("返回结果为:" + res);
System.out.println("afterReturning---结束");
}
@AfterThrowing(value="@annotation(com.controller.TestA)",throwing="e")
public void method5(Exception e) throws Exception {
System.out.println("afterThrowing---开始");
String res = res = JsonUtils.toJson(e);
System.out.println("异常为:" + res);
System.out.println("afterThrowing---结束");
}
@Around("@annotation(com.controller.TestA)")
public Object test(ProceedingJoinPoint pjp) {
System.out.println("around---开始");
Object[] args = pjp.getArgs();
Object o = null;
try {
o = pjp.proceed(args);
//因为我日志中需要记录请求参数和执行结果,所以我在这个位置进行日志记录
} catch (Throwable e) {
e.printStackTrace();
System.out.println("around-捕获到异常-------Throwable---");
}
System.out.println("around---结束");
return o;
}
}
3.使用
@TestA
@RequestMapping("/service/hello")
public String method(){
.....
}
切面执行顺序
around---开始
before---开始
before---结束
around--结束
after---开始
after---结束
afterReturning---开始
afterReturning---结束
备注
@Target 说明了Annotation所修饰的对象范围
取值(ElementType)有:
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域(字段、枚举的常量)
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明
@Retention
用来表示注解的生命周期
取值(RetentionPolicy)有:
1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
spring手动开启切面自动代理: <aop:aspectj-autoproxy/>