后端代码解析工具篇(util)Aoputils

Aoputils工具类

在这里插入图片描述

实现功能

getRequestParams(JoinPoint) Map<String,Object>:该方法用于获取请求参数,并将它们映射为一个键值对集合。其中,JoinPoint表示切入点,Map<String,Object>用于存储参数的键值对。

isFilterObject(Object) boolean:该方法用于判断对象是否满足特定的条件或过滤器。如果对象满足条件,则返回true;否则,返回false。

简单来说,这个工具类提供了一个静态方法getRequestParams,它接受一个JoinPoint对象,通过这个对象可以获取到方法调用的参数信息。该方法会遍历所有的参数,并使用isFilterObject方法排除掉HttpServletRequestHttpServletResponseMultipartFile类型的参数。剩下的参数会被放入一个有序的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;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值