在Spring 中使用@Aspect 控制自定义注解的操作

网友投稿 226 2022-11-06


在Spring 中使用@Aspect 控制自定义注解的操作

Spring 中使用@Aspect 控制自定义注解

看这篇介绍@Aspect

1.定义系统日志注解类

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface SysLog {

String value() default "";

}

2.定义切面处理类

package com.kxs.common.aspect;

import com.google.gson.Gson;

import com.kxs.common.annotation.SysLog;

import com.kxs.common.utils.HttpContextUtils;

import com.kxs.common.utils.IPUtils;

import com.kxs.modules.sys.entity.SysLogEntity;

import com.kxs.modules.sys.entity.SysUserEntity;

import com.kxs.modules.sys.service.SysLogService;

import org.apache.shiro.SecurityUtils;

import org.aspectj.lang.ProceedingJoinPoint;

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.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

import java.lang.reflect.Method;

import java.util.Date;

/**

* 系统日志,切面处理类

*

* @author

* @email

* @date

*/

@Aspect

@Component

public class SysLogAspect {

@Autowired

private SysLogService sysLogService;

@Pointcut("@annotation(com.kxs.common.annotation.SysLog)")//指向自定义注解路径

public void logPointCut() {

}

/**

* 切面记录系统日志

* @param point

* @return

* @throws Throwable

*/

@Around("logPointCut()")//

public Object around(ProceedingJoinPoint point) throws Throwable {

long beginTime = System.currentTimeMillis();

//执行方法

Object result = point.proceed();

//执行时长(毫秒)

long time = System.currentTimeMillis() - beginTime;

//保存日志

saveSysLog(point, time);

return result;

}

//保存日志

private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {

MethodSignature signature = (MethodSignature) joinPoint.getSignature();

Method method = signature.getMethod();

SysLogEntity sysLog = new SysLogEntity();

SysLog syslog = method.getAnnotation(SysLog.class);

if(syslog != null){

//注解上的描述

sysLog.setOperation(syslog.value());

}

//请求的方法名

String className = joinPoint.getTarget().getClass().getName();

String methodName = signature.getName();

sysLog.setMethod(className + "." + methodName + "()");

//请求的参数

Object[] args = joinPoint.getArgs();

try{

String params = new Gson().tojson(args[0]);

sysLog.setParams(params);

}catch (Exception e){

}

//获取request

HttpServletRequest request = HttpContextUtils.getHttpServletRequest();

//设置IP地址

sysLog.setIp(IPUtils.getIpAddr(request));

//用户名

String username = ((SysUserEntity) SecurityUtils.getSubject().getPrincipal()).getUsername();

sysLog.setUsername(username);

sysLog.setTime(time);

sysLog.setCreateDate(new Date());

//保存系统日志

sysLogService.save(sysLog);

}

}

补充:为什么添加了@Aspect 还要加@Component

官方文档中有写:

You may register aspect classes as regular beans in your Spring XML configuration, or autodetect them through classpath scanning - just like any other Spring-managed bean. However, note that the @Aspect annotation is not sufficient for autodetection in the classpath: For that purpose, you need to add a separate @Component annotation (or alternatively a custom stereotype annotation that qualifies, as per the rules of Spring's component scanner).

翻译:

您可以在Spring XML配置中注册aspect类,或者通过类路径扫描自动检测它们,就像任何其他Spring管理bean一样。但是,请注意,@aspect注释对于在类路径中自动检测是不够的:为了达到这个目的,您需要添加一个单独的@component注解(或者根据Spring的组件扫描器的tUFWPn规则来定义一个定制的原型注解)。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:POJ 3107 - Godfather 树形DP..vector慎用...
下一篇:HDOJ 4604 - Deque O(nlogn)的最长非升(非降)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~