10 插件开发
插件开发
插件原理
在四大对象创建的时候
1、每个创建出来的对象不是直接返回的,而是调用 interceptorChain.pluginAll(parameterHandler);
2、获取到所有的 Interceptor(拦截器)(插件需要实现的接口) 调用interceptor.plugin(target);
返回target包装后的对象
3、插件机制 我们可以使用插件为目标对象创建一个代理对象 AOP(面向切面)* 我们的插件可以为四大对象创建出代理对象 代理对象就可以拦截到四大对象的每一个执行
public Object pluginAll(Object target) {
for (Interceptor interceptor : interceptors) {
target = interceptor.plugin(target);
}
return target;
}
插件编写
1、编写Interceptor的实现类
2、使用 @Interceptors注解完成插件签名
3、将写好的插件注册到全局配置文件中
/*
* 完成插件签名
* 告诉mybatis当前插件用来拦截哪个对象的哪个方法
* */
@Intercepts(
{
@Signature(type = StatementHandler.class,method = "parameterize",args = java.sql.Statement.class)
})
public class MyFirstPlugin implements Interceptor {
/*
* intercept:拦截
* 拦截目标对象的目标方法的执行
* */
@Override
public Object intercept(Invocation invocation) throws Throwable {
//执行目标方法
Object proceed = invocation.proceed();
//返回执行后的返回值
return proceed;
}
/*
* plugin:
* 包装目标对象:包装:为目标对象创建一个代理对象
* */
@Override
public Object plugin(Object o) {
//我们可以借助plug的wrp方法来使用当前的Interceptor包装我们的目标对象
Object wrap = Plugin.wrap(o, this);
//返回为当前 o 创建的动态代理
return wrap;
}
/*
* setProperties:
* 将插件注册时的property属性设置进来
*
* */
@Override
public void setProperties(Properties properties) {
System.out.println("插件配置的信息"+properties);
}
}
<!-- plugins:注册插件 -->
<plugins>
<plugin interceptor="com.atguigu.mybatis.dao.MyFirstPlugin">
<property name="username" value="root"/>
<property value="password" name="1234565"/>
</plugin>
</plugins>
多个插件运行流程
插件开发
@Override
public Object intercept(Invocation invocation) throws Throwable {
//动态的改变一下sql运行的参数:以前查询1号员工,实际从数据库查询3号员工
Object target = invocation.getTarget();
System.out.println("当前拦截到的对象:" + target);
//拿到:StatementHandler ==> ParameterHandler===> parameterObject
//拿到target的元数据
MetaObject metaObject = SystemMetaObject.forObject(target);
Object value = metaObject.getValue("parameterHandler.parameterObject");
System.out.println("sql语句用的参数是" + value);
//修改完sql语句要用的参数
metaObject.setValue("parameterHandler.parameterObject",11);
//执行目标方法
Object proceed = invocation.proceed();
//返回执行后的返回值
return proceed;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)