解析Jeesuite框架中mybatis拦截器的使用

何正德
2023-12-01

Jeesuite系列包含基础库、配置中心、统一认证平台、网关、快速开发平台五大部分(计划陆续开源)。提供灵活可靠的一站式解决方案、开箱即用。

其中,Jeesuite基础库提供了数据库、缓存、消息中间件、分布式定时任务、云存储等基础模块。每个组件都可以独立使用,十分方便.下面我们来看看mybatis拦截器在Jeesuite框架中的使用.

SpringBoot并没有为mybatis提供自动启动类,但是mybatis自己提供了

<dependency>
   <groupId>org.mybatis.spring.boot</groupId>
   <artifactId>mybatis-spring-boot-starter</artifactId>
   <version>1.3.0</version>
</dependency>
在这里mybatis-spring-boot-autoconfigure-1.3.0.jar!\META-INF\spring.factories
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration
在JeesuiteMybatisConfiguration配置类中实现了InitializingBean
@Configuration
@EnableConfigurationProperties(MybatisPluginProperties.class)
@ConditionalOnClass(MutiRouteDataSource.class)
@AutoConfigureAfter(MybatisAutoConfiguration.class)
public class JeesuiteMybatisConfiguration implements InitializingBean {}

所以springboot启动的时候会实例化MybatisAutoConfiguration类.

JeesuiteMybatisConfiguration还实现了afterPropertiesSet()方法.如下

if(org.apache.commons.lang3.StringUtils.isNotBlank(properties.getInterceptorHandlerClass())){
	String[] customHanlderClass = StringUtils.tokenizeToStringArray(properties.getInterceptorHandlerClass(), ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS);
	hanlders.addAll(Arrays.asList(customHanlderClass));
}
		
if (properties.isCacheEnabled()) {
	hanlders.add(CacheHandler.NAME);
}

if (properties.isRwRouteEnabled()) {
	hanlders.add(RwRouteHandler.NAME);
}

if (properties.isDbShardEnabled()) {
	hanlders.add(DatabaseRouteHandler.NAME);
}
		
if (properties.isPaginationEnabled()) {
	hanlders.add(PaginationHandler.NAME);
}

这里添加了默认的拦截器处理类.当然还可以自定义拦截器类,写在配置文件中

jeesuite.mybatis.interceptorHandlerClass=com.xxxxxx.xxxxxxx.XXXXXHandler

当然这个handler实现了InterceptorHandler接口,设置了

interceptorOrder优先级排序

当拦截器不为空时,调用setInterceptorHandlers方法初始化拦截器类,并且将拦截器加入sqlSessionFactory的配置类中,至此拦截器配置完成.

JeesuiteMybatisInterceptor interceptor = new JeesuiteMybatisInterceptor();
interceptor.setMapperLocations(mapperLocations);
interceptor.setInterceptorHandlers(org.apache.commons.lang3.StringUtils.join(hanlders.toArray(), ","));
sqlSessionFactory.getConfiguration().addInterceptor(interceptor);

其中JeesuiteMybatisInterceptor是实现了

implements Interceptor,InitializingBean,DisposableBean,ApplicationContextAware

调用时将所有拦截器添加到了

List<InterceptorHandler> interceptorHandlers = new ArrayList<>();

并且按照优先级interceptorOrder参数排序.

mybatis拦截器起作用的关键就是:给sqlSessionFactory添加拦截器

@Configuration
public class AutoSetConfiguration {
    @Autowired
    private SqlSessionFactory sqlSessionFactory;

    public AutoSetConfiguration() {
    }

    @PostConstruct
    public void init() {
        // 给sqlSessionFactory添加拦截器
        this.sqlSessionFactory.getConfiguration().addInterceptor(new XXXXInterceptor());
    }
}

 类似资料: