热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringAOP日志管理

2019独角兽企业重金招聘Python工程师标准首先感谢大家写的有关AOP的博客,本人参考了很多篇博客,走了一点小弯路,所以在此记录

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

首先感谢大家写的有关AOP的博客,本人参考了很多篇博客,走了一点小弯路,所以在此记录下配置的过程。 1、Mavan的相关依赖

org.springframeworkspring-aop3.2.2.RELEASEorg.springframeworkspring-aspects3.2.2.RELEASEorg.aspectjaspectjrt1.7.4

2、Spring 的配置文件


3、Struts2 的配置文件


4、日志实体(省略数据库的操作)

package com.gxuwz.entity;import javax.persistence.*;
@Entity
@Table(name = "sys_log")
public class SysLog extends BaseEntity{private static final long serialVersionUID = -2894437117210657269L;@Column(name = "log_ip_add")private String ipAdd; // IP地址@Column(name = "log_msg")private String msg; // 消息@Column(name = "log_method")private String method; // 方法@Column(name = "log_clazz")private String clazz; // 类名@Column(name = "log_username")private String username; // 用户名@Column(name = "log_create_date")private String createDate; //创建时间// 省略get、set的方法
}

5、自定义AOP的注解

package com.gxuwz.annotation;import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME) //注解会在class中存在,运行时可通过反射获取
@Target(ElementType.METHOD) //目标是方法
@Documented //文档生成时,该注解将被包含在javadoc中,可去掉
public @interface LogMsg
{String msg() default "";}

6、切面

package com.gxuwz.annotation;import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;import com.gxuwz.entity.SysLog;
import com.gxuwz.entity.SysUser;
import com.gxuwz.service.ILogService;
import com.gxuwz.util.DateUtils;
import com.opensymphony.xwork2.ActionContext;import java.lang.reflect.Method;
import java.util.Map;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;@Aspect
@Component
public class LogAspect {private static final Logger logger = Logger.getLogger(LogAspect.class);private SysLog log = new SysLog(); // 定义一个日志对象@Resource(name = "logService")private ILogService logService;/*** 定义Pointcut,Pointcut的名称,此方法不能有返回值,该方法只是一个标示*/@Pointcut("@annotation(com.gxuwz.annotation.LogMsg)")public void controllerAspect() {System.out.println("我是一个切入点");}/*** 前置通知(Before advice) :在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。* * @param joinPoint*/@Before("controllerAspect()")public void doBefore(JoinPoint joinPoint) {System.out.println("=====LogAspect前置通知开始=====");// handleLog(joinPoint, null);}/*** 后通知(After advice) :当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。* * @param joinPoint*/@AfterReturning(pointcut = "controllerAspect()")public void doAfter(JoinPoint joinPoint) {System.out.println("=====LogAspect后置通知开始=====");handleLog(joinPoint, null); // 等执行完SQL语句之后再记录,避免获取不到Session}/*** 抛出异常后通知(After throwing advice) : 在方法抛出异常退出时执行的通知。* * @param joinPoint* @param e*/@AfterThrowing(value = "controllerAspect()", throwing = "e")public void doAfter(JoinPoint joinPoint, Exception e) {System.out.println("=====LogAspect异常通知开始=====");// handleLog(joinPoint, e);}/*** 环绕通知(Around advice)* :包围一个连接点的通知,类似Web中Servlet规范中的Filter的doFilter方法。可以在方法的调用前后完成自定义的行为* ,也可以选择不执行。* * @param joinPoint*/@Around("controllerAspect()")public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("=====LogAspect 环绕通知开始=====");//handleLog(joinPoint, null);Object obj = joinPoint.proceed();System.out.println("=====LogAspect 环绕通知结束=====");return obj;}/*** 日志处理* * @param joinPoint* @param e*/private void handleLog(JoinPoint joinPoint, Exception e) {try {HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);System.out.println("IP地址:" + request.getRemoteAddr());log.setIpAdd(request.getRemoteAddr());Map session = (Map) ActionContext.getContext().getSession();// 读取session中的用户SysUser user = (SysUser) session.get("user");System.out.println("用户名:" + user.getUserName());log.setUsername(user.getUserName());System.out.println("时间:"+DateUtils.getCurrentDate());log.setCreateDate(DateUtils.getCurrentDate());LogMsg logger = giveController(joinPoint);if (logger == null) {return;}System.out.println("用户操作:"+logger.msg());log.setMsg(logger.msg());String signature = joinPoint.getSignature().toString(); // 获取目标方法签名String methodName = signature.substring(signature.lastIndexOf(".") + 1, signature.indexOf("("));//String longTemp = joinPoint.getStaticPart().toLongString();String classType = joinPoint.getTarget().getClass().getName();Class clazz = Class.forName(classType);Method[] methods = clazz.getDeclaredMethods();System.out.println("方法名:" + methodName);for (Method method : methods) {if (method.isAnnotationPresent(LogMsg.class)&& method.getName().equals(methodName)) {// OpLogger logger = method.getAnnotation(OpLogger.class);String clazzName = clazz.getName();log.setClazz(clazzName);log.setMethod(methodName);System.out.println("类名:" + clazzName + ", 方法名:"+ methodName);}}logService.save(log); //保存日志对象} catch (Exception exp) {logger.error("异常信息:{}", exp);exp.printStackTrace();}}/*** 获得注解* * @param joinPoint* @return* @throws Exception*/private static LogMsg giveController(JoinPoint joinPoint)throws Exception {Signature signature = joinPoint.getSignature();MethodSignature methodSignature = (MethodSignature) signature;Method method = methodSignature.getMethod();if (method != null) {return method.getAnnotation(LogMsg.class);}return null;}}

7、在Controller的方法上写注解、例如

/*** 用户控制器* @author 小胡 * @date 2017年5月28日*/
public class UserController extends AbstractBaseController{@LogMsg(msg = "用户登陆")public String doLogin(){...}
}


转:https://my.oschina.net/u/2489258/blog/915927



推荐阅读
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
author-avatar
果博东方手机版
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有