public interface Interceptor {
//核心拦截逻辑
Object intercept(Invocation invocation) throws Throwable;
//拦截器链
default Object plugin(Object target) {return Plugin.wrap(target, this);}
//自定义配置文件操作
default void setProperties(Properties properties) { }
}
因此,参考官方文档的示例,我们自定义一个入参加密拦截器。
@Intercepts 注解开启拦截器,@Signature 注解定义拦截器的实际类型。
@Signature中
-
type 属性指定当前拦截器使用StatementHandler 、ResultSetHandler、ParameterHandler,Executor的一种
-
method 属性指定使用以上四种类型的具体方法(可进入class内部查看其方法)。
-
args 属性指定预编译语句
此处我们使用了 ParameterHandler.setParamters()方法,拦截mapper.xml中paramsType的实例(即在每个含有paramsType属性mapper语句中,都执行该拦截器,对paramsType的实例进行拦截处理)
/**
* 加密拦截器
* 注意@Component注解一定要加上
* @author : tanzj
* @date : 2020/1/19.
*/
@Slf4j
@Component
@Intercepts({
@Signature(type = ParameterHandler.class, method = “setParameters”, args = PreparedStatement.class),
})
public class EncryptInterceptor implements Interceptor {
private final EncryptDecryptUtil encryptUtil;
@Autowired
public EncryptInterceptor(EncryptDecryptUtil encryptUtil) {
this.encryptUtil = encryptUtil;
}
@Override
@Override
public Object intercept(Invocation invocation) throws Throwable {
//@Signature 指定了 type= parameterHandler 后,这里的 invocation.getTarget() 便是parameterHandler
//若指定ResultSetHandler ,这里则能强转为ResultSetHandler
ParameterHandler parameterHandler = (ParameterHandler) invocation.getTarget();
// 获取参数对像,即 mapper 中 paramsType 的实例
Field parameterField = parameterHandler.getClass().getDeclaredField(“parameterObject”);
parameterField.setAccessible(true);