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

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. http接口 两种调用http接口的方法

    import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.NameValuePair; ...

  2. SQLServer2008 将“单个用户”改为“多用户”

    一开始是要想要分离掉数据库,然后将其删除 不知道为什么一直分离不了,试了很多次,又尝试直接删除 结果数据库突然显示成了“单个用户” 尝试查看其属性,或者“新建查询”也都报错,提示已经有其他用户建立了连 ...

  3. node函数buf.readDoubleBE详解

    offset {Number} 0 noAssert {Boolean} 默认:false 返回:{Number} 从该 Buffer 指定的带有特定尾数格式(readDoubleBE() 返回一个较 ...

  4. intellij 创建java web项目(maven管理的SSH)

    intellij 创建java web项目(maven管理的SSH) 环境intellij IDEA14.MAVEN.Spring.Struts2.Hibernate.Java Web.工程搭建. 1 ...

  5. SLAM: Ubuntu14.04_Kylin安装ROS-Indigo

    参考连接:ROS-Indigo版在Ubuntu上的安装第一步: 软件源配置 1. 增加下载源(增加ubuntu版的ros数据仓库,即下载源)(通用指令适合任何版本的ros) sudo sh -c 'e ...

  6. 使用std::cout不能输出显示

    在测试一行函数时,出现std::cout不能输出的情况,找不到原因. 1.         只好从main函数第一行,开始测试,直到发现一个函数 o_Initer.ekf_filter(filter, ...

  7. react基础篇一

    jsx简介 const element = <h1>Hello, world!</h1>; 这种看起来可能有些奇怪的标签语法既不是字符串也不是 HTML. 它被称为 JSX, ...

  8. The as! Operator

    Prior to Swift 1.2, the as operator could be used to carry out two different kinds of conversion, de ...

  9. 我所理解的monad(4):函子(functor)是什么--可把范畴简单的看成高阶类型

    大致介绍了幺半群(monoid)后,我们重新回顾最初引用wadler(haskell委员会成员,把monad引入haskell的家伙)的那句话: 现在我们来解读这句话中包含的另一个概念:自函子(End ...

  10. Python标准模块--logging(转载)

    转载地址:http://www.cnblogs.com/zhbzz2007/p/5943685.html#undefined Python标准模块--logging 1 logging模块简介 log ...