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

package com.zktx.platform.log2;

import java.lang.reflect.Method;
import java.util.Date;
import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import com.zktx.platform.entity.tb.logInfo;
import com.zktx.platform.entity.tb.user.ShiroUser;
import com.zktx.platform.service.log.LogService;
import com.zktx.platform.shiro.SecurityUtils; /**
* * 首先我们为什么需要做日志管理,在现实的上线中我们经常会遇到系统出现异常或者问题。 这个时候就马上打开CRT或者SSH连上服务器拿日子来分析。
* 受网络的各种限制。于是我们就想为什么不能直接在管理后台查看报错的信息呢。于是日志管理就出现了。
* 其次个人觉得做日志管理最好的是Aop,有的人也喜欢用拦截器。都可以,在此我重点介绍我的实现方式。 Aop有的人说拦截不到Controller。
* 有的人说想拦AnnotationMethodHandlerAdapter截到Controller必须得拦截org
* .springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter。
* 首先Aop可以拦截到Controller的
* ,这个是毋容置疑的其次须拦截AnnotationMethodHandlerAdapter也不是必须的。最起码我没有验证成功过这个
* 。我的Spring版本是4.0.3。
* Aop之所以有的人说拦截不到Controller是因为Controller被jdk代理了。我们只要把它交给cglib代理就可以了
*
* <!-- 启动对@AspectJ注解的支持 --> <aop:aspectj-autoproxy />
* <!--通知spring使用cglib而不是jdk的来生成代理方法 AOP可以拦截到Controller-->
* <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
* <!-- 节点中proxy-target-class="true"不为true时。 *
* 当登录的时候会报这个异常java.lang.NoSuchMethodException: $Proxy54.login(), -->
* <aop:config proxy-target-class="true"></aop:config>
*
* 创建一个切点类
*
* @author Administrator
*
*/
@Aspect
@Component
public class SystemLogAspect { // 本地异常日志记录对象
private static final Logger log = LoggerFactory.getLogger(SystemLogAspect.class); @Autowired
LogService logService; @Autowired
private HttpServletRequest request; // Controller层切点
@Pointcut("@annotation(com.zktx.platform.log2.SystemControllerLog)")
public void controllerAspect() {
} @After(value = "controllerAspect()")
public void doAfter(JoinPoint joinPoint) {
// 这里获取request;千万不要写在下边的线程里,因为得不到
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
System.out.println(request.getAttribute("message") + "======="); new Thread(new Runnable() { @Override
public void run() {
try { // log.info("进入日志系统————————————" + request.getLocalAddr());
logInfo info = new logInfo();
String description = getControllerMethodDescription(joinPoint);
ShiroUser user = SecurityUtils.getShiroUser(); info.setUser_name(user.getName());
info.setMessage(description);
info.setIp_address(user.getIpAddress());
info.setCreate_time(new Date());
logService.insertLogInfo(info);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
} // 可以得到方法return的值
@AfterReturning(returning = "ret", pointcut = "controllerAspect()")
public void doAfterReturning(Object ret) throws Throwable {
// 处理完请求,返回内容
System.out.println(ret);
Map<String, Object> map = (Map<String, Object>) ret;
System.out.println(map.get("total"));
} // 通过反射获取参入的参数
public static String getControllerMethodDescription(JoinPoint joinPoint) throws Exception {
String targetName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
Object[] arguments = joinPoint.getArgs();
Class targetClass = Class.forName(targetName);
String description = ""; Method[] methods = targetClass.getMethods();
for (Method method : methods) {
if (method.getName().equals(methodName)) {
Class[] clazzs = method.getParameterTypes(); if (clazzs.length == arguments.length) {
description = method.getAnnotation(SystemControllerLog.class).description();
break;
}
}
}
return description;
}
}

定义注解:

package com.zktx.platform.log2;

/**
* 自定义注解,拦截Controller
*/
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.PARAMETER })
@Documented
public @interface SystemControllerLog {
String description() default "";
}

使用方式:

// 条件查询
@SystemControllerLog(description = "查询导入表")
@RequestMapping("/query")
public @ResponseBody Map<String, Object> findByPagination(ImportTablesPo tablesPo) {
log.info("导入表查询————————");
try {
int count = tableService.findCountByParms(tablesPo);
List<ImportTablesWithBLOBs> list = tableService.findByPagination(tablesPo);
Map<String, Object> map = new HashMap<String, Object>();
map.put("total", count);
map.put("rows", list);
return map;
} catch (Exception e) {
e.printStackTrace();
return null;
} }

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. Oracle快速收集AWR的方案

    记一种方便的awr收集方法,该脚本可以按小时收集目标时段的awr 素材:awr_generate.sql(具体脚本内容请见本文末尾) (1)将awr_generate.sql置于数据库服务器本地路径, ...

  2. C# 多线程系列(三)

    线程池 创建线程需要时间,如果有不同的小任务要完成,就可以事先创建许多线程,在应完成这些任务时发出请求.这个线程数最好在需要更多线程时增加,在需要释放资源时减少. 不需要自己创建这样的一个列表.该列表 ...

  3. C# 如何实现WinForm程序自重启(重新启动自己)

    重启的时间间隔方法 private void Restart() { Thread thtmp = new Thread(new ParameterizedThreadStart(run)); obj ...

  4. vue-cli脚手架安装过程(精简版)

    1:打开node的控制台,并找到对应的文件夹 2:检查node的版本 node -v 3:检查npm的版本 npm -v 4:检查cnpm的版本 cnpm -v 5:安装全局及脚手架 cnpm ins ...

  5. 一张图说明DIV盒子距离

    虚线的宽高为你实际指定的width和height 虚线外的白色区域为padding 红色区域为border的width 红色外的区域为margin

  6. iphone(苹果)手机浏览器顶部下拉出现网页源

    在苹果手机下拉页面,会出现类似上图那样,具体方法如下: function handler(){//禁止默认滑动函数 event.preventDefault();}document.addEventL ...

  7. Android开发笔记(13)——ListFragment

    转载请注明:http://www.cnblogs.com/igoslly/p/6959108.html ListFragment ListFragment是继承于Fragment的类,专门用于包含Li ...

  8. JavaScript变量提升及作用域

    今天在知乎看前端面试题的时候,看到这样的问题,发现自己懂的真的是太少了,看了给的例子,所以写一下自己的理解. 首先放一段代码: var v= “hello JavaScript”; alert(v); ...

  9. Ubuntu中在终端进入root权限但是总提示密码错误的解决方案

    先解除root锁定,为root用户重新设置密码 打开终端输入:sudo passwd(注意是passwd不是password) Password: <--- 输入你当前用户的密码 Enter n ...

  10. SQL Server 检测到基于一致性的逻辑 I/O 错误 pageid 不正确(应为 1:1772,但实际为 0:0)。在文件 'D:\Program Files\Microsoft SQL Ser

    SQL Server 检测到基于一致性的逻辑 I/O 错误 pageid 不正确(应为 1:1772,但实际为 0:0).在文件 'D:\Program Files\Microsoft SQL Ser ...