实现一种可插拔的参数校验

news2024/11/13 9:48:48

1、概述

     仿照mybatis的二级缓存的实现方式,使用“策略模式+配置” 的方式实现一个可动态插拔的

     参数校验,便于后期扩展。

     实现方式也很简单,首先定义一个校验接口,并提供一个校验方法;每种参数校验都是实现

     了该校验接口;然后通过配置文件的方式控制各个校验子类执行的顺序。

2、具体实现

2.1、定义校验接口:

/**
 * 策略模式的父接口
 */
public interface CheckFilter {

    /**
     * 校验方法
     * @param object
     */
     void check(Object object);
}

2.2、校验接口实现类 

/****************************************************
 * 校验客户的 apikey 是否合法
 * @author lbf
 * @date 2024/9/19 14:18
 ****************************************************/
@Service(value = "apiKey")
@Slf4j
public class ApiKeyCheckFilter implements CheckFilter {

    @Override
    public void check(Object object) {
       log.info("【接口模块--校验apiKey】开始校验............");
    }
}



/****************************************************
 * 校验客户的ip是否合法
 * @author lbf
 * @date 2024/9/19 14:26
 ****************************************************/
@Service(value = "ip")
@Slf4j
public class IpCheckFilter implements CheckFilter {

    @Override
    public void check(Object object) {
        log.info("【接口模块--校验ip】开始校验............");
    }
}


/****************************************************
 * 校验客户手机号是否合法
 * @author lbf
 * @date 2024/9/19 14:32
 ****************************************************/
@Service(value = "mobile")
@Slf4j
public class MobileCheckFilter implements CheckFilter {
    @Override
    public void check(Object object) {
        log.info("【接口模块--校验客户手机号】开始校验............");
    }
}


2.3、控制执行校验的类

         

/****************************************************
 * 策略模式的上下文对象
 * @author lbf
 * @date 2024/9/19 14:48
 ****************************************************/
@Component
@RefreshScope //当配置文件被改变时,数据会自动刷新
public class CheckFilterContext {

    /**
     * todo 注意:这里是从spring ioc中获取所有类型 为 CheckFilter 的bean对象
     * 我们知道spring 中的所有bean对象全部放在ioc容器的map中,
     * 基于spring4.x 提供的反射注解,若要注入 Map 类型的bean,则只需要指定对象的类型就可以了,
     * 可以通过这种方式注入多个相同类型的bean对象,如注入 CheckFilter 的所有实现类
     */
    @Autowired
    private Map<String,CheckFilter> checkFilterMap;

    @Value("#{filters}")
    private String filters;

    /**
     * 当前方法用于管理校验链的顺序
     */
    public void handle(Object data){

        //1、拆分字符串fiters
        String[] fiterArr = filters.split(",");
        //2、遍历拆分后的数据,然后根据数组的值从checkFilterMap 中获取对应bean的值
        for(String f:fiterArr){
            CheckFilter filter = checkFilterMap.get(f);
            if(filter != null){
                //校验
                filter.check(data);
            }
        }
    }
}

2.4、配置

        在配置文件中自定义配置类的执行顺序和内容,如下图所示:

               

3、总结

      基于spring4.x 提供的反射注解,若要以 Map 形式注入多个相同类型的bean对象,则只需要指

      定对象的类型就可以了,如:注入CheckFilter接口所有的实现类的bean对象,只需要如下方式

      即可,如下图所示:

            

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2148683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端vue-实现富文本组件

1.使用wangeditor富文本编辑器 工具网站&#xff1a;https://www.wangeditor.com/v4/ 下载安装命令&#xff1a;npm i wangeditor --save 成品如下图&#xff1a; 组件实现代码 <template><div><!-- 富文本编辑器 --><div id"wangeditor">…

Recbole安装指南:步骤详解与常见问题解决方案

1.两种方式&#xff1a; 从Conda安装 如果你还没有安装Conda&#xff0c;可以安装Miniconda或完整的Anaconda。 如果你在中国大陆&#xff0c;我们推荐你使用清华镜像安装Conda。 当你完成Conda的安装后&#xff0c;你可以将RecBole安装在python 3.7的Conda环境中&#xff0…

数据结构之树(下),你真的懂吗?

数据结构入门学习&#xff08;全是干货&#xff09;——树&#xff08;下&#xff09; 1 堆 (Heap) 1.1 什么是堆 堆 (Heap) 是一种特殊的完全二叉树&#xff0c;分为最大堆和最小堆。 最大堆&#xff1a;每个节点的值都大于或等于其子节点的值&#xff0c;根节点是整个堆的…

YOLOv9改进策略【注意力机制篇】| MCAttention 多尺度交叉轴注意力

一、本文介绍 本文记录的是基于MCA注意力模块的YOLOv9目标检测改进方法研究。普通的轴向注意力难以实现长距离交互&#xff0c;不利于捕获分割任务中所需的空间结构或形状&#xff0c;而MCA注意力模块通过构建了两个并行轴向注意力之间的交互&#xff0c;更有效地利用多尺度特…

2.4 卷积2

2.4.2 复正弦波与整体方案 在2.3节中&#xff0c;我们提出了关于复正弦输入的频域输出及其意义的两个问题。为了研究这些问题&#xff0c;我们让一个具有真实脉冲响应 h [ n ] h[n] h[n]&#xff08;即 h Q [ n ] 0 h_Q[n] 0 hQ​[n]0&#xff09;的LTI系统通过输入复正弦…

数据结构(Day16)

一、学习内容 1、有关顺序表的操作&#xff08;功能函数&#xff09; 1、创建顺序表 Plist create_list(){Plist L malloc(sizeof(list)); // 为顺序表分配内存空间if(NULL L){printf("申请空间失败\n");return NULL; // 如果内存分配失败&#xff0c;返回 NU…

RTMP协议在无人机巡检中的应用场景

为什么要用无人机巡检 好多开发者对无人机巡检技术方案&#xff0c;相对陌生&#xff0c;实际上&#xff0c;无人机巡检就是利用无人机对特定区域或设施进行定期或不定期的检查。这种巡检方式相比传统的人工巡检具有显著的优势&#xff0c;包括速度快、覆盖广、风险低、准确性…

Tornado 是一个 Python 异步网络库和 web 框架

Tornado 是一个 Python 异步网络库和 web 框架&#xff0c;它最初由 FriendFeed 开发&#xff0c;后来被 Facebook 收购并开源。Tornado 因其非阻塞的 I/O 操作和优秀的性能而广受欢迎&#xff0c;特别是在需要处理大量并发连接的应用中。Tornado 的底层实现主要依赖于 Python …

神经网络通俗理解学习笔记(0) numpy、matplotlib

Numpy numpynumpy 基本介绍Ndarray对象及其创建Numpy数组的基础索引numpy数组的合并与拆分&#xff08;重要&#xff09;numpy数组的矩阵运算Numpy数组的统计运算numpy中的arg运算numpy中的神奇索引和比较 Matplotlib numpy numpy 基本介绍 numpy 大多数机器学习库都用了这个…

【Linux入门】基本指令(一)

目录 一.使用环境 二.快捷键 三. 登录与用户管理 1.ssh root[ip地址] 2.whoami 3.ls /home 4.adduser [用户名] 5.passwd [用户名] 四.目录文件操作 1.ls 2.pwd 3.cd 4.touch 5.mkdir 6.rm 7.cp 五.命令手册 一.使用环境 云服务器&#xff1a;市面上有很多&am…

Python 中的 typing 模块常见用法

typing 模块是 Python 提供的一个标准库&#xff0c;主要用于为函数、变量和类定义类型提示&#xff08;Type Hints&#xff09;&#xff0c;从而提高代码的可读性和类型安全性。虽然 Python 是动态类型语言&#xff0c;但通过 typing 模块&#xff0c;开发者可以明确指定变量和…

TMStarget学习——Functional Connectivity

今天基于结构像和功能像数据试验操作TMStarget 的第二个功能模块Functional Connectivity。参考季老师的文档PPT来学习的&#xff0c;整个处理过程蛮长的&#xff0c;可能配置原因一路上报错也比较多&#xff0c;下面还是逐步记录吧&#xff0c;后面采用连更的方式直到跑通后再…

C++ 中的继承(详细讲解)

一、继承的概念以及定义 1、继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保 持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象 程序设计的…

微波无源器件 功分器 4 一种用于天线阵列的紧凑宽带四路双极化波导功分器

摘要&#xff1a; 一种新型紧凑和高效率&#xff0c;在一个同相2x4方案(四路)显示双极化的功分器的设计和仿真被提出了&#xff0c;两个基本的正交模式TE10和TE01在四个方波导处同相输出通过使用四个3端口个四个E面和两个H面功分结构。此功分末端接了两个商用波导(WR75)端口&am…

青柠视频云——如何开启HTTPS服务?

前言 由于青柠视频云的语音对讲会使用到HTTPS服务&#xff0c;这里我们说一下如何申请证书以及如何在实战中部署并且配置使用。 一、证书申请 1、进入控制台 我们拿阿里云的免费个人证书为例&#xff0c;首先登录阿里云&#xff0c;在控制台找到数字证书管理服务&#xff0c;进…

膨胀罐选型计算和其他事项

膨胀罐&#xff0c;也称定压罐、气压罐&#xff0c;广泛应用于空调、太阳能、锅炉等暖通系统以及供水和消防设备&#xff0c;缓冲系统压力波动&#xff0c;消除水锤&#xff0c;起到稳压卸荷的作用。在空调、太阳能、锅炉、地暖等闭式循环系统中&#xff0c;膨胀罐的作用是在工…

3.数据类型

作业系统链接 Python 是一门面向对象友好的语言&#xff0c;支持多种内置数据类型&#xff0c;包括整数&#xff08;int&#xff09;、浮点数&#xff08;float&#xff09;、布尔值&#xff08;bool&#xff09;、字符串&#xff08;str&#xff09;、列表&#xff08;list&am…

直流电表如何在新能源领域进行应用

直流电表在新能源领域的应用广泛且深入&#xff0c;其高精度、实时监测和数据分析能力为新能源系统的运行、管理和优化提供了重要支持。 一、太阳能光伏发电系统 在太阳能光伏发电系统中&#xff0c;直流电表扮演着至关重要的角色。太阳能电池板将光能转化为直流电能&#xf…

.NET 一直跻身 30 大Github最活跃开源项目之列。

大家好&#xff0c;我是编程乐趣。 一直以来都在介绍.Net的热门开源项目&#xff0c;今天来说说.Net本身。 .Net在GitHub上也是一个开源项目&#xff0c;.NET 是一个由 Microsoft 和 .NET 社区共同维护的开源跨平台框架。 自 2017 年以来&#xff0c;.NET 一直是 GitHub 上最…

新手教学系列——非正常关机导致MySQL权限表(db)损坏及修复详解

在使用MySQL的过程中,我们常常会遇到一些问题,尤其是当服务器或主机非正常关机或重启时,MySQL的某些表,特别是权限表(如 mysql.db 表),可能会损坏,导致数据库无法启动或访问。这种情况对生产环境的数据库系统来说是相当严重的,因此掌握修复方法非常重要。 本篇文章将…