今天学到点新东西--AOP通过自定义注解方式管理日志,做下记录,以免遗忘。
======================================================================
1、自定义一个日志注解
@Target(ElementType.
METHOD)//
Target注解用于设定注解的使用范围,
ElementType是一个枚举集合
@Retention(RetentionPolicy.
RUNTIME) //
编译程序处理完注解信息后存储在class中,可由VM读入
@Documented //此注解会被javadoc工具提取成文档
public @
interface
InvokeInterfaceLog { String value()
default
"";}
2、定义日志切面类
@Aspect //定义切面
@Component
class InterfaceLogAspect{
@Autowired
private LogApiService
logApiService; //需要写一个保存的服务可以将日志信息保存进数据库,此处省略。
@Pointcut(
"@annotation(com.hnagroup.points.order.module.log.anno.InvokeInterfaceLog)") //定义命名切入点
public void logPointCut() {}
@Around(
"logPointCut()") //引用命名切入点
public Object around(ProceedingJoinPoint point)
throws Throwable {
long beginTime = System.
currentTimeMillis();
Object result = point.proceed(); //执行原方法,
获取原方法的返回值
long time = System.
currentTimeMillis() - beginTime; //获取方法的执行时间
try {
saveLog(point, time);
}
catch (Exception e) { }
return result;
}
private void saveLog(ProceedingJoinPoint joinPoint,
long time) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();//
获取到信息: 修饰符 + 包名 + 组件名(类名) + 方法的名字
Method method = signature.getMethod();
InterfaceLogDTO interfaceLogDTO =
new InterfaceLogDTO();
interfaceLogDTO.setExeuTime(time);
SimpleDateFormat dateFormat =
new SimpleDateFormat(
"yyyy-MM-dd hh:mm:ss");
interfaceLogDTO.setCreateDate(dateFormat.format(
new Date()));
InvokeInterfaceLog invokeInterfaceLog = method.getAnnotation(
InvokeInterfaceLog.
class); //获取原方法上的注解对象
if(invokeInterfaceLog !=
null){
//
注解上的描述
interfaceLogDTO.setRemark(invokeInterfaceLog.value()); //获取注解的值
}
//
请求的方法名
String className = joinPoint.getTarget().getClass().getName();//获取类名
String methodName = signature.getName(); //获取方法名
interfaceLogDTO.setClassName(className);
interfaceLogDTO.setMethodName(methodName);
//
请求的参数
Object[] args = joinPoint.getArgs(); //获取参数对象
try{
List list =
new ArrayList();
for (Object o : args) {
list.add(
new Gson().toJson(o)); //解析参数,将参数从Java对象转化为json
} interfaceLogDTO.setParams(list.toString());
}
catch (Exception e){ }
logApiService.saveLog(interfaceLogDTO);
}
}
3、使用日志注解打印日志:
@InvokeInterfaceLog(
"
积分订单详情
")//只需要添加此注解,即可将这个方法的日志信息存入数据库中
@Override
public OrderMessageVO selectOrderByOrderNo(
@PathVariable(
"mainOrderNo")Long mainOrderNo) {
...
}
4、spring配置文件中只需要下面两种配置即可:
<
context:component-scan
base-package
="com.cjh.aop2"
/>
<
aop:aspectj-autoproxy
/>