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;
}