<!-- 操作日志切面声明 -->
<bean id="logAspect" class="com.tq365.service.sys.log.SystemLogAspect"/>
<aop:config>
<aop:aspect ref="logAspect">
</aop:aspect>
</aop:config>
Java代码:
/**
* 系统操作日志切面
*
* @author archie2010
* since 2011-3-17 下午02:44:03
*/
@Aspect
publicclass SystemLogAspect {
// int与long之Class会自动转为其封装类型之Class
privatestaticfinal String integerClazz ="class java.lang.Integer";
privatestaticfinal String longClazz ="class java.lang.Long";
@Resource
private SystemLogService systemLogService;
private Logger logger = Logger.getLogger(this.getClass().getName());
@Pointcut("execution(* com.tq365.service..*.*(..))")
publicvoid myAspect() {
};
@AfterThrowing(pointcut ="myAspect()", throwing ="e")
publicvoid 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)")
publicvoid 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;
} elseif (jp.getArgs()[i].getClass().toString().equals(
longClazz)) {
claszs[i] =long.class;
}else{
claszs[i] =jp.getArgs()[i].getClass();
}
}elseif(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 进行日志记录,例子里面通过aop的配置,把产生的日志存放到当前项目的根目录下,而且对方法执行过程中的参数进行了记录,对于aop如何记录日志不清楚的同学可以看看。
Spring AOP 日志管理 实例LoggingThrowsAdvice.java
本项目旨在演示如何在Spring AOP中添加日志功能,以实现对应用程序执行过程的透明跟踪。通过使用Java 1.8,我们可以利用其新特性,如Lambda表达式,来简化代码。 首先,让我们理解Spring AOP的基本概念。AOP是面向...
总的来说,Spring AOP通过代理和通知机制,实现了横切关注点的模块化,使得业务逻辑与系统服务(如日志、事务等)解耦,提高了代码的可读性和可维护性。同时,引介功能进一步增强了切面的功能,可以为对象动态地添加...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一部分,它提供了一种优雅的方式来处理横切关注点,如日志、事务管理、性能监控等。这些关注点通常会分散在应用程序的各个角落,而AOP则允许...
总结一下,Spring AOP提供了一种优雅的方式来处理系统的横切关注点,如日志记录、事务管理或性能监控。通过定义切点、创建切面和配置通知,我们可以实现代码的解耦,提高可维护性和复用性。这个例子提供了学习Spring...
spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...
总结来说,Spring AOP为日志管理提供了强大且灵活的解决方案。通过定义切面和通知,我们可以轻松地在程序的关键点插入日志记录,从而更有效地进行问题排查和性能分析。在实际项目中,可以根据需求调整切面的定义和...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为Java应用程序提供了声明式的企业级服务,如事务管理、性能监控等。在Spring AOP中,我们可以通过定义切面(Aspect...
在Spring AOP(面向切面编程)中,我们经常利用它来实现横切关注点,如日志记录、事务管理等。"springaop拦截controller日志"这个主题旨在讲解如何使用Spring AOP来拦截Controller层的方法调用,并在方法执行前后...
为了解决这一问题,可以利用Spring框架中的AOP(Aspect Oriented Programming,面向切面编程)技术来实现。 #### 二、Spring AOP 概述 Spring AOP 是Spring框架提供的一种实现AOP的方法。通过AOP,开发者可以在不...
为了解决这一挑战,面向方面编程(AOP)应运而生。Spring框架作为Java开发领域的领头羊之一,提供了强大的AOP支持。本文旨在深入探讨Spring AOP的核心概念及其原理。 #### 二、AOP基本概念 AOP是一种编程范式,其目的...
Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许程序员在不修改源代码的情况下,通过“切面”来插入额外的业务逻辑,如日志、事务管理等。AOP的引入极大地提高了代码的可复用性和可维护性。 ### 1. ...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要模块,它通过提供声明式的方式来实现面向切面编程,从而简化了应用程序的开发和维护。在Spring AOP中,我们无需深入到每个...
Spring AOP 是一种面向切面编程的技术,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态...