基于注解实现aop切面记录日志(笔记)

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):
			1RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
			2RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
			3RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;

spring手动开启切面自动代理:	<aop:aspectj-autoproxy/>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值