Aoputils工具类
实现功能
getRequestParams(JoinPoint) Map<String,Object>
:该方法用于获取请求参数,并将它们映射为一个键值对集合。其中,JoinPoint表示切入点,Map<String,Object>用于存储参数的键值对。
isFilterObject(Object) boolean
:该方法用于判断对象是否满足特定的条件或过滤器。如果对象满足条件,则返回true;否则,返回false。
简单来说,这个工具类提供了一个静态方法getRequestParams
,它接受一个JoinPoint
对象,通过这个对象可以获取到方法调用的参数信息。该方法会遍历所有的参数,并使用isFilterObject
方法排除掉HttpServletRequest
、HttpServletResponse
和MultipartFile
类型的参数。剩下的参数会被放入一个有序的Map
中,并返回这个Map。这样,在AOP
的切面中就可以方便地获取和记录非过滤对象的参数信息。
备注
Aop
AOP(Aspect-Oriented Programming,面向切面编程
)是一种编程范式,它允许开发者对横切关注点(cross-cutting concerns)进行模块化。横切关注点是指那些影响应用多部分的特性,如日志、事务、安全等,它们通常散布在核心业务逻辑中。
在AOP中,开发者可以将这些横切关注点抽象成“切面”(Aspects),然后将它们织入(Weave)到程序的各个部分,而不是直接在业务逻辑中编写这些代码。这样做的好处是提高了代码的模块化和重用性,使得核心业务逻辑更加清晰。
AOP的主要概念包括:
- 切面(Aspect):横切关注点的模块化,通常包括通知(Advice)和切点(Pointcut)。
- 连接点(Join Point):程序执行过程中的某个特定点,如方法执行、异常抛出等。
- 通知(Advice):在切点上执行的动作,包括前置通知(Before)、后置通知(After)、环绕通知(Around)、异常通知(After Throwing)和最终通知(After Returning)。
- 切点(Pointcut):一组连接点的集合,定义了通知应该应用到哪些连接点上。
- 引入(Introduction):允许声明额外的方法或字段到现有的类中。
- 织入(Weaving):将切面的代码织入到目标对象的生命周期中,可以在编译时、加载时或运行时进行。
在Java中,AOP通常通过Spring AOP或AspectJ来实现。Spring AOP是基于代理的AOP实现,而AspectJ是一个完整的AOP框架,它提供了更强大的功能和编译时织入的能力。
在Spring框架中,AOP可以通过注解或XML配置来实现。开发者可以使用@Aspect
注解来定义切面,使用@Pointcut
来定义切点,使用不同的通知注解来指定在切点上执行的动作。
AOP在处理日志记录、性能监控、事务管理、安全控制等方面非常有用,它帮助开发者将这些横切关注点与业务逻辑分离,使得代码更加干净、易于维护。
Map
在Java编程语言中,Map
是一个接口,它用于存储键值对(key-value pairs)。每个键都映射到一个值,并且一个键只能映射到一个值。Map
接口提供了多种方法来操作键值对,例如添加、删除、查找和遍历。
以下是一些Map
接口的常用方法:
put(K key, V value)
: 将指定的值与指定的键相关联。get(Object key)
: 返回与指定键关联的值,如果映射中不包含键的映射,则返回 null。remove(Object key)
: 移除键的映射(如果存在)。containsKey(Object key)
: 如果映射包含指定键的映射,则返回 true。containsValue(Object value)
: 如果映射将一个或多个键映射到指定值,则返回 true。size()
: 返回映射中的键值映射数量。isEmpty()
: 如果映射为空,则返回 true。clear()
: 移除所有映射。
在Java标准库中,Map
接口有多种实现,包括但不限于:HashMap
: 基于哈希表的实现,提供快速的查找、插入和删除操作。LinkedHashMap
: 继承自HashMap
,维护了键值对的插入顺序。TreeMap
: 基于红黑树的实现,可以确保键值对按照键的自然顺序或自定义顺序排序。Hashtable
: 与HashMap
类似,但是它是同步的,适用于多线程环境。ConcurrentHashMap
: 支持高并发性的哈希表实现,允许多个线程并发访问。
在AOP工具类AopUtils
中,Map
被用来存储方法的参数名和参数值,这样可以在切面逻辑中访问和操作这些参数。
完整代码注释
package com.rawchen.util;
// 导入与AOP相关的AspectJ类,用于获取连接点数据
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
// 导入与文件上传相关的MultipartFile类
import org.springframework.web.multipart.MultipartFile;
// 导入与HTTP请求和响应相关的类
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// 导入Map接口和LinkedHashMap类,用于存储请求参数
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @Description: AOP工具类
* @Date: 2020-12-02
*/
public class AopUtils {
/**
* 获取请求参数
*
* @param joinPoint 切面连接点,可以获取方法调用的详细信息
* @return 包含非过滤对象(如HttpRequest, HttpResponse, MultipartFile)以外所有参数的Map
*/
public static Map<String, Object> getRequestParams(JoinPoint joinPoint) {
// 创建一个有序的Map来保存参数名和值
Map<String, Object> map = new LinkedHashMap<>();
// 获取方法参数名称
String[] parameterNames = ((MethodSignature) joinPoint.getSignature()).getParameterNames();
// 获取方法参数值
Object[] args = joinPoint.getArgs();
// 遍历参数名称和值
for (int i = 0; i < args.length; i++) {
// 如果参数不是需要过滤的对象(如HttpRequest, HttpResponse, MultipartFile)
if (!isFilterObject(args[i])) {
// 将参数名和值放入Map中
map.put(parameterNames[i], args[i]);
}
}
// 返回填充好的参数Map
return map;
}
/**
* 判断对象是否是需要过滤的类型(如HttpRequest, HttpResponse, MultipartFile)
*
* @param o 要检查的对象
* @return 如果是需要过滤的类型返回true,否则返回false
*/
private static boolean isFilterObject(final Object o) {
// 判断对象是否是HttpRequest, HttpResponse, MultipartFile中的一种
return o instanceof HttpServletRequest || o instanceof HttpServletResponse || o instanceof MultipartFile;
}
}