配置文件:
<!-- 操作日志切面声明 --> <bean id="logAspect" class="com.tq365.service.sys.log.SystemLogAspect"/> <aop:config> <aop:aspect ref="logAspect"> </aop:aspect> </aop:config>
实现代码:
/** * 系统操作日志切面 * * @author archie2010 * since 2011-3-17 下午02:44:03 */ @Aspect public class SystemLogAspect { // int与long之Class会自动转为其封装类型之Class private static final String integerClazz = "class java.lang.Integer"; private static final String longClazz = "class java.lang.Long"; @Resource private SystemLogService systemLogService; private Logger logger = Logger.getLogger(this.getClass().getName()); @Pointcut("execution(* com.tq365.service..*.*(..))") public void myAspect() { }; @AfterThrowing(pointcut = "myAspect()", throwing = "e") public void doAfterThrowing(JoinPoint jp, Throwable e) { System.out.println("出现异常:" + e.getMessage()); System.out.println(e.getClass().getName()); System.out.println("异常所在类:" + jp.getTarget().getClass().getName()); System.out.println("" + jp.getSignature().getName() + "方法 throw exception"); // logger.error("错误! error级别的!!!"+e.getMessage()); logger.error("Oops===" + jp.getTarget().getClass().getName() + "中的" + jp.getSignature().getName() + "方法抛出" + e.getClass().getName() + "异常"); System.out.println("参数:"); ; if (jp.getArgs() != null && jp.getArgs().length > 0) { for (int i = 0; i < jp.getArgs().length; i++) { System.out.println(jp.getArgs()[i].toString()); logger.error("参数:--" + jp.getArgs()[i].toString()); } } } @SuppressWarnings("unchecked") @After("@annotation(com.tq365.sys.annotation.SystemLogAnnotation)") public void doAfter(JoinPoint jp) { System.out.println("----------后置通知"); System.out.println("方法所在类:" + jp.getTarget().getClass().getName()); System.out.println("" + jp.getSignature().getName() + "方法"); String methodName = jp.getSignature().getName(); // 操作日志对象----------------- SystemLog sysLog = new SystemLog(); // 操作参数----------------- String descArgs = "参数"; if (jp.getArgs() != null && jp.getArgs().length > 0) { for (int i = 0; i < jp.getArgs().length; i++) { if(jp.getArgs()[i]!=null){ //System.out.println(jp.getArgs()[i].toString()); descArgs += jp.getArgs()[i].toString()+","; }else{ descArgs +="null"+","; } } System.out.println("------参数" + descArgs); } sysLog.setOperateArgs(descArgs); String des = null;//方法描述 if (!(methodName.startsWith("set") || methodName.startsWith("get"))) { Class targetClass = jp.getTarget().getClass(); //方法不定向参数Clazz... Class[] claszs = new Class[jp.getArgs().length]; for (int i = 0; i < jp.getArgs().length; i++) { //System.out.println(jp.getArgs()[i]); if(jp.getArgs()[i]!=null){ System.out.println(jp.getArgs()[i].getClass()); if (jp.getArgs()[i].getClass().toString().equals(integerClazz)) { claszs[i] = int.class; } else if (jp.getArgs()[i].getClass().toString().equals( longClazz)) { claszs[i] = long.class; }else{ claszs[i] =jp.getArgs()[i].getClass(); } }else if(jp.getArgs()[i]==null){ claszs[i] = String.class; } } Method method=null; try { method = targetClass.getMethod(methodName, claszs); } catch (SecurityException e) { } catch (NoSuchMethodException e) { } //若方法为空(描述无法获得则des=null) if(method!=null){ System.out.println(method.getAnnotation(SystemLogAnnotation.class) .description()); des = method.getAnnotation(SystemLogAnnotation.class).description(); } } // 获得Session HttpSession session = ServletActionContext.getRequest().getSession(); // 取到当前的操作用户 User appUser = (User) session.getAttribute("USER"); if (appUser != null) { System.out.println("用户已经存在Session中"); // 操作日志对象 sysLog.setUid(appUser.getUserId()); sysLog.setUsername(appUser.getFullName()); } HttpServletRequest request = ServletActionContext.getRequest(); String ip = request.getRemoteAddr(); sysLog.setOperateTime(DateUtil.getCurrentTime()); sysLog.setOperateDes(methodName +"->"+ des); sysLog.setIp(ip); systemLogService.save(sysLog); System.out.println("----------保存操作日志"); } }
相关推荐
4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、...
在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许我们在不修改源代码的情况下,对程序进行横向关注点的插入,比如日志记录、事务管理、权限检查等。在这里,我们重点关注如何利用Spring AOP实现分层...
Spring AOP(Aspect Oriented Programming,面向切面...总的来说,Spring AOP通过提供面向切面的编程能力,极大地提高了代码的可复用性和可维护性,降低了系统复杂度,特别是在处理共性问题如日志、事务、安全等方面。
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...
标题"spring aop实现日志功能"涉及到的是如何利用Spring AOP来记录和跟踪应用程序中的操作,这对于调试、性能分析和故障排查至关重要。下面我们将详细探讨如何通过Spring AOP来实现日志功能。 首先,理解AOP的基本...
spring aop实现接口参数变更前后对比和日志记录完整代码,拿到项目代码,只需要做数据库连接的修改即可运行起来使用,代码案例详细,真是可靠,代码原文地址:...
总结一下,Spring AOP提供了一种优雅的方式来处理系统的横切关注点,如日志记录、事务管理或性能监控。通过定义切点、创建切面和配置通知,我们可以实现代码的解耦,提高可维护性和复用性。这个例子提供了学习Spring...
通过以上介绍,我们可以看出,利用Spring机制记录系统日志是一项涉及AOP、XML配置、日志框架集成等多个方面的任务。正确实施这一机制,能够有效地提升系统的可维护性和稳定性,帮助开发者更好地理解和调试系统。
在Spring框架中,AOP主要用来处理横切关注点,如事务管理、安全控制和日志记录等,这些关注点通常分散在应用程序的多个地方。通过AOP,我们可以把这些关注点抽取出来,集中管理,减少代码的冗余。 日志管理在软件...
6. 结合Swagger UI:Swagger UI可以展示API文档,同时,通过AOP记录的日志可以在后台系统中查看,以便分析API的使用情况。 通过这种方式,我们可以实现对Swagger定义的API的全面日志跟踪,为API的调试、性能优化和...
在实际开发中,Spring AOP的日志记载不仅限于打印方法名和返回值,还可以记录参数、执行时间、异常信息等,帮助开发者更好地监控和调试系统。 综上所述,Spring AOP提供了一种优雅的方式,让我们能够轻松地在不...
本节将详细介绍如何使用Spring AOP实现流程日志跟踪,主要关注于如何通过AOP拦截特定的类和方法来进行日志记录。 ##### 3.1 配置Spring AOP 在Spring配置文件中定义切面和切入点表达式是非常关键的一步。一般来说...
内容概要: 充分利用SpringBoot AOP设计的精妙日志记录方案,实现高效的日志处理策略。此外,我们还支持通过配置文件(yml)精准控制日志开关,并定制AOP切点表达式(Pointcut)。 适用人群: 针对资深Java开发者、...
Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的可复用性和可维护性。 ### 1. ...
它通过非侵入性和轻量级的设计理念,使得开发者能够轻松地将诸如日志记录、事务管理等功能添加到现有的系统中,从而提高了代码的可维护性和扩展性。对于希望深入了解Spring AOP原理与实践的读者来说,掌握以上概念将...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理等。在Java应用中,AOP通过代理模式实现了切面编程,使得我们可以将业务逻辑...
- **日志记录**:使用AOP记录方法的调用日志,提高代码可读性和维护性。 - **事务管理**:通过AOP实现声明式事务管理,简化事务控制代码。 - **性能监控**:在关键方法前、后插入性能计时通知,便于性能分析。 -...
本项目“Spring MVC Mybatis Plus 实现AOP 切面日志系统”旨在提供一个基础的日志记录框架,能够自动追踪和记录应用程序的关键操作,同时支持数据持久化到数据库中,方便后期分析和问题排查。下面将详细介绍这些技术...
在Java应用中,AOP主要用于日志记录、性能统计、安全控制、事务管理等方面,通过将这些通用功能模块化,可以避免重复代码,提高代码的可维护性和复用性。 Spring AOP的实现基于动态代理,有两种代理方式:JDK动态...