AOP通过自定义注解方式管理日志

今天学到点新东西--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 />

你可能感兴趣的:(AOP)