Spring 中使用@Aspect 控制自定义注解
2017-12-23 16:54
204 查看
Spring 中使用@Aspect 控制自定义注解
转载一篇介绍@Aspect
1.定义系统日志注解类
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
}
2.定义切面处理类
转载一篇介绍@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); } }
相关文章推荐
- springAOP与自定义注解实现细粒度权限控制管理
- 使用Spring处理自定义注解
- J2EE项目使用自定义注解实现基于SpringMVC + Mybatis + Mysql的读写分离
- Spring中使用自定义的注解校验器的实现
- spring AOP + 自定义注解实现权限控制小例子
- 项目应用:使用自定义注解完成对controller的aop控制
- 深入Spring:自定义注解加载和使用
- JAVAWEB开发之Servlet3.0新特性的使用以及注解的详细使用和自定义注解的方法、动态代理的使用、利用动态代理实现细粒度的权限控制以及类加载和泛型反射
- 使用Spring自定义注解实现任务路由的方法
- 使用Spring配置shiro时,自定义Realm中属性无法使用注解注入解决办法
- 使用Spring自定义注解实现任务路由
- action控制层,使用spring注解方式注入业务bean报空指向错误
- Spring自定义注解的使用
- 使用Spring配置shiro时,自定义Realm中属性无法使用注解注入解决办法
- 使用Spring自定义注解生产Http接口描述信息
- 深入Spring:自定义注解加载和使用
- 使用Spring配置shiro时,自定义Realm中属性无法使用注解注入解决办法
- Spring Boot项目中自定义注解的使用
- spring AOP + 自定义注解实现权限控制小例子
- 深入Spring:自定义注解加载和使用