application.xml配置
<aop:aspectj-autoproxy />
<bean id="logAspect" class="com.ciming.action.log.LogAspect" />
LogAspect日志
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import com.ciming.bo.LogVo;
import com.ciming.service.ILogService;
/**
*
* @Description: 拦截器处理日志信息
* @author liyong
* @date 2014年11月26日 上午11:09:19
* @version V1.0
*
*/
@Aspect
public class LogAspect {
@Resource
private ILogService logService;
/**
* 添加业务逻辑方法切入点
*/
@Pointcut("execution(* com.ciming.service.*.insert*(..))")
public void insertServiceCall() {
}
/**
* 修改业务逻辑方法切入点
*/
@Pointcut("execution(* com.ciming.service.*.update*(..))")
public void updateServiceCall() {
}
/**
* 删除影片业务逻辑方法切入点
*/
@Pointcut("execution(* com.ciming.service.*.delete*(..))")
public void deleteServiceCall() {
}
/**
* 管理员添加操作日志(后置通知)
*
* @param joinPoint
* @param rtv
* @throws Throwable
*/
@AfterReturning(value = "insertServiceCall()", argNames = "rtv", returning = "rtv")
public void insertServiceCallCalls(JoinPoint joinPoint, Object rtv)
throws Throwable {
// 判断参数
if (joinPoint.getArgs() == null) {
return;
}
// 获取方法名
// String methodName = joinPoint.getSignature().getName();
// 获取日志信息
LogVo log = getOperatorLog(joinPoint.getArgs());
if (log == null) {
return;
}
// 执行结果
int ret = (Integer) rtv;
if (ret >= 1) {
log.setOperResult("添加成功");
} else {
log.setOperResult("添加失败");
}
// 准备添加的数据
Map<String, Object> map = new HashMap<String, Object>();
map.put("userId", log.getUserId());
map.put("menuName", log.getMenuName());
map.put("operation", log.getOperation());
map.put("content", log.getContent());
map.put("operResult", log.getOperResult());
map.put("logIp", log.getLogIp());
map.put("logMac", log.getLogMac());
map.put("comName", log.getComName());
map.put("result", null);
// 添加日志
logService.insertLog(map);
}
/**
* 管理员修改操作日志(后置通知)
*
* @param joinPoint
* @param rtv
* @throws Throwable
*/
@AfterReturning(value = "updateServiceCall()", argNames = "rtv", returning = "rtv")
public void updateServiceCallCalls(JoinPoint joinPoint, Object rtv)
throws Throwable {
// 判断参数
if (joinPoint.getArgs() == null) {
return;
}
// 获取方法名
// String methodName = joinPoint.getSignature().getName();
// 获取日志信息
LogVo log = getOperatorLog(joinPoint.getArgs());
if (log == null) {
return;
}
// 执行结果
int ret = (Integer) rtv;
if (ret >= 1) {
log.setOperResult("成功");
} else {
log.setOperResult("失败");
}
// 准备添加的数据
Map<String, Object> map = new HashMap<String, Object>();
map.put("userId", log.getUserId());
map.put("menuName", log.getMenuName());
map.put("operation", log.getOperation());
map.put("content", log.getContent());
map.put("operResult", log.getOperResult());
map.put("logIp", log.getLogIp());
map.put("logMac", log.getLogMac());
map.put("comName", log.getComName());
map.put("result", null);
// 添加日志
logService.insertLog(map);
}
/**
* 管理员删除影片操作(环绕通知),使用环绕通知的目的是 在影片被删除前可以先查询出影片信息用于日志记录
*
* @param joinPoint
* @param rtv
* @throws Throwable
*/
@AfterReturning(value = "deleteServiceCall()", argNames = "rtv", returning = "rtv")
public void deleteServiceCall(JoinPoint joinPoint, Object rtv)
throws Throwable {
// 判断参数
if (joinPoint.getArgs() == null) {
return;
}
// 获取方法名
// String methodName = joinPoint.getSignature().getName();
// 获取日志信息
LogVo log = getOperatorLog(joinPoint.getArgs());
if (log == null) {
return;
}
// 执行结果
int ret = (Integer) rtv;
if (ret >= 1) {
log.setOperResult("删除成功");
} else {
log.setOperResult("删除失败");
}
// 准备添加的数据
Map<String, Object> map = new HashMap<String, Object>();
map.put("userId", log.getUserId());
map.put("menuName", log.getMenuName());
map.put("operation", log.getOperation());
map.put("content", log.getContent());
map.put("operResult", log.getOperResult());
map.put("logIp", log.getLogIp());
map.put("logMac", log.getLogMac());
map.put("comName", log.getComName());
map.put("result", null);
// 添加日志
logService.insertLog(map);
}
/**
*
* @Description: 获取参数的日志信息
* @author liyong
* @date 2014年11月26日 上午11:02:38
* @version V1.0
*
*/
protected LogVo getOperatorLog(Object[] args) {
LogVo log = null;
// 类名
String className = null;
if (args == null) {
return null;
}
for (Object info : args) {
// 获取对象类型
className = info.getClass().getName();
className = className.substring(className.lastIndexOf(".") + 1);
// 当方法中包含有日志的Bean表示当前要做拦截,否则不用拦截
if (className.equals("LogVo")) {
log = (LogVo) info;
}
}
return log;
}
/**
*
* @Description: 拼操作内容
* @author liyong
* @param args方法参数
* @param mName方法名称
* @date 2014年11月26日 上午11:03:15
* @version V1.0
*
*/
public String adminOptionContent(Object[] args, String mName)
throws Exception {
if (args == null) {
return null;
}
StringBuffer rs = new StringBuffer();
rs.append(mName);
String className = null;
int index = 1;
// 遍历参数对象
for (Object info : args) {
// 获取对象类型
className = info.getClass().getName();
className = className.substring(className.lastIndexOf(".") + 1);
rs.append("[参数" + index + ",类型:" + className + ",值:");
// 获取对象的所有方法
Method[] methods = info.getClass().getDeclaredMethods();
// 遍历方法,判断get方法
for (Method method : methods) {
String methodName = method.getName();
// 判断是不是get方法
if (methodName.indexOf("get") == -1) {// 不是get方法
continue;// 不处理
}
Object rsValue = null;
try {
// 调用get方法,获取返回值
rsValue = method.invoke(info);
if (rsValue == null) {// 没有返回值
continue;
}
} catch (Exception e) {
continue;
}
// 将值加入内容中
rs.append("(" + methodName + " : " + rsValue + ")");
}
rs.append("]");
index++;
}
return rs.toString();
}
}
分享到:
相关推荐
在Spring AOP中,切面可以通过注解或XML配置来定义。 - 连接点(Join Point):连接点是程序执行过程中的一个特定点,例如方法的调用或字段的访问。 - 切入点(Pointcut):切入点是连接点的集合,定义了切面将在...
Spring AOP是Spring框架的重要组成部分,它提供了面向切面编程的能力,使得开发者可以在不修改源代码的情况下对程序进行横切关注点(如日志、事务管理等)的处理。`spring-aop.xsd`文件是Spring AOP配置的XML Schema...
Spring AOP(面向切面编程)是 Spring 框架的一个重要部分,它允许开发者在不修改源代码的情况下,实现跨切面的关注点,如日志、事务管理等。`spring-aop-3.0.xsd` 是 Spring AOP 的 XML 配置文件,定义了与 AOP ...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它为开发者提供了声明式事务管理、日志记录、权限控制等核心功能。在4.0.0.RELEASE版本中,Spring AOP进一步优化了其性能和...
在Spring框架中,AOP主要用于日志记录、事务管理、性能统计等场景。本示例是关于如何在Spring Boot项目中实现AOP功能的一个简单演示。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了跨越...
在Spring AOP中,我们可以使用注解或者XML配置来定义切面。例如,@Aspect注解用于声明一个类为切面,@Before、@After、@AfterReturning、@AfterThrowing和@Around用于定义不同的通知类型。切入点表达式使用一种类似...
在实际使用Spring AOP时,可以通过注解或XML配置来定义切面。例如,我们可以使用`@Aspect`注解来声明一个类作为切面,使用`@Before`、`@After`等注解来定义通知,使用`@Pointcut`来定义切入点表达式。 以下是一些...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许程序员在不修改源代码的情况下,通过添加额外的行为(即“切面”)来增强应用程序的功能。在Spring AOP中,主要有三个核心概念:Advice、Pointcut和...
当我们在项目中引入这个jar包,就可以利用Spring的AOP特性来编写代码,以更优雅的方式管理那些横切多个业务逻辑的通用功能,如日志记录、事务管理、性能监控等。 首先,我们需要理解AOP的基本概念。AOP是一种编程...
与AspectJ不同,Spring AOP默认使用代理模式(如JDK动态代理或CGLIB),但在配置后也能与AspectJ结合使用,利用AspectJ Weaver进行更强大的字节码织入。 最后,spring-aspects-4.3.6.RELEASE是Spring框架的另一个...
Spring AOP,全称为Aspect-Oriented Programming,是Spring框架中的一个重要组成部分,主要用来处理系统的横切关注点,如日志记录、事务管理、性能监控等。这些关注点通常会分散在应用程序的各个角落,而AOP就是为了...
在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许程序员定义“切面”,这些切面封装了应用程序中的交叉关注点,如日志、事务管理、权限检查等。Spring AOP是基于代理的,它可以为普通Java对象(POJOs)...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种强大的方式来实现横切关注点,如日志、事务管理、性能监控等,而无需侵入业务代码。下面将详细介绍Spring AOP的注解方式和XML配置方式。 ### ...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、安全性等。本示例"Spring-AOP demo"旨在展示如何在Java四层架构(表示层、...
在本示例中,我们探讨的是如何在Spring Boot项目中使用Spring AOP(面向切面编程)实现环绕通知,以自动记录日志的功能。Spring AOP是Spring框架的一部分,它允许我们在不修改源代码的情况下,对应用程序进行横切...
Spring AOP,即Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为应用程序提供了一种模块化和声明式的方式来处理横切关注点,如日志、事务管理、性能监控等。在本"Spring-AOP源码Demo...
7. **配置方式**:Spring AOP可以通过XML配置、注解或者自定义的Aspect类来实现。注解驱动的AOP更简洁,而自定义Aspect类提供了更大的灵活性。 8. **织入(Weaving)**:织入是将切面应用到目标对象以创建代理对象...
在IT行业中,Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的核心特性之一,它使得我们能够以一种声明式的方式处理系统中的横切关注点,如日志记录、事务管理、性能监控等。这个“spring-...
在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许程序员定义横切关注点,如日志、事务管理、权限检查等,这些关注点可以被模块化为可重用的切面,避免了传统编程中的大量重复代码。本实例将探讨如何在...
在Spring中,AOP主要用于实现日志记录、事务管理、性能监控等跨切面关注点。 “proxy”则指的是代理,在Spring AOP中,主要有两种代理方式:JDK动态代理和CGLIB代理。JDK动态代理是基于接口的,当目标对象实现了...