使用注解和AOP操做日志

下面只是提供一个思路,仅供参考:

自定义注解:

package com.xxx.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*声名一个注解*/
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})//在类和方法、属性上可用
@Retention(RetentionPolicy.RUNTIME)//在运行时起作用
public @interface MyAnnotation {
     //注意:加上默认值后,使用注解时,里面参数的参数根据自己的需求写
    int age() default 0;
    //定义一个属性
     String value() default "";
}

 接口中调用:

package com.xxx.service;

import com.xxx.annotation.LogAnnotation;

public interface UserService {
    @LogAnnotation("添加用户")
    public String addUser(int id, String name);

    @LogAnnotation("删除用户")
    public void delUser();

    @LogAnnotation("根据编号获取用户信息")
    public void queryById();

    @LogAnnotation("获得所有用户信息")
    public void queryUsers();
}

 然后AOP操作来进行日志的处理,比如记录某个用户的浏览记录,时间等等

package com.xxx.aspects;


import com.xxx.annotation.LogAnnotation;
import com.xxx.model.OperateLog;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * 在方法执行前获取操作日志的切面
 */
@Aspect
@Component
@EnableAspectJAutoProxy
public class LogAspects {
    //定义com.xxx.service包及其子包中的所有方法
    @Pointcut("execution(* com.xxx.service..*.*(..))")
    public void LogPointCut(){

    }

    /**
     * 环绕通知
     * @return
     */
    @Around("LogPointCut()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint){
    //调用目标方法
        Object value = null;
        try {
          //获取操作日志信息

            //获得方法签名   认为方法签名就是这个方法(就是当前这个调用的方法)
            Signature signature = proceedingJoinPoint.getSignature();
            //方法签名本身就是一个接口 它的实现类为 MethodInvocationProceedingJoinPoint
            // MethodInvocationProceedingJoinPoint下面又有一个内部类MethodSignatureImpl(真正实现方法签名的类)
            MethodSignature methodSignature =  (MethodSignature)signature;

            //通过方法签名实现类对象获得当前调用的方法对象
            Method method = methodSignature.getMethod();

            //获取方法的注解 LogAnnotation为自定义的注解
            LogAnnotation annotation = method.getAnnotation(LogAnnotation.class);

            //获得注解的value属性
            String operateContent = annotation.value();

            /*将操作内容operateContent封装到一个对象中
            * 根据自己的需求
            * **/
            OperateLog operateLog = new OperateLog();
            operateLog.setOperateContent(operateContent);
            operateLog.setUser_id(10050);

            insertLog(operateLog);
            //MethodInvocationProceedingJoinPoint

            //调取目标方法
            value = proceedingJoinPoint.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return value;
    }


    /**
     * 这个方法进行具体的操作
     * */
    public void insertLog(OperateLog operateLog){
        String sql = "insert into tab_operate_log value(default,now(),?,?)";
        //将数据存入当数据库中

    }
}

你可能感兴趣的:(数据库,log4j)