社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
aop面向切面的编程
一、aop
@Slf4j
//切面注解 声明切面
@Aspect
//声明是Bean组件
@Component
public class OperationLogAop {
@Autowired
private LogOperateService logOperateService;
//定义切入点
@Pointcut("execution(public * com.qcby.xmfs.information1.controller..*.*(..))")
public void paramPointCut(){
}
@Around("paramPointCut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
/**
* 保存操作日志
*/
LogOperate logOperate=new LogOperate();
//获取用户名
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token= request.getHeader("token");
if (token!=null){
logOperate.setUsername(JwtUtil.getUser(token).getUsername());
}
/**
* 从切面织入点除通过反射机制获取织入点处的方法
*/
MethodSignature signature =(MethodSignature) joinPoint .getSignature();
//获取织入点处的方法名
Method method=signature.getMethod();
//获取模块名
//
Class clazz =joinPoint.getTarget().getClass();
Module module= (Module) clazz.getAnnotation(Module.class);
if(module!=null){
logOperate.setModule(module.value());
}
//获取操作
Operate operate=method.getAnnotation(Operate.class);
if(operate!=null){
logOperate.setType(operate.value());
}
//操作路径
String className =joinPoint.getTarget().getClass().getName();
String methodName=method.getName();
logOperate.setOperatePath(className+"."+methodName);
//操作时间
LocalDateTime localDateTime = LocalDateTime.now();
logOperate.setOperateTime(localDateTime);
log.info("开发测试:aop操作日志=》"+logOperate);
logOperateService.save(logOperate);
//如果没有此两行代码,正常的方法执行会没有返回参数参数
Object result = joinPoint.proceed();
return result;
}
}
1、自定义注解,通过自定义注解的方式来获取,方法的操作名,模块名。
@Target(ElementType.METHOD) //注解级别,method:注解用在方法级别上
@Retention(RetentionPolicy.RUNTIME) //注解在哪个阶段执行,runime:运行时执行
@Documented //
public @interface Operate {
//操作名
String value() default "";
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Module {
//模块名
String value() default "";
}
2、获取方法名和模块名的操作
//获取模块名,
//模块名注解在类上面,属于类,所以通过类获取注解信息
Class clazz =joinPoint.getTarget().getClass();
Module module= (Module) clazz.getAnnotation(Module.class);
if(module!=null){
logOperate.setModule(module.value());
}
//获取操作
//操作名注解属于方法,通过Method获取注解信息
Operate operate=method.getAnnotation(Operate.class);
if(operate!=null){
logOperate.setType(operate.value());
}
3、获取操作用户的用户信息
//获取用户名
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token= request.getHeader("token");
if (token!=null){
logOperate.setUsername(JwtUtil.getUser(token).getUsername());
}
二、实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LogOperate {
private Long id;
private Long username;
private String module;
private String type;
private String operatePath;
private LocalDateTime operateTime;
}
三、结果
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!