Mybatis超具体插件机制理会,弄懂拦截器So easy
假若有N个插件,就有N个署理,每个署理都要执行上面的逻辑。这内里的层层署理要多次天生动态署理,是较量影响机能的。固然能指定插件拦截的位置,但这个是在执行要领时动态判定,初始化的时辰就是简朴的把插件包装到了全部可以拦截的处所。 因此,在编写插件时需留意以下几个原则: 不编写不须要的插件; 实现plugin要领时判定一下方针范例,是本插件要拦截的工具才执行Plugin.wrap要领,否者直接返回方针自己,这样可以镌汰方针被署理的次数。 // 若是我们只要拦截Executor工具,那么我们应该这么做 public Object plugin(final Object target) { if (target instanceof Executor) { return Plugin.wrap(target, this); } else { return target; } } Mybatis插件很强盛,可以对Mybatis框架举办很大的扩展。虽然,假如你不领略Mybatis插件的道理,开提倡来只能是模仿两可。在现实开拓进程中,我们可以参考别人写的插件。下面是一个Mybatis分页的插件,可觉得往后开拓做参考。 /** * Mybatis - 通用分页插件(假如开启二级缓存必要留意) */ @Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class}), @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})}) @Log4j public class PageHelper implements Interceptor {
public static final ThreadLocal<Page> localPage = new ThreadLocal<Page>();
/** * 开始分页 * * @param pageNum * @param pageSize */ public static void startPage(int pageNum, int pageSize) { localPage.set(new Page(pageNum, pageSize)); }
/** * 竣事分页并返回功效,该要领必需被挪用,不然localPage会一向生涯下去,直到下一次startPage * * @return */ public static Page endPage() { Page page = localPage.get(); localPage.remove(); return page; }
public Object intercept(Invocation invocation) throws Throwable { if (localPage.get() == null) { return invocation.proceed(); } if (invocation.getTarget() instanceof StatementHandler) { StatementHandler statementHandler = (StatementHandler) invocation.getTarget(); MetaObject metaStatementHandler = SystemMetaObject.forObject(statementHandler); // 疏散署理工具链(因为方针类也许被多个插件拦截,从而形成多次署理,通过下面的两次轮回 // 可以疏散出最原始的的方针类) while (metaStatementHandler.hasGetter("h")) { Object object = metaStatementHandler.getValue("h"); metaStatementHandler = SystemMetaObject.forObject(object); } // 疏散最后一个署理工具的方针类 while (metaStatementHandler.hasGetter("target")) { Object object = metaStatementHandler.getValue("target"); metaStatementHandler = SystemMetaObject.forObject(object); } (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |