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对象,只需要如下方式
即可,如下图所示: