mybatis-plus-boot-starter自动配置文件spring.factories中配置了类com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration
在spring在创建MybatisPlusAutoConfiguration 对象时通过构造器注入Interceptor类型的对象数组。
在调用sqlSessionFactory方法创建SqlSessionFactory时会将拦截器数组interceptors设置在MybatisSqlSessionFactoryBean的plugins属性中。
在方法最后一行会调用MybatisSqlSessionFactoryBean的getObject方法,方法内部调用buildSqlSessionFactory方法创建SqlSessionFactory时将plugins拦截器加入到SqlSessionFactory对象的Configuration属性中interceptorChain属性。
这时已经将拦截器放入到SqlsessionFactory中了,在查询或者更新等操作时会通过SqlsessionFactory对象获取session。
下面再看一下DefaultSqlSessionFactory的openSession方法,次方法会调用openSessionFromDataSource方法。
Executor,configuration是不是都很熟,看newExecutor方法。
interceptorChain是不是也很熟,再跟pluginAll方法。
在这个类中还可以看到对其他三个扩展点的实现。
继续看plugin方法。target是executor,resultSetHandler,statementHandler,parameterHandler哦。是不是会调用Interceptor的pluin方法啊,所以我们做扩展时也要实现此接口。
看一下怎么实现的吧。
不用说MybatisPlusInterceptor实现了Interceptor接口了。
有意思的是plugin方法。
刚才在pluginAll方法中会调用plugin方法,在plugin方法中会创建target的代理对象Plugin。
在调用代理类Plugin的invoke方法时就调用到了MybatisPlusInterceptor的intercept方法。signatureMa是解析Interceptor实现类上的注解@Intercepts后得到的过滤条件,满足条件的方法才会执行Interceptor的intercept方法。
再看一下MybatisPlusInterceptor的intercept方法实现。
这里的InerInterceptor包含配置的分页插件。
构建分页sql。