java aop注解日志记录_spring aop通过注解实现日志记录

首先是几个概念:连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、切面(Aspect)

另外也要使用到注解。

需求:通过注解定义LogEnable。然后程序运行能够识别定义了LogEnable注解的方法记录日志。

1.定义注解

packagecn.duanjt.util;import java.lang.annotation.*;/*** 记录日志的注解类

*@author段江涛

* @date 2018-11-08*/@Target(ElementType.METHOD)//表示用于标识方法

@Retention(RetentionPolicy.RUNTIME)//表示运行时保留

public @interfaceLogEnable {/*** 主要是标志日志的描述信息

*@return

*/String note()default "";

}

2.定义需要监听的类和方法

packagecn.duanjt.service;importorg.springframework.stereotype.Service;importcn.duanjt.Pojo.Student;importcn.duanjt.util.LogEnable;

@Servicepublic classStudentService {//定义注解,然后描述当前方法的作用

@LogEnable(note="获取学生信息")public Student getStudent(intid) {if (id == 0) {throw new RuntimeException("编码不能为0");

}

Student stu= newStudent();

stu.setId(id);

stu.setName("zhangsan");

stu.setAddr("重庆");returnstu;

}//未定义注解,将不会被监听

public int getId(intid) {return id + 1;

}

}

3.定义切面,记录日志

packagecn.duanjt.util;importorg.apache.commons.lang3.StringUtils;importorg.aspectj.lang.ProceedingJoinPoint;importorg.aspectj.lang.annotation.Around;importorg.aspectj.lang.annotation.Aspect;importorg.aspectj.lang.reflect.MethodSignature;importorg.springframework.stereotype.Component;

@Aspect

@Componentpublic classLogHelper {//没有单独定义切点,直接在环绕方法里面处理[包cn.duanjt.service下面的所有类下面的所有方法,同时包含LogEnable注解的将被监听]

@Around("execution(* cn.duanjt.service.*.*(..)) && @annotation(LogEnable)")publicObject around(ProceedingJoinPoint point) {

MethodSignature signature=(MethodSignature) point.getSignature();long time = System.currentTimeMillis(); //记录开始时间

String className = point.getTarget().getClass().getName(); //类名

String method = className + "." + signature.getName(); //方法名

Object[] args = point.getArgs(); //参数

LogEnable logEnable= signature.getMethod().getAnnotation(LogEnable.class);

String logNote=logEnable.note(); //日志信息

try{

Object result=point.proceed();

System.out.println("方法名:" +method);

System.out.println("参数:" +StringUtils.join(args));

System.out.println("返回值:" +result.toString());

System.out.println("日志功能:" +logNote);

System.out.println("耗时:" + (System.currentTimeMillis() - time) + "毫秒");

System.out.println("-----------------------");returnresult;

}catch(Exception e) {

System.out.println("方法名1:" +method);

System.out.println("参数:" +StringUtils.join(args));

System.out.println("日志功能:" +logNote);

System.out.println("异常信息:" +e.getMessage());

System.out.println("耗时:" + (System.currentTimeMillis() - time) + "毫秒");

System.out.println("-----------------------");return null;

}catch(Throwable e) {return null;

}

}

}

4.在主程序上要加上注解@EnableAspectJAutoProxy。我这里使用的是springboot,如下:

packagecn.duanjt;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.annotation.ComponentScan;importorg.springframework.context.annotation.EnableAspectJAutoProxy;

@SpringBootApplication

@ComponentScan("cn.duanjt")

@EnableAspectJAutoProxy//表示启用AOP

public classServerDemoApplication {public static voidmain(String[] args) {

SpringApplication.run(ServerDemoApplication.class, args);

}

}

最后,运行结果如下:

方法名:cn.duanjt.service.StudentService.getStudent

参数:1返回值:Student [id=1, name=zhangsan, addr=重庆]

日志功能:获取学生信息

耗时:0毫秒-----------------------

注意:

1. @EnableAspectJAutoProxy用于开启全局的AOP

2. LogHelper类上面的@Aspect和@Component是必须的,前者用于标注是切面,后者用于将对象注入到spring容器

3. 切面表达式@Around("execution(* cn.duanjt.service.*.*(..)) && @annotation(LogEnable)").一定需要execution。详细的可以下去再了解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值