通过自定义注解调用方法执行日志存储:

  1. package com.zktx.platform.log2;
  2.  
  3. import java.lang.reflect.Method;
  4. import java.util.Date;
  5. import java.util.Map;
  6.  
  7. import javax.servlet.http.HttpServletRequest;
  8.  
  9. import org.aspectj.lang.JoinPoint;
  10. import org.aspectj.lang.annotation.After;
  11. import org.aspectj.lang.annotation.AfterReturning;
  12. import org.aspectj.lang.annotation.Aspect;
  13. import org.aspectj.lang.annotation.Pointcut;
  14. import org.slf4j.Logger;
  15. import org.slf4j.LoggerFactory;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.stereotype.Component;
  18. import org.springframework.web.context.request.RequestContextHolder;
  19. import org.springframework.web.context.request.ServletRequestAttributes;
  20.  
  21. import com.zktx.platform.entity.tb.logInfo;
  22. import com.zktx.platform.entity.tb.user.ShiroUser;
  23. import com.zktx.platform.service.log.LogService;
  24. import com.zktx.platform.shiro.SecurityUtils;
  25.  
  26. /**
  27. * * 首先我们为什么需要做日志管理,在现实的上线中我们经常会遇到系统出现异常或者问题。 这个时候就马上打开CRT或者SSH连上服务器拿日子来分析。
  28. * 受网络的各种限制。于是我们就想为什么不能直接在管理后台查看报错的信息呢。于是日志管理就出现了。
  29. * 其次个人觉得做日志管理最好的是Aop,有的人也喜欢用拦截器。都可以,在此我重点介绍我的实现方式。 Aop有的人说拦截不到Controller。
  30. * 有的人说想拦AnnotationMethodHandlerAdapter截到Controller必须得拦截org
  31. * .springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter。
  32. * 首先Aop可以拦截到Controller的
  33. * ,这个是毋容置疑的其次须拦截AnnotationMethodHandlerAdapter也不是必须的。最起码我没有验证成功过这个
  34. * 。我的Spring版本是4.0.3。
  35. * Aop之所以有的人说拦截不到Controller是因为Controller被jdk代理了。我们只要把它交给cglib代理就可以了
  36. *
  37. * <!-- 启动对@AspectJ注解的支持 --> <aop:aspectj-autoproxy />
  38. * <!--通知spring使用cglib而不是jdk的来生成代理方法 AOP可以拦截到Controller-->
  39. * <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
  40. * <!-- 节点中proxy-target-class="true"不为true时。 *
  41. * 当登录的时候会报这个异常java.lang.NoSuchMethodException: $Proxy54.login(), -->
  42. * <aop:config proxy-target-class="true"></aop:config>
  43. *
  44. * 创建一个切点类
  45. *
  46. * @author Administrator
  47. *
  48. */
  49. @Aspect
  50. @Component
  51. public class SystemLogAspect {
  52.  
  53. // 本地异常日志记录对象
  54. private static final Logger log = LoggerFactory.getLogger(SystemLogAspect.class);
  55.  
  56. @Autowired
  57. LogService logService;
  58.  
  59. @Autowired
  60. private HttpServletRequest request;
  61.  
  62. // Controller层切点
  63. @Pointcut("@annotation(com.zktx.platform.log2.SystemControllerLog)")
  64. public void controllerAspect() {
  65. }
  66.  
  67. @After(value = "controllerAspect()")
  68. public void doAfter(JoinPoint joinPoint) {
  69. // 这里获取request;千万不要写在下边的线程里,因为得不到
  70. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  71. System.out.println(request.getAttribute("message") + "=======");
  72.  
  73. new Thread(new Runnable() {
  74.  
  75. @Override
  76. public void run() {
  77. try {
  78.  
  79. // log.info("进入日志系统————————————" + request.getLocalAddr());
  80. logInfo info = new logInfo();
  81. String description = getControllerMethodDescription(joinPoint);
  82. ShiroUser user = SecurityUtils.getShiroUser();
  83.  
  84. info.setUser_name(user.getName());
  85. info.setMessage(description);
  86. info.setIp_address(user.getIpAddress());
  87. info.setCreate_time(new Date());
  88. logService.insertLogInfo(info);
  89. } catch (Exception e) {
  90. e.printStackTrace();
  91. }
  92. }
  93. }).start();
  94. }
  95.  
  96. // 可以得到方法return的值
  97. @AfterReturning(returning = "ret", pointcut = "controllerAspect()")
  98. public void doAfterReturning(Object ret) throws Throwable {
  99. // 处理完请求,返回内容
  100. System.out.println(ret);
  101. Map<String, Object> map = (Map<String, Object>) ret;
  102. System.out.println(map.get("total"));
  103. }
  104.  
  105. // 通过反射获取参入的参数
  106. public static String getControllerMethodDescription(JoinPoint joinPoint) throws Exception {
  107. String targetName = joinPoint.getTarget().getClass().getName();
  108. String methodName = joinPoint.getSignature().getName();
  109. Object[] arguments = joinPoint.getArgs();
  110. Class targetClass = Class.forName(targetName);
  111. String description = "";
  112.  
  113. Method[] methods = targetClass.getMethods();
  114. for (Method method : methods) {
  115. if (method.getName().equals(methodName)) {
  116. Class[] clazzs = method.getParameterTypes();
  117.  
  118. if (clazzs.length == arguments.length) {
  119. description = method.getAnnotation(SystemControllerLog.class).description();
  120. break;
  121. }
  122. }
  123. }
  124. return description;
  125. }
  126. }

定义注解:

  1. package com.zktx.platform.log2;
  2.  
  3. /**
  4. * 自定义注解,拦截Controller
  5. */
  6. import java.lang.annotation.Documented;
  7. import java.lang.annotation.ElementType;
  8. import java.lang.annotation.Retention;
  9. import java.lang.annotation.RetentionPolicy;
  10. import java.lang.annotation.Target;
  11.  
  12. @Retention(RetentionPolicy.RUNTIME)
  13. @Target({ ElementType.METHOD, ElementType.PARAMETER })
  14. @Documented
  15. public @interface SystemControllerLog {
  16. String description() default "";
  17. }

使用方式:

  1. // 条件查询
  2. @SystemControllerLog(description = "查询导入表")
  3. @RequestMapping("/query")
  4. public @ResponseBody Map<String, Object> findByPagination(ImportTablesPo tablesPo) {
  5. log.info("导入表查询————————");
  6. try {
  7. int count = tableService.findCountByParms(tablesPo);
  8. List<ImportTablesWithBLOBs> list = tableService.findByPagination(tablesPo);
  9. Map<String, Object> map = new HashMap<String, Object>();
  10. map.put("total", count);
  11. map.put("rows", list);
  12. return map;
  13. } catch (Exception e) {
  14. e.printStackTrace();
  15. return null;
  16. }
  17.  
  18. }

springAOP注解方式实现日志操作的更多相关文章

  1. 来一手 AOP 注解方式进行日志记录

    系统日志对于定位/排查问题的重要性不言而喻,相信许多开发和运维都深有体会. 通过日志追踪代码运行状况,模拟系统执行情况,并迅速定位代码/部署环境问题. 系统日志同样也是数据统计/建模的重要依据,通过分 ...

  2. Jeecg中通过Spring_AOP+注解方式实现日志的管理

    转载;https://blog.csdn.net/ma451152002/article/details/77234236 Jeecg中通过Spring_AOP+注解方式实现日志的管理 一.设计思路 ...

  3. springboot搭建环境之使用@Slf4j注解方式,进行日志管理

    如果不想每次都写private  final Logger logger = LoggerFactory.getLogger(XXX.class); 可以用注解@Slf4j 需要引入依赖为: < ...

  4. spring AOP自定义注解方式实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

  5. MyBatis使用注解方式实现CRUD操作

    一.使用注解后就不需要写SysGroupDaoMapper.xml 只需要在Dao的抽象方法前加上相应的注解就可以. package cn.mg39.ssm01.dao; import java.ut ...

  6. SpringAOP(注解方式实现面向切面编程)之常用Before、After、Around

    一.首先在Springmvc.xml文件中引入如下内容(本示例是在ssm框架基础上实现的) 1.引入命名空间 xmlns:aop="http://www.springframework.or ...

  7. springAOP注解方式定义切入点报错error at ::0 can't find referenced pointcut

    [说明] 1.使用spring版本:4.0.4 2.springAOP相关依赖包: 1)aopalliance-1.0.jar 2)aspectjweaver-1.8.9.jar 3)aspectjr ...

  8. MyBatis注解方式批量插入操作

    @Insert({ "<script>", "insert into table_name(column1, column2, column3) values ...

  9. SpringAOP 注解方式

    Spring-service-mvc.xml <context:component-scan base-package="com.restful.controller,com.rest ...

随机推荐

  1. 1.java安全框架SHIRO

    1. shiro介绍 Apache Shiro是一个强大且易用的java安全框架,执行身份验证.授权.密码和会话管理. 使用Shiro的易于理解的API,您可以快速.轻松地获得任何应用程序,从最小的移 ...

  2. CruiseControl.NET 的安装与配置

    CC.NET 是 CruiseControl.NET 的简称,官方网站在这里. 官方的定义是自动连续集成服务, 使用Microsoft .NET Framework实现. 另外它还有Java的版本叫做 ...

  3. Css小动画

    html页面: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF ...

  4. SQL Server实现用户注册

    用SQL Server注册用户,通过页面输入注册信息,存储到数据库. <form action="zhuChe.jsp" method="post" on ...

  5. dubbo之隐式参数

    隐式参数 可以通过 RpcContext 上的 setAttachment 和 getAttachment 在服务消费方和提供方之间进行参数的隐式传递. 在服务消费方端设置隐式参数 setAttach ...

  6. SSDB 一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis.

    SSDB 一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis. 特性 替代 Redis 数据库, Redis 的 100 倍容量 LevelDB 网络支持, 使用 C/C++ ...

  7. vue实现单页应用demo

    vue + webpack +ES6/7 + axiso + vuex + vue-router构建项目前端,node + express + mongodb 开发后台 项目demo地址 https: ...

  8. 【剑指Offer】45、扑克牌顺子

      题目描述:   LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到 ...

  9. 【剑指Offer】43、左旋转字符串

      题目描述:   汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S ...

  10. MAC下redis的安装和配置

    1.下载 打开官网:https://redis.io/ 选择下载你要的版本压缩包 2.安装 打开终端,cd - 将下载的压缩包拷贝到local目录下:sudo cp Downloads/redis-4 ...