下面只是提供一个思路,仅供参考:
自定义注解:
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(),?,?)";
//将数据存入当数据库中
}
}