mybatis拦截器原理,mybatis拦截器使用
拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,或者丢弃这些被拦截的方法而执行自己的逻辑。
写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用
如对于框架的遗嘱执行人,有几种实现:批处理执行程序、重用执行程序、简单执行程序和缓存执行器当这几种执行者接口的询问方法无法满足我们的要求的时候,我们就可以建立一个拦截器来实现自己的询问方法;拦截器一般采用面向切面编程(面向方面的编程的缩写)动态实现。
拦截器原理
对于我的巴蒂斯,我们可以通过拦截机接口定义自己的拦截器拦截器。接口定义:
包org。阿帕奇。伊巴提斯。插件;
导入Java。util。属性;
公共接口拦截器{
对象拦截(调用调用)抛出可投掷的
对象插件(对象目标);
void setProperties(属性属性);
}插件方法主要是用于封装目标对象,通过该方法我们可以决定是否要进行拦截进而决定返回什么样的目标对象。
拦截方法就是要进行拦截的时候执行的方法设置属性主要用于在配置文件中指定属性,这个方法在配置初始化当前的拦截机时就会执行。在框架中有一个插件类,该类包括静态方法包装,通过该方法可以决定需要返回的对象是目标对象还是代理。
包org。阿帕奇。伊巴提斯。插件;
导入Java。郎。反思。调用处理程序;
导入Java。郎。反思。方法;
导入Java。郎。反思。代理人;
导入Java。util。hashmap
导入Java。util。hashset
导入Java。util。地图;
导入Java。util。设置;
导入org。阿帕奇。伊巴提斯。反思。异常util
公共类插件实现InvocationHandler {
私有对象目标;
私人截击机截击机;
私有MapClass?SetMethod signatureMap
私有插件(对象目标,拦截器拦截器,MapClass?SetMethod signatureMap) {
目标=目标
拦截器=拦截器
这个。签名图=签名图;
}
公共静态对象包装(对象目标、拦截器拦截器){
//解析获取需要拦截的类以及方法{*}
MapClass?设置方法signatureMap=getSignatureMap(拦截器);
班级?类型=目标。getclass();
//解析类型是否存在需要拦截的接口{*}
班级?[]interfaces=getAllInterfaces(类型,签名映射);
//决定返回的对象是否为代理{*}
if (interfaces.length 0) {
return Proxy.newProxyInstance(
type.getClassLoader(),
接口,
新插件(目标、拦截器、签名映射));
}
//返回原目标对象
返回目标;
}
公共对象调用(对象代理、方法方法、对象[]参数)抛出可投掷的
尝试{
设置方法方法=签名映射。get(方法。getdeclaringclass());
//如果当前执行的方法是定义的需要拦截的方法,则把目标对象,要拦截的方法以及参数封装为一个祈祷对象传递给拦截器方法拦截;
//调用中定义了定义了一个开始方法,其逻辑就是调用当前方法,所以如果在拦截中需要继续调用当前方法的话可以调用祈祷的procced方法;
如果(方法!=null methods.contains(方法)){
return interceptor.intercept(新调用(target,method,args));
}
返回method.invoke(target,args);
} catch(异常e) {
抛出异常。不可超越的(e);
}
}
//根据注解解析需要拦截的方法
//两个重要的注解:@次拦截以及其值其值@签名(一个数组)
//@截距用于表明当前的对象是一个拦截机
//@签名则表明要拦截的接口、方法以及对应的参数类型。
私有静态MapClass?SetMethod getSignatureMap(拦截器拦截器){
拦截拦截注释=拦截器。getclass().获取注释(截取。类);
if(interceptsAnnotation==null){//问题#251
抛出新的PluginException(在拦截者的拦截者。getclass()中找不到@截距批注. getName());
}
signature[]sigs=interceptsannotation。value();
MapClass?set方法签名map=new hashmap类?set方法();
对于(签名签名:签名){
设置方法方法=签名映射。获取(签名。type());
if (methods==null) {
methods=new hashset方法();
signatureMap.put(sig.type(),方法);
}
尝试{
方法method=sig.type()。getMethod(sig.method()、sig。args());
方法.添加(方法);
} catch(NoSuchMethodException e){
抛出新的PluginException(在名为sig.method()的sig.type()上找不到方法。原因: e,e);
}
}
返回签名映射
}
私有静态类?[] getAllInterfaces(类?类型,MapClass?SetMethod signatureMap) {
SetClass?interfaces=new HashSetClass?();
而(类型!=null) {
对于(类?c : type.getInterfaces()) {
if(签名图。包含键(c)){
接口。添加(c);
}
}
类型=类型。get超类();
}
return interfaces.toArray(新类?[接口。size()]);
}
}拦截器实例
包com。我的巴蒂斯。截击机;
导入Java。SQL。连接;
导入Java。util。属性;
导入org。阿帕奇。伊巴提斯。执行人。遗嘱执行人;
导入org。阿帕奇。伊巴提斯。执行人。声明。语句处理程序;
导入org。阿帕奇。伊巴提斯。映射。映射语句;
导入org。阿帕奇。伊巴提斯。插件。截击机;
导入org。阿帕奇。伊巴提斯。插件。截距;
导入org。阿帕奇。伊巴提斯。插件。调用;
导入org。阿帕奇。伊巴提斯。插件。插件;
导入org。阿帕奇。伊巴提斯。插件。签名;
导入org。阿帕奇。伊巴提斯。会话。结果处理器;
导入org。阿帕奇。伊巴提斯。会话。行边界;
@截距({
@Signature(method=query ,type=Executor.class,args={
MappedStatement.class,Object.class,RowBounds.class,
ResultHandler.class })})
公共类测试接收器实现拦截器{
公共对象拦截(调用调用)抛出可投掷的
对象结果=调用。proceed();
返回结果;
}
公共对象插件(对象目标){
return Plugin.wrap(target,this);
}
公共空集属性(属性属性){
字符串p=属性。getproperty( property );
}
}首先用@截距标记了这是一个拦截器,通过@ Signatrue设计拦截点:拦截执行者接口中参数类型为MappedStatement、Object、RowBounds和结果处理器的询问方法;拦截方法调用祈祷的开始方法,使当前方法正常调用。
拦截器的注册
注册拦截器是通过在框架配置文件中插件元素下的插件元素来进行的,Mybatis在注册定义的拦截器时会先把对应拦截器下面的所有财产通过拦截机的设置属性方法注入。如:
插件
插件拦截器= com。我的巴蒂斯。截击机。测试拦截器
属性名称=属性值=拦截器配置/
/插件
/插件以上就是框架拦截器的详细内容,更多请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。